Как реализовать иерархическое отображение (дерево) в динамическом списке для справочников

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

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

Разбираем причину: почему дерево не строится автоматически

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

Рассмотрим по шагам, как правильно настроить реквизит формы типа ДинамическийСписок для работы с иерархией.

Шаг 1. Настройка основной таблицы динамического списка

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

Выполним следующие действия в конфигураторе:

  1. Откроем настройки реквизита Список (или вашего динамического списка).
  2. Найдем свойство Основная таблица.
  3. Выберем нужный справочник (например, Справочник.Номенклатура или Справочник.СкладскиеЯчейки).
  4. Если используется произвольный запрос, убедимся, что в тексте запроса выбраны все системные поля (Ссылка, Родитель, ЭтоГруппа).

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

Шаг 2. Настройка элемента формы «Таблица»

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

  1. Установим свойство Отображение в значение Дерево.
  2. В свойствах самого динамического списка (в диалоге настройки списка или программно) убедимся, что включен режим Иерархический просмотр.

Если справочник имеет иерархию групп и элементов, этих настроек достаточно для корректного отображения дерева.

Особенности работы с подчиненными справочниками

Ситуация усложняется, когда мы работаем с подчиненными справочниками (например, «Складские ячейки», подчиненные «Складам»). Выясним причину, по которой стандартное дерево может «разваливаться» в этом случае. Для подчиненных объектов платформа ожидает, что в списке будет установлен отбор по конкретному Владельцу. Если отбор не установлен, дерево может отображаться некорректно или превращаться в плоский список.

Если нам нужно видеть общее дерево по всем владельцам, рассмотрим вариант с использованием Группировок в настройках динамического списка:

  1. Зайдем в настройки динамического списка (вкладка «Настройки» в конфигураторе или через КомпоновщикНастроек).
  2. Перейдем на вкладку Группировка.
  3. Добавим поле Владелец, а внутрь него добавим группировку по полю Ссылка (с типом «Иерархия»).

Такой подход позволит имитировать дерево, где верхним уровнем будет владелец, а далее пойдет стандартная иерархия справочника.

Программная настройка иерархии

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Устанавливаем режим отображения таблицы
    Элементы.СписокСкладскиеЯчейки.Отображение = ОтображениеТаблицы.Дерево;
    
    // Включаем иерархический просмотр в динамическом списке
    СписокСкладскиеЯчейки.ИерархическийПросмотр = Истина;
    
    // Если нужно программно задать основную таблицу
    // (обычно задается в метаданных, но можно проверить)
    // СписокСкладскиеЯчейки.ОсновнаяТаблица = "Справочник.СкладскиеЯчейки";

КонецПроцедуры

Визуализация: картинки групп и элементов

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

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

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


ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Картинка", БиблиотекаКартинок.Группа);
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ЭтоГруппа");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;

Альтернатива: Дерево значений и его оптимизация

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

Рассмотрим методику «ленивой загрузки» (Lazy Loading):

  1. При открытии формы загружаем в ДеревоЗначений только корневые элементы (те, у которых Родитель.Пустая()).
  2. Для элементов-групп добавляем одну «фиктивную» пустую строку-потомок, чтобы у узла появился значок «плюс».
  3. В обработчике события ПриРазворачивании (или ПередРазворачиванием) проверяем, загружены ли данные. Если нет — удаляем фиктивную строку и считываем из базы реальных подчиненных только для этого узла.

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

Резюме

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

← На главную