При разработке интерфейсов на управляемых формах часто возникает задача скрыть или отфильтровать папки (группы) иерархического справочника по определенному реквизиту. Например, если в справочнике создан булев реквизит Флажок (или признак активности/видимости), разработчики пытаются установить стандартный отбор в динамическом списке: Флажок Равно Истина. Однако на практике отбор успешно применяется к элементам, а группы продолжают отображаться в списке независимо от установленного значения.
Проанализируем причины такого поведения платформы 1С:Предприятие и подробно разберем все способы решения этой задачи.
Выясним причину, заложенную в архитектуру платформы. Когда таблица формы отображает динамический список в режиме «Дерево» или «Иерархический список», механизм компоновщика настроек работает по следующим правилам:
Ниже рассмотрим основные варианты обхода этого ограничения в зависимости от поставленных бизнес-требований.
Самый быстрый способ скрыть нежелательные группы в форме — настроить системное условное оформление динамического списка. В этом случае строки, не проходящие условие, визуально перестают отображаться пользователю.
Разберем по шагам, как настроить скрытие групп через условное оформление:
Список и перейдем в свойство УсловноеОформление.Ложь).ЭтоГруппа Равно Истина И Флажок Равно Ложь (или требуемое условие скрытия).Также условное оформление можно настроить программно в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
// Настраиваем скрытие строки
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
// Условие: скрывать только группы с выключенным флажком
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоГруппа");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = Истина;
ЭлементУсловия.Использование = Истина;
ЭлементУсловияФлаг = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловияФлаг.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Флажок");
ЭлементУсловияФлаг.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловияФлаг.ПравоеЗначение = Ложь;
ЭлементУсловияФлаг.Использование = Истина;
КонецПроцедуры
Важное замечание: скрытие через условное оформление влияет только на отрисовку строк в интерфейсе. Данные по-прежнему считываются сервером. Если в скрытой группе были подчиненные элементы, которые удовлетворяют критериям отбора, они также могут стать визуально недоступными внутри свернутой родительской ветки.
Если для пользователей древовидная иерархия не является строго обязательной, самым корректным с точки зрения производительности решением является переключение таблицы в обычный линейный список.
Посмотрим на особенности этого режима:
РежимОтображения устанавливаем значение Список (вместо Дерево или Иерархический список).Если требуется жестко фильтровать группы на стороне сервера базы данных, можно переопределить запрос динамического списка.
Разберем пример реализации:
Список взведем флаг Произвольный запрос.ГДЕ:
ВЫБРАТЬ
Спр.Ссылка КАК Ссылка,
Спр.Наименование КАК Наименование,
Спр.ЭтоГруппа КАК ЭтоГруппа,
Спр.Родитель КАК Родитель,
Спр.Флажок КАК Флажок
ИЗ
Справочник.Номенклатура КАК Спр
ГДЕ
(Спр.Флажок = &ФлажокОтбора ИЛИ НЕ Спр.ЭтоГруппа)
В коде формы передадим значение параметра:
&НаСервере
Процедура УстановитьОтборПоГруппамНаСервере(ЗначениеФлага)
Список.Параметры.УстановитьЗначениеПараметра("ФлажокОтбора", ЗначениеФлага);
КонецПроцедуры
При таком подходе группы, не удовлетворяющие условию, физически не попадут в выборку. Однако следует учитывать: если родительская группа исключена запросом, все входящие в нее подчиненные элементы в режиме дерева переместятся в корень иерархии.
Мы рассмотрели особенности работы отборов в динамических списках с иерархией. Если необходимо быстро скрыть пустые папки в интерфейсе — используем условное оформление видимости. Если требуется строгая фильтрация данных без аномалий отображения структуры — переводим список в плоский режим или применяем произвольный запрос с параметрами.