Допустим, имеется таблица с товарами и суммами, колонки приведены ниже:
— Идентификатор строки (id)
— Идентификатор строки родителя (idParent)
— Наименование (строка)
— Сумма
id |
idParent |
Наименование |
Сумма (руб.) |
1 |
|
Монитор |
5000 |
2 |
|
Мышь, клавиатура |
2000 |
3 |
|
Системный блок |
|
4 |
3 |
Материнская плата |
10000 |
5 |
3 |
Жесткий диск |
3000 |
Колонка «Наименование» не является справочником и не позволяет автоматически создать иерархию, конечно ее можно создать программно, но это трудоемко, особенно собирать суммы итогов по иерархии. Итак, нам нужно получить дерево значений без особо трудного кодирования. Для начала, создадим СКД и создадим 2 частично одинаковых выборки с данными, как показано на рисунках ниже:
Первая выборка, задающая иерархию
Вторая выборка, такая же как первая, но содержит больше колонок
Связи между выборками, образующих дерево
Структура итоговых данных — само дерево
Если посмотреть на результат в отчете, он будет выглядеть так
Ниже приведен код, позволяющий получить дерево из СКД в переменную «ДеревоЗначений»:
СхемаКомпоновкиДанных = РеквизитФормыВЗначение(«Отчет»).ПолучитьМакет(«МакетДанные»);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
НастройкиКомпоновщика = КомпоновщикНастроек.Настройки;
ПараметрыНастройки = НастройкиКомпоновщика.ПараметрыДанных;
// если нужны параметры — устанавливаем так
Параметр = ПараметрыНастройки.Элементы.Найти(«Дата»);
Параметр.Использование = Истина;
Параметр.Значение = Отчет.Дата;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщика, , , Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДеревоЗначений = Новый ДеревоЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);