Как отобразить иерархию конкретного подчиненного элемента в динамическом списке 1С 8.3?

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

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

Почему стандартный отбор «В ИЕРАРХИИ» делает динамический список пустым?

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

Когда мы накладываем стандартный отбор компоновки данных вида Ссылка В ИЕРАРХИИ &ВыбранныйЭлемент для элемента, находящегося на глубоком уровне вложенности (например, 1.1.2), SQL-запрос возвращает из базы данных исключительно сам элемент 1.1.2 и те узлы, которые находятся ниже его по иерархии (1.1.2.1, 1.1.2.2 и так далее). Родительские элементы, такие как 1 и 1.1, в данную выборку не попадают, поскольку они не удовлетворяют условию отбора.

Поскольку у платформы отсутствуют данные о вышестоящих родителях, она теряет возможность связать элемент 1.1.2 с корневым уровнем дерева. В результате цепочка связей разрывается, и платформа не может корректно отрисовать структуру интерфейса. Из-за этого динамический список отображается полностью пустым. При этом, если мы установим аналогичный отбор по корневому элементу первого уровня (например, по элементу 1), все отработает корректно, так как его родителем является пустая ссылка, и иерархическая цепочка не нарушается.

Решение проблемы с помощью свойства «РодительВерхнегоУровня»

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

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

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

Посмотрим на пример программной установки этого свойства в модуле управляемой формы при выборе значения в поле ввода:


&НаКлиенте
Процедура ВыбранныйЭлементПриИзменении(Элемент)
    
    // Устанавливаем виртуальный корень для таблицы динамического списка
    Элементы.СписокНоменклатуры.РодительВерхнегоУровня = Объект.ВыбранныйЭлемент;
    
КонецПроцедуры

Если пользователю потребуется сбросить отбор и вернуть отображение всей структуры справочника, достаточно установить данное свойство в значение Неопределено:


&НаКлиенте
Процедура СброситьФильтрИерархии(Команда)
    
    Элементы.СписокНоменклатуры.РодительВерхнегоУровня = Неопределено;
    
КонецПроцедуры

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

В чем разница между «РодительВерхнегоУровня» и «ТекущийРодитель»?

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

  1. РодительВерхнегоУровня — жестко ограничивает видимость дерева сверху. Пользователь физически не сможет подняться выше установленного элемента с помощью элементов интерфейса. Этот элемент становится для него абсолютным верхом текущей иерархии.
  2. ТекущийРодитель — переносит фокус отображения ("проваливает" пользователя) внутрь конкретной группы справочника, имитируя двойной клик мыши по папке. При этом, если у таблицы свойство ИзменятьТекущегоРодителя установлено в значение Истина, пользователь сохраняет возможность подняться на уровень выше (к истинному корню) с помощью стандартных кнопок навигации динамического списка.

Альтернативные варианты обхода проблемы (менее рекомендуемые)

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

Способ А. Динамическое условное оформление

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

  1. Сначала программным запросом определяются все группы и элементы справочника, которые не должны отображаться на экране (то есть те, которые не входят в иерархию выбранного узла).
  2. Затем эти элементы помещаются в массив, и для динамического списка программно настраивается элемент условного оформления, устанавливающий для них свойство Видимость = Ложь.

Главный минус: Этот метод критически снижает производительность системы. СУБД все равно считывает данные всех существующих элементов и групп, передает их на клиентскую сторону, и лишь затем платформа скрывает их в интерфейсе. На больших справочниках это приведет к серьезным задержкам при прокрутке и обновлении списка.

Способ Б. Отключение основной таблицы динамического списка

Если в настройках динамического списка очистить свойство ОсновнаяТаблица, то стандартный механизм построения дерева платформой отключается. В этом случае запрос начинает возвращать плоскую выборку данных. Тогда условие отбора Ссылка В ИЕРАРХИИ отработает корректно на уровне СУБД и вернет список нужных элементов.

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

Заключение

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

← На главную