Зачастую перед разработчиком 1С встает задача по визуализации иерархических данных. Будь то необходимость вывода сложного отчета в ТабличныйДокумент или отображение структуры справочника на форме через ТабличноеПоле, подходы к решению будут существенно различаться. Давайте вместе разберем, как эффективно справиться с этой задачей.
Важно понимать, что в платформе 1С не существует «волшебной кнопки» или метода, который автоматически переносит структуру ДеревоЗначений в макет печатной формы. Нам придется реализовать алгоритм обхода структуры вручную. Оптимальным способом решения такой задачи является рекурсия.
Рассмотрим пошагово, как это реализовать:
ТабличногоДокумента область, соответствующую строке вашего дерева. Если уровни вложенности сильно отличаются по оформлению, создайте несколько областей (например, СтрокаУровень1, СтрокаУровень2).ТабличныйДокумент, а затем проверяйте наличие вложенных строк.Уровень() строки дерева. На основе этого значения можно программно увеличивать отступ слева для ячеек, что наглядно продемонстрирует пользователю структуру подчинения.Примерный алгоритм работы выглядит следующим образом:
Процедура ОбойтиДерево(СтрокиДерева, ТабДок)
Для Каждого Стр Из СтрокиДерева Цикл
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Заполнить(Стр);
// Добавляем отступ для визуализации
Область.Лево = Стр.Уровень() * 10;
ТабДок.Вывести(Область);
Если Стр.Строки.Количество() > 0 Тогда
ОбойтиДерево(Стр.Строки, ТабДок);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если ваша задача — не печать, а интерактивное отображение на форме, процесс значительно упрощается, так как ТабличноеПоле умеет работать с объектом ДеревоЗначений «из коробки». Однако, если данные необходимо получить из базы, настоятельно рекомендуем использовать механизм итогов в запросах.
Разберем, как получить иерархическую структуру с помощью запроса и вывести её на форму:
Во-первых, используйте конструкцию ИТОГИ ПО в тексте запроса. Это позволит платформе сразу выгрузить данные в нужном формате. Рассмотрим код:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|ИТОГИ ПО
| Родитель";
ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ЭлементыФормы.ТПДерево.СоздатьКолонки();
Обратите внимание на метод Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам). Именно он превращает плоский результат запроса в древовидную структуру, которую затем можно связать с ТабличнымПолем на форме. После того как вы назначили результат выгрузки (объект ДеревоЗначений) в качестве источника данных для ТабличногоПоля, вызов метода СоздатьКолонки() автоматически настроит отображение на форме. Для решения схожей задачи по визуализации произвольных табличных структур в управляемом интерфейсе подойдёт пример программного вывода таблицы значений на форму.
При работе с большими объемами данных помните о производительности:
ПЕРВЫЕ или условия в ГДЕ, если это возможно.ДинамическогоСписка (в управляемых формах), так как он работает значительно быстрее при отображении огромных справочников, подгружая данные по мере необходимости.Следуя этим простым правилам, вы сможете легко справиться с выводом любой древовидной структуры в рамках ваших задач в 1С.