Как отобразить полную иерархию справочника в виде дерева на управляемой форме?

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

При разработке интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача отображения данных в иерархическом виде. По умолчанию динамические списки в управляемых формах показывают только верхний уровень иерархии или требуют ручного раскрытия каждой группы. Рассмотрим ситуацию, когда нам необходимо вывести структуру справочника (например, меток или категорий) сразу в виде полного развернутого дерева, как если бы пользователь самостоятельно нажал на все кнопки «развернуть».

Настройка динамического списка для отображения дерева

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

Разберем по шагам, какой код необходимо добавить, например, в процедуру ПриСозданииНаСервере, чтобы список элементов автоматически принял нужный вид:


// Устанавливаем режим отображения в виде дерева
Элементы.Список.Отображение = ОтображениеТаблицы.Дерево;

// Скрываем корневой элемент, если он не несет смысловой нагрузки
Элементы.Список.ОтображатьКорень = Ложь;

// Настраиваем автоматическое раскрытие всех уровней при открытии
Элементы.Список.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;

Рассмотрим подробнее, что делает каждая из этих строк:

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

Технические нюансы и производительность

Проанализируем ситуацию с точки зрения нагрузки на систему. Важно понимать, что динамический список в 1С работает по принципу «ленивой загрузки» (lazy loading). Это означает, что данные с сервера считываются порциями, необходимыми для заполнения текущего экрана пользователя.

Когда мы устанавливаем режим РаскрыватьВсеУровни, мы сталкиваемся со следующей особенностью: на каждый узел дерева система генерирует отдельный запрос к базе данных. Если ваше дерево содержит 10-50 элементов, это пройдет незаметно. Однако, если в справочнике более 10 000 элементов, попытка «раскрыть всё» может привести к следующим проблемам:

Совет: Используйте полное раскрытие только для небольших справочников (например, настройки, метки, дерево категорий с ограниченным количеством уровней). Если данных много, лучше оставить стандартное поведение, когда пользователь раскрывает только нужные ему ветки.

Альтернативный вариант: Дерево значений

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

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

Преимущества работы с деревом значений:

Недостатки:

Особенности поиска в иерархических списках

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

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

Использование группировок как альтернативы иерархии

Иногда дерево нужно построить не по ссылке на родителя, а по значениям различных полей (например, Контрагент —> Договор —> Сделка). В этом случае мы рекомендуем использовать функционал группировок динамического списка в настройках компоновки данных.

Такое дерево строится на основе итогов запроса и зачастую работает быстрее, чем иерархия справочника, так как механизмы СКД (системы компоновки данных) оптимизируют получение таких структур одним или несколькими крупными запросами вместо множества мелких.

Подводя итог, можно сказать: отобразить полное дерево в управляемых формах можно парой строк кода, но всегда стоит оценивать объем данных, чтобы не принести в жертву отзывчивость интерфейса вашего приложения.

← На главную