Завантажую в рос. торгівлі (ред. 921) довідник Номенклатура по оле із бази бухгалтерія ТМЦ ред. 291. В торгівлі - це 5-рівневий довідник, в бух. - 3-рівневий. Суть в коректному присвоєнні елемента-родича. пробував так:
v7 = СоздатьОбъект("V77.Application"); init = v7.Initialize(v7.RMTrade, , ""); СпрТам = v7.EvalExpr("СоздатьОбъект(""Справочник.ТМЦ"")"); СпрТам.ВыбратьЭлементы(1); СпрТам.ВключатьПодчиненные(1); СпрТам.ИспользоватьДату(ТекущаяДата(),1); //НачатьТранзакцию(); Пока (СпрТам.ПолучитьЭлемент() = 1) Цикл если СпрТам.пометкаУдаления()=1 тогда продолжить; конецесли;
наим = сокрлп(СпрТам.Наименование); род = сокрлп(спрТам.Родитель.Наименование); если СпрТам.ЭтоГруппа()=1 тогда если спрНомГр1.НайтиПоНаименованию(наим,1)=0 тогда спрНомГр1.НоваяГруппа(); спрНомГр1.Наименование=СпрТам.наименование; //спрНомГр1.Записать();
если ПустоеЗначение(род)=0 тогда если спрНомГр2.НайтиПоНаименованию(род,1)=0 тогда спрНомГр2.НоваяГруппа(); спрНомГр2.Наименование = СпрТам.наименование; спрНомГр2.Записать(); спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); иначе спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); конецесли; конецесли; спрНомГр1.Записать(); конецесли; иначе если спрНомЭл.НайтиПоНаименованию(наим,1)=0 тогда спрНомЭл.Новый(); спрНомЭл.Наименование = наим; спрНомЭл.ПолнНаименование= сокрлп(спрТам.ПолнНаименование); спрНомЭл.СтавкаНДС = глЗначениеПоУмолчанию("ОсновнаяСтавкаНДС"); //Цена0 = СпрТам.Цена_Закуп; //Цена1 = число(ВходExcel.ActiveSheet.Cells(СчетчикЦикла,8).Value); //Цена2 = число(ВходExcel.ActiveSheet.Cells(СчетчикЦикла,9).Value); если ПустоеЗначение(род)=0 тогда если спрНомГр1.НайтиПоНаименованию(род,1)=0 тогда //если спрНомГр1.НайтиПоНаименованию(род,0,1)=0 тогда спрНомГр1.НоваяГруппа(); спрНомГр1.Наименование = род; спрНомГр1.Записать(); спрНомЭл.Родитель = спрНомГр1.ТекущийЭлемент(); иначе сообщить("елемент = "+спрНомЭл.наименование); сообщить("група = "+спрНомГр1.ТекущийЭлемент()); спрНомЭл.Родитель = спрНомГр1.ТекущийЭлемент();
конецесли; конецесли; ....
а також пробував
НайтиПоНаименованию(род,0,1)
Коли відкритий довідник Номенклатура в торгівлі при завантаженні, то спочатку бачу коректно вложенні папки одна в одну - так як і в бух. При перевідкритті ієрархія злітає. Вищевказаним кодом 3-рівневий довідник ТМЦ у бух. перетворюється у 2-рівневий у торг. при такому пошуку
СпрТам.ВыбратьЭлементы(0);
+
НайтиПоНаименованию(род,0,1)
- при спробі запису елементу 3-го рівня, кричить тут
В общем из кода мало, что понятно. Но нужно следить за тем, что бы родитель и элемент были из одной базы или там или тут. и все будет гуд.
пробував ще так
спрНомГр1 = создатьОбъект("Справочник.Номенклатура"); спрНомГр2 = создатьОбъект("Справочник.Номенклатура"); спрНомЭл = создатьОбъект("Справочник.Номенклатура"); v7 = СоздатьОбъект("V77.Application"); init = v7.Initialize(v7.RMTrade, , ""); СпрТам = v7.EvalExpr("СоздатьОбъект(""Справочник.ТМЦ"")"); СпрТам.ВыбратьЭлементы(0); СпрТам.ИспользоватьДату(ТекущаяДата(),1); //НачатьТранзакцию(); Пока (СпрТам.ПолучитьЭлемент() = 1) Цикл если СпрТам.пометкаУдаления()=1 тогда продолжить; конецесли;
наим = сокрлп(СпрТам.Наименование); род = сокрлп(спрТам.Родитель.Наименование); если СпрТам.ЭтоГруппа()=1 тогда если спрНомГр1.НайтиПоНаименованию(наим,0,1)=0 тогда спрНомГр1.НоваяГруппа(); спрНомГр1.Наименование=СпрТам.наименование; //спрНомГр1.Записать();
если ПустоеЗначение(род)=0 тогда если спрНомГр2.НайтиПоНаименованию(род,0,1)=0 тогда спрНомГр2.НоваяГруппа(); спрНомГр2.Наименование = СпрТам.наименование; спрНомГр2.Записать(); спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); иначе спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); конецесли; конецесли; спрНомГр1.Записать(); конецесли; иначе если спрНомЭл.НайтиПоНаименованию(наим,0,1)=0 тогда спрНомЭл.Новый(); спрНомЭл.Наименование = наим; спрНомЭл.ПолнНаименование= сокрлп(спрТам.ПолнНаименование); спрНомЭл.СтавкаНДС = глЗначениеПоУмолчанию("ОсновнаяСтавкаНДС"); //Цена0 = СпрТам.Цена_Закуп; //Цена1 = число(ВходExcel.ActiveSheet.Cells(СчетчикЦикла,8).Value); //Цена2 = число(ВходExcel.ActiveSheet.Cells(СчетчикЦикла,9).Value); если ПустоеЗначение(род)=0 тогда если спрНомГр1.НайтиПоНаименованию(род,0,1)=0 тогда //если спрНомГр1.НайтиПоНаименованию(род,0,1)=0 тогда спрНомГр1.НоваяГруппа(); спрНомГр1.Наименование = род; спрНомГр1.Записать(); спрНомЭл.Родитель = спрНомГр1.ТекущийЭлемент(); иначе сообщить("елемент = "+спрНомЭл.наименование); сообщить("група = "+спрНомГр1.ТекущийЭлемент()); спрНомЭл.Родитель = спрНомГр1.ТекущийЭлемент();
конецесли; конецесли; ....
Завантажував при відкритому довіднику Номенклатура у торгівлі; так групи, що знаходились на другому рівні в оле-базі бух., спочатку так і завантажились на другому рівні, але після перевідкриття довідника - стали на першому рівні. І коли доходить до завантаження до елемента, що знаходиться на третьому рівні в оле-базі бух., виникає помилка у стрічці
тобто групу знаходить, але присвоїти в якості родича не дає: Цитата не верное значение реквизитаколи діло доходить до завантаження елементів 3-го рівня.
Группа: Пользователи
Сообщений: 63
Спасибо сказали: 14 раз
Рейтинг: 0
Прошу прощения вот этот полный код
спрНомГр1.ПолныйКод()
Наименование в принципе не может быть ключом. Я бы все же использовал хотя бы просто "Код", а для пущей уверенности ПолныйКод()(если кодировка в пределах подчинения).
Наименование в принципе не может быть ключом. Я бы все же использовал хотя бы просто "Код", а для пущей уверенности ПолныйКод()(если кодировка в пределах подчинения).
код також не гарантія - вже є елементи в торг., а також вводяться вручну
так от в групи, також є родич-група, але чомусь воно всі групи 2-го рівня переписує на перший рівень після перезакриття довідника, скину скріни для унаочнення завтра
Цитата(Magdych @ 20.03.12, 22:29)
Я Вам Выше предложил создать реквизит "КодСинхронизации" и в него писать кода базы источника. И у Вас перестанет болеть голова на счет синхронизации.
+1
Сообщение отредактировал mister-x - 20.03.12, 22:32
Группа: Пользователи
Сообщений: 1543
Спасибо сказали: 254 раз
Рейтинг: 0
Рефлекторна реакція на Ваш код: 1) я б не використовував вираз
спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент()
замість того :
СпрНомГр1.ИспользоватьРодителя(ВибРодич);
2) я б спробував робити це не в один проход, а декілька рівень за рівнем 3) і пошук за найменуванням дісно... ненадійний. хто зна що там попадеться. можна перевіряти що знайдений елемент це дісно елемент, і що група - дісно група. А можливо їх буде декілька з одною назвою..
Родитель Синтаксис: Родитель Назначение: Доступ к значению родительской группы выбранного элемента справочника. Атрибут может быть изменен только для объектов, созданных функцией СоздатьОбъект.
не коректно спрацьовує?
Цитата(mister-x @ 21.03.12, 11:46)
не коректно спрацьовує?
переконався - що так і є, наразі викор. конструкцію ИспользоватьРодителя - завантажує все, але ієрархія збивається
Сообщение отредактировал mister-x - 21.03.12, 12:46
, а ИспользоватьРодителя потрібно викор. тільки перед методом Новый() наразі все коректно переносить - ось код (по всьому оле-довіднику унікальні назви елементів) код
v7 = СоздатьОбъект("V77.Application"); init = v7.Initialize(v7.RMTrade, , ""); СпрТам = v7.EvalExpr("СоздатьОбъект(""Справочник.ТМЦ"")"); СпрТам.ВыбратьЭлементы(0); //СпрТам.ВключатьПодчиненные(1); СпрТам.ИспользоватьДату(ТекущаяДата(),1); //Авторучка з грипом 505 Пока СпрТам.ПолучитьЭлемент() = 1 Цикл
если СпрТам.пометкаУдаления()=1 тогда продолжить; конецесли;
наим = сокрлп(СпрТам.Наименование); род = сокрлп(спрТам.Родитель.Наименование); если СпрТам.ЭтоГруппа()=1 тогда если спрНомГр1.НайтиПоНаименованию(наим,0,1)=0 тогда спрНомГр1.НоваяГруппа(); спрНомГр1.Наименование=СпрТам.наименование; спрНомГр1.Записать();
если ПустоеЗначение(род)=0 тогда если спрНомГр2.НайтиПоНаименованию(род,0,1)=0 тогда спрНомГр2.НоваяГруппа(); спрНомГр2.Наименование = род;//СпрТам.наименование; спрНомГр2.Записать(); спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); //найдГруппа = спрНомГр2.ТекущийЭлемент(); //спрНомГр1.ИспользоватьРодителя(найдГруппа); спрНомГр1.Записать(); иначе если спрНомГр2.этоГруппа()=1 тогда спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); //найдГруппа = спрНомГр2.ТекущийЭлемент(); //спрНомГр1.ИспользоватьРодителя(найдГруппа); спрНомГр1.Записать(); иначе сообщить("Найдено одинаковое наименование: "+спрНомГр2.наименование+" у группы и элемента!"); конецесли; конецесли; конецесли; //спрНомГр1.Записать(); иначе если спрНомГр1.Родитель.Наименование <> род тогда если спрНомГр2.НайтиПоНаименованию(род,0,1)=0 тогда спрНомГр2.НоваяГруппа(); спрНомГр2.Наименование = род; //СпрТам.наименование; спрНомГр2.Записать(); спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); //найдГруппа = спрНомГр2.ТекущийЭлемент(); //спрНомГр1.ИспользоватьРодителя(найдГруппа); спрНомГр1.Записать(); иначе если спрНомГр2.этоГруппа()=1 тогда спрНомГр1.Родитель = спрНомГр2.ТекущийЭлемент(); //найдГруппа = спрНомГр2.ТекущийЭлемент(); //спрНомГр1.ИспользоватьРодителя(найдГруппа); спрНомГр1.Записать(); иначе сообщить("Найдено одинаковое наименование: "+спрНомГр2.наименование+" у группы и элемента!"); конецесли; конецесли; конецесли; конецесли; иначе если спрНомЭл.НайтиПоНаименованию(наим,0,1)=0 тогда спрНомЭл.Новый(); спрНомЭл.Наименование = наим; спрНомЭл.ПолнНаименование= сокрлп(спрТам.ПолнНаименование); спрНомЭл.СтавкаНДС = глЗначениеПоУмолчанию("ОсновнаяСтавкаНДС");
если ПустоеЗначение(род)=0 тогда если спрНомГр1.НайтиПоНаименованию(род,0,1)=0 тогда //если спрНомГр1.НайтиПоНаименованию(род,0,1)=0 тогда спрНомГр1.НоваяГруппа(); спрНомГр1.Наименование = род; спрНомГр1.Записать(); спрНомЭл.Родитель = спрНомГр1.ТекущийЭлемент(); //найдГруппа = спрНомГр1.ТекущийЭлемент(); //спрНомЭл.ИспользоватьРодителя(найдГруппа); спрНомЭл.Записать(); иначе //сообщить("элемент = "+спрНомЭл.наименование); //сообщить("группа = "+спрНомГр1.ТекущийЭлемент());
если спрНомГр1.этоГруппа()=1 тогда спрНомЭл.Родитель = спрНомГр1.ТекущийЭлемент(); //найдГруппа = спрНомГр1.ТекущийЭлемент(); //спрНомЭл.ИспользоватьРодителя(найдГруппа); спрНомЭл.Записать(); иначе сообщить("Найдено одинаковое наименование: "+спрНомГр1.наименование+" у группы и элемента!"); конецесли; конецесли; конецесли;
//если спрТам.ВидТМЦ.Идентификатор() = v7.перечисление.ВидыТМЦ.Товар.Идентификатор() тогда //v7.evalexpr("перечисление.ВидыТМЦ.Товар") тогда //; "ТОВАР" тогда // спрНомЭл.ВидНоменклатуры = перечисление.ВидыТМЦ.Товар; // //иначеесли спрТам.ВидТМЦ.Идентификатор() = v7.перечисление.ВидыТМЦ.Продукция.Идентификатор() тогда //v7.evalexpr("перечисление.ВидыТМЦ.Продукция") тогда // спрНомЭл.ВидНоменклатуры = перечисление.ВидыТМЦ.Продукция; // //иначеесли спрТам.ВидТМЦ.Идентификатор() = v7.перечисление.ВидыТМЦ.Материал.Идентификатор() тогда //v7.evalexpr("перечисление.ВидыТМЦ.Материал") тогда // спрНомЭл.ВидНоменклатуры = перечисление.ВидыТМЦ.Материал; // //иначе // спрНомЭл.ВидНоменклатуры = перечисление.ВидыТМЦ.Товар; //конецесли;
//-------------------------------------------------------------------------------- СпрЕд.ИспользоватьВладельца(спрНомЭл); СпрЕд.Новый(); //Если спрТам.БазЕдиница.Идентификатор() = v7.перечисление.Единицы.кг.Идентификатор() тогда //v7.evalexpr("перечисление.Единицы.кг") тогда //КонецЕсли; океи = сокрлп(спрТам.БазЕдиница.Идентификатор()); если спрОКЕИ.НайтиПоНаименованию(океи,0,1)=0 тогда спрОКЕИ.новый(); к = 0; ок = 0; пока ок = 0 цикл попытка //дл = стрДлина(строка(к)); _код = строка(формат(к,"Ч(0)3")); спрОКЕИ.код = _код; спрОКЕИ.наименование = океи; спрОКЕИ.записать(); ок = 1; исключение к = к+1; конецпопытки; конеццикла; //спрОКЕИ.код = океи; //спрОКЕИ.наименование = океи; //спрОКЕИ.записать(); СпрЕд.ОКЕИ = спрОКЕИ.текущийЭлемент(); иначе СпрЕд.ОКЕИ = спрОКЕИ.текущийЭлемент(); конецесли; СпрЕд.Коэффициент=1; //СпрЕд.Вес=; СпрЕд.Записать(); спрНомЭл.БазоваяЕдиница=СпрЕд.ТекущийЭлемент(); спрНомЭл.ОсноВнаяЕдиница=СпрЕд.ТекущийЭлемент(); спрНомЭл.Записать();
//-------------------------------------------------------------------------------- если спрТам.Цена_Прих<>0 тогда спрЦен.ИспользоватьВладельца(спрНомЭл.ТекущийЭлемент()); спрЦен.Новый(); СпрЦен.Цена=спрТам.Цена_Прих;
//-------------------------------------------------------------------------------- если спрТам.Цена_Прод<>0 тогда спрЦен.ИспользоватьВладельца(спрНомЭл.ТекущийЭлемент()); спрЦен.Новый(); СпрЦен.Цена=спрТам.Цена_Прод;
//-------------------------------------------------------------------------------- если спрТам.Цена_Розн<>0 тогда спрЦен.ИспользоватьВладельца(спрНомЭл.ТекущийЭлемент()); спрЦен.Новый(); СпрЦен.Цена=спрТам.Цена_Розн;
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!