Красивый код по загрузке иерархии
Гружу номенклатуру с сайта. Иерархия там задается полями category1-category6. Вот мой код, который создает группу, если не нашел ее по ID или наименованию, помещает номенклатуру в нужную группу и даже перемещает группы если их иерархия на сайте поменялась. При всей лаконичности кода он очень функционален:
//=== ЗАГРУЗКА ИЕРАРХИИ //Идем до первого незаполненного объекта-родителя idПредРодитель = 0; СсылкаПредРодитель = Неопределено; Для Инд = 1 По 6 + 1 Цикл Если Инд = 6 + 1 Тогда idРодитель = 0; Иначе idРодитель = ЧислоИзСтроки(ЭлементДанных["category" + Инд]); КонецЕсли; Если Не ЗначениеЗаполнено(idРодитель) Тогда Если ЗначениеЗаполнено(СсылкаПредРодитель) Тогда ПрисвоитьБезопасно(НоменклатураОбъект.Родитель, СсылкаПредРодитель); КонецЕсли; Прервать; Иначе //Переносим группы из группы в группу (а не только номенклатуру) НаименованиеГруппы = EntityValueByID(ТаблицаИерархииНоменклатуры, idРодитель); СсылкаРодитель = НайтиГруппуНоменклатурыПоИДНаименованию(ТаблицаИерархииНоменклатуры, idРодитель, НаименованиеГруппы); Если НЕ ЗначениеЗаполнено(СсылкаРодитель) Тогда ГО = Справочники.Номенклатура.СоздатьГруппу(); ГО.СайтИД = idРодитель; ГО.Наименование = НаименованиеГруппы; ГО.Записать(); СсылкаРодитель = ГО.Ссылка; КонецЕсли; Если ЗначениеЗаполнено(СсылкаРодитель) И ЗначениеЗаполнено(СсылкаПредРодитель) И СсылкаРодитель.Родитель <> СсылкаПредРодитель Тогда ГО = СсылкаРодитель.ПолучитьОбъект(); ПрисвоитьБезопасно(ГО.Родитель, СсылкаПредРодитель); Если ГО.Модифицированность() Тогда ГО.ОбменДанными.Загрузка = истина; ГО.Записать(); КонецЕсли; КонецЕсли; //Переходим к следующему уровню родителя СсылкаПредРодитель = СсылкаРодитель; КонецЕсли; КонецЦикла;
Поиск по ID или наименованию с приоритетом ID сделан запросом:
Функция НайтиГруппуНоменклатурыПоИДНаименованию(ТаблицаИерархииНоменклатуры, id, НаименованиеГруппы) Экспорт З = Новый Запрос( "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа | И Номенклатура.СайтИД = &СайтИД | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа | И Номенклатура.Наименование = &Наименование И &ЕстьНаименование" ); З.УстановитьПараметр("СайтИД", id); З.УстановитьПараметр("Наименование", НаименованиеГруппы); З.УстановитьПараметр("ЕстьНаименование", ЗначениеЗаполнено(НаименованиеГруппы)); Выборка = З.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.Ссылка; КонецЕсли; КонецФункции