Объект конфигурации 1С:Предприятие «дерево значений» представляет собой набор значений любого типа, схожий с другим часто используемым объектом — таблицей значений. Аналогично таблице значений он содержит строки и столбцы. Отличие состоит в том, что строки дерева значений имеют иерархическую структуру, т.е. подчинены друг другу.
Создание дерева значений:
Дерево=новый ДеревоЗначений;
Создание колонок:
Дерево.Колонки.Добавить(«НазваниеКолонки»);
Создание строки дерева верхнего уровня иерархии и запись информации:
Уровень0=Дерево.Строки.Добавить();
Уровень0.НазваниеКолонки=значение;
Добавление подчиненной строки:
Уровень1=Уровень0.Строки.Добавить();
Уровень1.НазваниеКолонки=значение;
Поскольку дерево значений содержит несколько уровней иерархии, то для обхода его полного обхода будет недостаточно использования цикла Для каждого. Эту задачу можно решить двумя способами: Первый способ предполагает использование нескольких циклов Для каждого, вложенных друг в друга:
Для каждого Строка0 из Дерево.Строки Цикл
Сообщить (Строка0.Колонка);
Для каждого Строка1 из Строка0.Строки Цикл
…
КонецЦикла;
КонецЦикла;
Такой способ имеет один существенный недостаток — мы должны заранее знать количество уровней иерархии дерева значений, и это количество должно быть небольшим, иначе количество вложенных циклов будет чересчур велико. В случае, если заранее неизвестно количество уровней иерархии, необходимо использовать рекурсию, а механизм обхода оформить отдельной процедурой.
Процедура ОбходДерева(Элемент)
ПодчиненныйЭлемент=Элемент.Строки;
Для каждого Строка из ПодчиненныйЭлемент Цикл
Сообщить (Строка.Колонка);
ОбходДерева(Строка);
КонецЦикла;
КонецПроцедуры;
Первый раз эту процедуру нужно вызвать из основного модуля, передав туда строку верхнего уровня дерева значений в качестве первого параметра.
Для каждого Строка из Дерево.Строки Цикл
Сообщить (Строка.Колонка);
ОбходДерева(Строка);
КонецЦикла;