1C-CodeКак сделать → Чем дерево значений отличается от таблицы значений

Дерево значений в 1С: чем отличается от таблицы и когда нужно

Тем же, чем оглавление от списка: у строки есть подчинённые строки. Колонки те же, обход другой — рекурсивный.

Код

Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Наименование");
Дерево.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Группа = Дерево.Строки.Добавить();
Группа.Наименование = "Материалы";

Позиция = Группа.Строки.Добавить();   // подчинённая строка
Позиция.Наименование = "Гвозди";
Позиция.Сумма = 500;

// обход — рекурсией
Процедура ОбойтиВетку(Строки)
	Для Каждого Строка Из Строки Цикл
		// ... работа со строкой ...
		ОбойтиВетку(Строка.Строки);      // и вглубь
	КонецЦикла;
КонецПроцедуры

Что здесь важно

1. Строки лежат в коллекции Строки, а не в самом дереве

У таблицы значений строки добавляются прямо: ТЗ.Добавить(). У дерева — Дерево.Строки.Добавить(), и у каждой строки есть своя коллекция Строки. Отсюда и рекурсия при обходе.

2. Итоги по группам считают сами

Дерево не суммирует подчинённые строки автоматически. Либо считать при обходе снизу вверх, либо строить дерево из запроса с секцией ИТОГИ — тогда группы придут уже с итогами.

3. Из запроса дерево получается сразу

Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) вернёт дерево, если в запросе есть ИТОГИ ПО. Собирать его вручную в таком случае незачем.

Где обычно спотыкаются

Дерево нужно реже, чем кажется. Если иерархия нужна только для показа на форме, часто достаточно таблицы с колонкой уровня или группировки в СКД. Рекурсивный обход легко написать так, что он зациклится на данных с испорченной иерархией — а такие в базах встречаются.

Задача на это. Прочитать приём и применить его — разные умения. В тренажёре есть задача «Дерево из плоской таблицы»: собрать иерархию из плоской выгрузки: группы — корневыми строками, товары — подчинёнными им. Решение проверяется скрытыми тестами, в том числе на краевых случаях, о которых в условии не сказано.

Решить задачу

Разобраться глубже

Другие вопросы

Как получить остатки на дату запросом в 1С Как программно провести документ в 1С Как избавиться от запроса в цикле в 1С Как добавить колонку в таблицу значений программно Как свернуть таблицу значений Как найти строку в таблице значений Как выгрузить колонку таблицы значений в массив Как превратить массив в таблицу значений Как передать таблицу значений с сервера на клиент Как отобрать строки в таблице значений Как отсортировать таблицу значений Как записать движения регистра накопления программно Чем регистр остатков отличается от регистра оборотов Как контролировать остатки при проведении документа Как добавить реквизит расширением конфигурации Как сравнить две таблицы значений Какие бывают соединения в запросе 1С и чем отличаются Как выгрузить таблицу значений в Excel Как задать условное оформление таблицы на форме