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

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

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

Рассмотрим подробно причины такого поведения, а также разберем проверенные способы программного разворачивания узлов дерева на форме.

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

Выясним, почему динамический список не всегда сохраняет развернутое состояние строк. Объект ДинамическийСписок предназначен для считывания данных из базы порциями по мере прокрутки таблицы пользователем. Из-за этого на клиенте отсутствует полная коллекция элементов, которую можно было бы легко обойти привычным циклом.

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

Способ 1. Программный разворот узлов таблицы формы

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

У данного метода есть ключевой второй параметр — СПодчиненными (тип Булево). Если передать значение Истина, платформа развернет указанную строку вместе со всеми вложенными уровнями иерархии.

Посмотрим на пример обхода групп первого уровня и их разворачивания:


КоллекцияЭлементовДерева = Элементы.ДеревоНоменклатуры.ПолучитьЭлементы();

Для Каждого Строка Из КоллекцияЭлементовДерева Цикл
    ИдентификаторСтроки = Строка.ПолучитьИдентификатор();
    Элементы.ДеревоНоменклатуры.Развернуть(ИдентификаторСтроки, Истина);
КонецЦикла;

В ситуациях, когда таблица формы связана с динамическим списком, у которого задана основная таблица, в качестве идентификатора строки выступает ссылка на объект справочника. Для разворачивания достаточно передать ссылку на родительскую группу в метод Развернуть().

Способ 2. Использование обработчика ожидания при поиске

Проанализируем ситуацию с поиском через событие АвтоВводТекста. Если вызывать метод Развернуть() непосредственно в момент ввода текста, платформа может не успеть получить и отрисовать новые данные с сервера.

Для решения этой проблемы применяется вызов процедуры через однократный обработчик ожидания:

ПодключитьОбработчикОжидания("РазвернутьДеревоПослеОбновления", 0.1, Истина);

За задержку в 0.1 секунды динамический список успевает обновить состав строк, после чего процедура РазвернутьДеревоПослеОбновления успешно разворачивает нужные узлы.

Способ 3. Замена динамического списка на Дерево Значений

Если иерархия справочника небольшая, разберем альтернативный подход без использования динамического списка:

  1. При открытии формы на сервере формируется запрос к справочнику и результат выгружается в реквизит формы с типом ДеревоЗначений.
  2. Элемент формы связывается с этим деревом значений.
  3. Так как все данные сразу находятся в памяти на клиенте, обход всех узлов и их разворачивание с помощью Развернуть(Идентификатор, Истина) выполняется мгновенно и без повторных обращений к серверу.
← На главную