Как программно вывести дерево значений в табличный документ или на форму в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Зачастую перед разработчиком 1С встает задача по визуализации иерархических данных. Будь то необходимость вывода сложного отчета в ТабличныйДокумент или отображение структуры справочника на форме через ТабличноеПоле, подходы к решению будут существенно различаться. Давайте вместе разберем, как эффективно справиться с этой задачей.

Вывод дерева значений в табличный документ

Важно понимать, что в платформе 1С не существует «волшебной кнопки» или метода, который автоматически переносит структуру ДеревоЗначений в макет печатной формы. Нам придется реализовать алгоритм обхода структуры вручную. Оптимальным способом решения такой задачи является рекурсия.

Рассмотрим пошагово, как это реализовать:

  1. Подготовка макета: Создайте в макете ТабличногоДокумента область, соответствующую строке вашего дерева. Если уровни вложенности сильно отличаются по оформлению, создайте несколько областей (например, СтрокаУровень1, СтрокаУровень2).
  2. Рекурсивный обход: Создайте процедуру, которая принимает в качестве параметра текущую строку дерева. Внутри процедуры выводите данные в ТабличныйДокумент, а затем проверяйте наличие вложенных строк.
  3. Обработка иерархии: Чтобы визуально выделить уровни, используйте свойство Уровень() строки дерева. На основе этого значения можно программно увеличивать отступ слева для ячеек, что наглядно продемонстрирует пользователю структуру подчинения.

Примерный алгоритм работы выглядит следующим образом:


Процедура ОбойтиДерево(СтрокиДерева, ТабДок)
    Для Каждого Стр Из СтрокиДерева Цикл
        Область = Макет.ПолучитьОбласть("Строка");
        Область.Параметры.Заполнить(Стр);
        // Добавляем отступ для визуализации
        Область.Лево = Стр.Уровень() * 10; 
        ТабДок.Вывести(Область);
        
        Если Стр.Строки.Количество() > 0 Тогда
            ОбойтиДерево(Стр.Строки, ТабДок);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Вывод дерева значений на форму в табличное поле

Если ваша задача — не печать, а интерактивное отображение на форме, процесс значительно упрощается, так как ТабличноеПоле умеет работать с объектом ДеревоЗначений «из коробки». Однако, если данные необходимо получить из базы, настоятельно рекомендуем использовать механизм итогов в запросах.

Разберем, как получить иерархическую структуру с помощью запроса и вывести её на форму:

Во-первых, используйте конструкцию ИТОГИ ПО в тексте запроса. Это позволит платформе сразу выгрузить данные в нужном формате. Рассмотрим код:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    Номенклатура.Родитель КАК Родитель,
               |    Номенклатура.Ссылка КАК Ссылка
               |ИЗ
               |    Справочник.Номенклатура КАК Номенклатура
               |ГДЕ
               |    НЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
               |ИТОГИ ПО
               |    Родитель";

ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ЭлементыФормы.ТПДерево.СоздатьКолонки();

Обратите внимание на метод Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам). Именно он превращает плоский результат запроса в древовидную структуру, которую затем можно связать с ТабличнымПолем на форме. После того как вы назначили результат выгрузки (объект ДеревоЗначений) в качестве источника данных для ТабличногоПоля, вызов метода СоздатьКолонки() автоматически настроит отображение на форме. Для решения схожей задачи по визуализации произвольных табличных структур в управляемом интерфейсе подойдёт пример программного вывода таблицы значений на форму.

Рекомендации по оптимизации

При работе с большими объемами данных помните о производительности:

Следуя этим простым правилам, вы сможете легко справиться с выводом любой древовидной структуры в рамках ваших задач в 1С.

← На главную