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

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

При разработке интерфейсов на управляемых формах часто возникает задача скрыть или отфильтровать папки (группы) иерархического справочника по определенному реквизиту. Например, если в справочнике создан булев реквизит Флажок (или признак активности/видимости), разработчики пытаются установить стандартный отбор в динамическом списке: Флажок Равно Истина. Однако на практике отбор успешно применяется к элементам, а группы продолжают отображаться в списке независимо от установленного значения.

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

Почему стандартный отбор не скрывает группы в динамическом списке?

Выясним причину, заложенную в архитектуру платформы. Когда таблица формы отображает динамический список в режиме «Дерево» или «Иерархический список», механизм компоновщика настроек работает по следующим правилам:

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

Ниже рассмотрим основные варианты обхода этого ограничения в зависимости от поставленных бизнес-требований.

Способ 1. Использование условного оформления списка

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

Разберем по шагам, как настроить скрытие групп через условное оформление:

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

Также условное оформление можно настроить программно в обработчике ПриСозданииНаСервере:


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

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

Способ 2. Переключение режима отображения в плоский список

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

Посмотрим на особенности этого режима:

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

Способ 3. Произвольный запрос в динамическом списке

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

Разберем пример реализации:

  1. В свойствах реквизита Список взведем флаг Произвольный запрос.
  2. В тексте запроса добавим секцию фильтрации ГДЕ:

ВЫБРАТЬ
	Спр.Ссылка КАК Ссылка,
	Спр.Наименование КАК Наименование,
	Спр.ЭтоГруппа КАК ЭтоГруппа,
	Спр.Родитель КАК Родитель,
	Спр.Флажок КАК Флажок
ИЗ
	Справочник.Номенклатура КАК Спр
ГДЕ
	(Спр.Флажок = &ФлажокОтбора ИЛИ НЕ Спр.ЭтоГруппа)

В коде формы передадим значение параметра:


&НаСервере
Процедура УстановитьОтборПоГруппамНаСервере(ЗначениеФлага)
	Список.Параметры.УстановитьЗначениеПараметра("ФлажокОтбора", ЗначениеФлага);
КонецПроцедуры

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

Итоги

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

← На главную