Имя: Пароль:
1C
1C 7.7
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
14 miki
 
25.08.11
09:10
(12) Читай как jq прошёл свой путь:
Запись данных в Excel
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;

получилось и даже не смотря на тип ячейки в экселе.
Огромное спасибо!
Основная теорема систематики: Новые системы плодят новые проблемы.