Дано: табличный документ со сформированной иерархией справочника Номенклатура.
Задача: загрузить табличный документ в справочник с соблюдением иерархии.
Был вдохновлен для написания этой статьи разработкой Чтение группировок табличного документа. Немного изменил чтение табличного документа.
Вся процедура чтения и формирования иерархии поместилась вот в эти строки:
//Создать объект XDTO из табличного документа
ЗаписанныйОбъект = СериализаторXDTO.ЗаписатьXDTO(Результат);
ОписаниеЧисла = Новый ОписаниеТипов("Число");
ОписаниеСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(300,ДопустимаяДлина.Переменная));
тзИерархия = Новый ТаблицаЗначений;
тзИерархия.Колонки.Добавить("Родитель",ОписаниеЧисла);
тзИерархия.Колонки.Добавить("НачалоГруппы",ОписаниеЧисла);
тзИерархия.Колонки.Добавить("КонецГруппы",ОписаниеЧисла);
тзСправочник = Новый ТаблицаЗначений;
тзСправочник.Колонки.Добавить("Код",ОписаниеЧисла);
тзСправочник.Колонки.Добавить("Наименование",ОписаниеСтроки);
//Прочитать группы из табличного документа
ГруппыСправочника = ЗаписанныйОбъект.vg;
Для каждого ГруппаСправочника Из ГруппыСправочника Цикл
стрИерархия = тзИерархия.Добавить();
стрИерархия.Родитель = ГруппаСправочника.b - 1;
стрИерархия.НачалоГруппы = ГруппаСправочника.b;
стрИерархия.КонецГруппы = ?(Не ЗначениеЗаполнено(ГруппаСправочника.e),стрИерархия.НачалоГруппы,ГруппаСправочника.e);
КонецЦикла;
//Прочитать все данные справочника из табличного документа
ЭлементыСправочника = ЗаписанныйОбъект.rowsItem;
Для каждого ЭлементСправочника Из ЭлементыСправочника Цикл
стрСправочник = тзСправочник.Добавить();
стрСправочник.Код = ЭлементСправочника.index;
стрСправочник.Наименование = ЭлементСправочника.row.c[0].c.tl.item[0].content;
КонецЦикла;
//Передать таблицу иерархии и данных справочника в СКД, где сформировать дерево, готовое для записи в справочник
//дерево выводится в табличный документ лишь для проверки правильности формирования иерархии
//полученное дерево можно записать в справочник
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
СКД = ОбработкаОбъект.ПолучитьМакет("ФормированиеИерархии");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(СКД)));
КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ТаблицаИерархии",тзИерархия);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ТаблицаСправочника",тзСправочник);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Если при компоновке макета тип генератора задать Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), то результат можно вывести в объект ДеревоЗначений
Макет = КомпоновщикМакета.Выполнить(СКД,Настройки,,,Тип("ГенераторМакетаКомпоновкиДанных"),,);
ПроцессорКомноновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомноновки.Инициализировать(Макет,,,,,);
//для вывода результата компоновки в ДеревоЗначений, процессор вывода нужно создавать
//ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
//также необходимо создать
//ОбъектДерево = новый ДеревоЗначений;
//установить объект дерево для процессора вывода
//ПроцессорВывода.УстановитьОбъект(ОбъектДерево);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
Результат.Очистить();
ПроцессорВывода.Вывести(ПроцессорКомноновки,);
Разработка на платформе 1С:Предприятие 8.3 (8.3.17.1549).