![]() |
![]() |
![]() |
|
v7: Импорт из Excel в справочник по группам | ☑ | ||
---|---|---|---|---|
0
vTanke
25.08.11
✎
08:16
|
Сделал используя www.kb.mista.ru/article.php?id=410 для себя выгрузку в Excel как мне надо:
Процедура ИмпортИзЭкселя() НачатьТранзакцию(); xl=СоздатьОбъект("Excel.Application"); rows=xl.ActiveSheet.UsedRange.Rows.Count; спр=СоздатьОбъект("Справочник.Клиенты"); Для row = 1 По rows Цикл имя=СокрЛП(xl.Cells(row,1).Value); фио=СокрЛП(xl.Cells(row,2).Value); должность=СокрЛП(xl.Cells(row,3).Value); Состояние(""+row+"/"+rows+" "+имя); Если имя="" Тогда Продолжить; КонецЕсли; Если спр.НайтиПоНаименованию(имя, 0, 1)=0 Тогда спр.Новый(); спр.Наименование=имя; спр.УстановитьАтрибут("ФИО",фио); спр.УстановитьАтрибут("должность",должность); спр.Записать(); КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); Конецпроцедуры Но записи из Экселя идут естественно в корень справочника, а как сделать так, чтобы записи шли в определенную группу в справочнике? И второй вопрос: Мне еще надо импортировать в справочник "Скидки" этих же людей (т.е. переменную "имя", первый столбец Экселя), но там у поля куда я хочу их импортировать тип значения "Справочник.Клиенты", т.е. туда нельзя просто вписать клиента, а его надо выбрать из справочника "Клиенты", возможен ли импорт в таком случае? И как реализовать? |
|||
1
ДенисЧ
25.08.11
✎
08:18
|
А где поиск родителя и присваивание его?
|
|||
2
vTanke
25.08.11
✎
08:19
|
(1) А поподробнее можно?
|
|||
3
NetDozor
25.08.11
✎
08:20
|
спр.Родитель = "нужная группа"
|
|||
4
ДенисЧ
25.08.11
✎
08:26
|
(3) щаз научишь....
(2) ну вытащи из ёкселя родителя... Найди его в справочнике... Присвой... |
|||
5
vTanke
25.08.11
✎
08:30
|
(4) Найди его в справочнике... Присвой...
В том то и дело, я не знаю как... пример можете маленький:( |
|||
6
ДенисЧ
25.08.11
✎
08:31
|
Да я твоего файла-то не видел... Может, там и нет родителей вообще...
|
|||
7
miki
25.08.11
✎
08:31
|
(5)из танка-то вылези - поищи по форуму. Достаточно популярный тут вопрос.
|
|||
8
vTanke
25.08.11
✎
08:34
|
(6) у меня уже есть группа в справочнике. Из экселя мне ее брать не надо
|
|||
9
ДенисЧ
25.08.11
✎
08:37
|
(8) Так найди её, хоть по наименованию, если знаешь его...
|
|||
10
vTanke
25.08.11
✎
08:40
|
А на счет второго вопроса кто подскажет?
|
|||
11
NetDozor
25.08.11
✎
08:47
|
ты лучше почитай про поиск в справочниках и сам догадаешься как это реализовать
|
|||
12
vTanke
25.08.11
✎
09:04
|
(11)Еще б где-нибудь найти нормально написанное...(((
|
|||
13
KUBIK
25.08.11
✎
09:06
|
(12) http://1-s.jp/
|
|||
14
miki
25.08.11
✎
09:10
|
||||
15
Tatitutu
25.08.11
✎
09:18
|
http://infostart.ru/public/69253/
как рыба пойдет, бесплатна и открытым кодом |
|||
16
skunk
25.08.11
✎
09:23
|
||||
17
GANR
25.08.11
✎
09:26
|
Можно добавить в Эксель колонку "Группа" с кодом, наименованием, или GUID-ом соответствующей группы в справочнике, а затем цеплять её как-то так:
Спр.Родитель = Спр.НайтиПоНаименованию(xl.Cells(row,4).Value) ИЛИ Спр.Родитель = Спр.НайтиПоКоду(xl.Cells(row,4).Value) ИЛИ Спр.Родитель = Спр.ПолучитьСсылку(xl.Cells(row,4).Value) |
|||
18
FN
25.08.11
✎
09:29
|
(0) На форму кинь реквизит ВыбРодитель нужного типа/вида, в коде добавь
Если спр.НайтиПоНаименованию(имя, 0, 1)=0 Тогда спр.Новый(); спр.Родитель=ВыбРодитель; спр.Наименование=имя; Ну и естественно перед импортом на форме выбери нужного родителя |
|||
19
vTanke
25.08.11
✎
10:02
|
Перепробовал все способы, не могу найти как избавиться от сообщения: "Не выбран элемент". Что делаю не так опять...
В итоге проще всего оказалось (18), огромное спасибо. А на счет второго вопроса все же... Как импортировать в справочник "Скидки" этих же людей (т.е. переменную "имя", первый столбец Экселя), но там у поля куда я хочу их импортировать тип значения "Справочник.Клиенты", т.е. туда нельзя просто вписать клиента, а его надо выбрать из справочника "Клиенты", возможен ли импорт в таком случае? |
|||
20
Eugene_life
25.08.11
✎
10:10
|
(19) Импорт возможен, но сначала нужно будет найти элемент справочника, и уже его "вписывать"
|
|||
21
vTanke
25.08.11
✎
12:03
|
Большое спасибо за пояснения. В принципе разобрался и даже сделал несколько вариантов выгрузки с Экселя, но в одном варианте, когда я беру появилась какая-то чушь: с экселя нечетные строки записываются куда надо и в разные папки, а четные в корень справочника. Почему?
Процедура ИмпортИзЭкселяСРодителем() НачатьТранзакцию(); xl=СоздатьОбъект("Excel.Application"); rows=xl.ActiveSheet.UsedRange.Rows.Count; спр=СоздатьОбъект("Справочник.Клиенты"); Для row = 1 По rows Цикл имя=СокрЛП(xl.Cells(row,1).Value); фио=СокрЛП(xl.Cells(row,2).Value); родитель=СокрЛП(xl.Cells(row,3).Value); Состояние(""+row+"/"+rows+" "+имя); Если имя="" Тогда Продолжить; КонецЕсли; Если спр.НайтиПоНаименованию(имя, 0, 1)=0 Тогда спр.НайтиПоНаименованию(родитель); родитель = спр.ТекущийЭлемент(); спр.ИспользоватьРодителя(родитель); спр.Новый(); спр.Наименование=имя; спр.УстановитьАтрибут("ФИО",фио); спр.Записать(); КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); Конецпроцедуры |
|||
22
vTanke
25.08.11
✎
12:16
|
Очепятался: в одном варианте появилась какая-то чушь: когда я беру с экселя нечетные строки, то они записываются куда надо и в разные папки, а четные в корень справочника. Почему?
|
|||
23
vTanke
25.08.11
✎
13:09
|
ау
|
|||
24
NetDozor
25.08.11
✎
13:11
|
покажи код как ты выбираешь эти четные и нечетные строки тогда уж
|
|||
25
vTanke
25.08.11
✎
13:24
|
Так вот в том то и дело я не делю ничего на четное и нечетное, каким образом половина лезет в корень справочника непонятно. Текст процедуры вот:
Процедура ИмпортИзЭкселяСРодителем() НачатьТранзакцию(); xl=СоздатьОбъект("Excel.Application"); rows=xl.ActiveSheet.UsedRange.Rows.Count; спр=СоздатьОбъект("Справочник.Клиенты"); Для row = 1 По rows Цикл имя=СокрЛП(xl.Cells(row,1).Value); фио=СокрЛП(xl.Cells(row,2).Value); родитель=СокрЛП(xl.Cells(row,3).Value); Состояние(""+row+"/"+rows+" "+имя); Если имя="" Тогда Продолжить; КонецЕсли; Если спр.НайтиПоНаименованию(имя, 0, 1)=0 Тогда спр.НайтиПоНаименованию(родитель); родитель = спр.ТекущийЭлемент(); спр.ИспользоватьРодителя(родитель); спр.Новый(); спр.Наименование=имя; спр.УстановитьАтрибут("ФИО",фио); спр.Записать(); КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); Конецпроцедуры схематичный файл экселя: Иванов Иванов Иван Иваныч Завод Петров Петров Петр Петрович Завод Сидоров Сидоров Сидор Сидорович Завод Васильев Васильев Василий Васильевич Завод Получится что Иванов и Сидоров попадут в справочнике в группу "Завод", а Петров и Васильев в корень справочника, а мне надо чтобы все попали в "Завод". Как они там вообще оказались??? |
|||
26
NetDozor
25.08.11
✎
13:38
|
попробуй так:
Если спр.НайтиПоНаименованию(имя, 0, 1)=0 Тогда спр.НайтиПоНаименованию(родитель); родитель = спр.ТекущийЭлемент(); //спр.ИспользоватьРодителя(родитель); спр.Новый(); спр.Родитель = родитель; спр.Наименование=имя; спр.УстановитьАтрибут("ФИО",фио); спр.Записать(); КонецЕсли; |
|||
27
vTanke
25.08.11
✎
13:53
|
Эгегегегей!!!!
Получилося!!!! Огромное спасибо!!! А может быть подскажете заодно как решить и следующее? Клиентов я добавил в справочник.клиенты, теперь их же надо вписать в справочник.скидки, но в нем "Наименование" имеет тип значения "Справочник.Клиенты", т.е. туда нельзя просто вписать клиента, а его надо выбрать из справочника "Клиенты". Как это реализовать из того же экселевского файла? |
|||
28
KUBIK
25.08.11
✎
13:59
|
(27) но в нем "Наименование" имеет тип значения "Справочник.Клиенты" = уверен?
|
|||
29
vTanke
25.08.11
✎
14:05
|
сорри, наименования нет вообще, создан реквизит "Клиент", вот у него тип значения "Справочник.Клиенты", еще есть "Скидка", ее планирую брать также из экселя...
|
|||
30
NetDozor
25.08.11
✎
14:21
|
ну алгоритм типа такой: получешь строку екселя, ищешь в справочнике клиентов по наименованию клиента, потом в справочнике скидки ищешь элемент по реквизиту клиент, если элемент по реквизиту не найден, то добавляешь новый, а реквизиту клиент присваиваешь найденный элемент справочника клиенты
|
|||
31
NetDozor
25.08.11
✎
14:26
|
примерно так:
Процедура ИмпортИзЭкселяСРодителем() НачатьТранзакцию(); xl=СоздатьОбъект("Excel.Application"); rows=xl.ActiveSheet.UsedRange.Rows.Count; спр=СоздатьОбъект("Справочник.Клиенты"); спрСкидки=СоздатьОбъект("Справочник.Скидки"); Для row = 1 По rows Цикл имя=СокрЛП(xl.Cells(row,1).Value); фио=СокрЛП(xl.Cells(row,2).Value); родитель=СокрЛП(xl.Cells(row,3).Value); Состояние(""+row+"/"+rows+" "+имя); Если имя="" Тогда Продолжить; КонецЕсли; Если спр.НайтиПоНаименованию(имя, 0, 1)>0 Тогда Если спрСкидки.НайтиПоРеквизиту("Клиент",спр.ТекущийЭлемент()) = 0 Тогда спрСкидки.Новый(); спрСкидки.Клиент=спр.ТекущийЭлемент(); спрСкидки.Записать(); КонецЕсли; КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); Конецпроцедуры |
|||
32
vTanke
25.08.11
✎
14:35
|
(31)Спасибо, логику понял
хм выдает: Если спрСкидки.НайтиПоРеквизиту("Клиент",спр.ТекущийЭлемент()) = 0 Тогда {C:\ИМПОРТИЗEXCEL.ERT(130)}: Недостаточное число параметров передано при вызове функции/процедуры объекта А какие еще могут быть атрибуты? реквизит и значение же указано? |
|||
33
NetDozor
25.08.11
✎
14:37
|
почитай в СП про эту функцию, я примерно написал
|
|||
34
NetDozor
25.08.11
✎
14:41
|
вот так должно сработать :)
Если спрСкидки.НайтиПоРеквизиту("Клиент",спр.ТекущийЭлемент(),1) = 0 Тогда |
|||
35
vTanke
25.08.11
✎
14:42
|
(34) Неа))) уже попробовал, теперь "неверное имя реквизита"
|
|||
36
NetDozor
25.08.11
✎
14:46
|
ну смотри значит как точно называется этот реквизит в справочнике скидки
|
|||
37
vTanke
25.08.11
✎
14:47
|
(36) "Клиент" - перепроверил, это точно
|
|||
38
NetDozor
25.08.11
✎
14:52
|
а Клиент это точно реквизит справоника, может это реквизит формы
|
|||
39
vTanke
25.08.11
✎
14:59
|
(39) Угу, нашел-таки решение, оказалось надо было всего лишь нажать галочку "сортировка" в свойствах Клиента и (31) заработала, надеюсь эта галочка ничего не натворит только с базой работающей(((
Большое спасибо, NetDozor! |
|||
40
vTanke
26.08.11
✎
13:21
|
А еще один вопрос...
Как присвоить значение атрибуту, которое берется из экселя, если у атрибута тип значения "Число"? Я так понимаю, что с экселя все воспринимается как строки, как строку в число перевести? скидка=СокрЛП(xl.Cells(row,5).Value); Скидка = Число(Скидка); спрСкидка.УстановитьАтрибут("Скидка",скидка); не записывается, а если поменять в ("Скидка",скидка) допустим на ("Скидка","1"), то 1 везде проставляется, т.е. Число(Строка) здесь не срабатывает, а как тогда? |
|||
41
NetDozor
26.08.11
✎
13:34
|
а в экселе у этого поля какой формат? если числовой, то попробуй еще так без СокрЛП:
скидка=xl.Cells(row,5).Value; или так скидка=Число(xl.Cells(row,5).Value); |
|||
42
vTanke
26.08.11
✎
13:40
|
В экселе сделал тоже числовой, не помогло.
Сделал скидка=xl.Cells(row,5).Value; получилось и даже не смотря на тип ячейки в экселе. Огромное спасибо! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |