В обычных формах списков документов и справочников на стандартной командной панели присутствует кнопка «Отключить отбор» (иконка воронки с красным крестиком). Нажатие на нее по умолчанию полностью сбрасывает все пользовательские и программно установленные отборы табличного поля. Часто возникает необходимость сохранить определенный отбор (например, по текущей организации или подразделению) неизменным. Рассмотрим подробно, как решить эту задачу разными способами.
Самым простым и надежным способом защиты конкретного поля от сброса является управление его доступностью в коллекции НастройкаОтбора табличного поля.
Рассмотрим, как это работает на практике: если отключить доступность настройки отбора для нужного реквизита, то платформа при выполнении стандартной команды «Отключить отбор» пропустит данное поле и не станет снимать с него флаг использования.
// Отключаем доступность изменения отбора для конкретного реквизита
ЭлементыФормы.Список.НастройкаОтбора.Организация.Доступность = Ложь;
После выполнения этого кода пользователь не сможет сбросить отбор по организации ни кнопкой на командной панели, ни через стандартный диалог настройки отбора и сортировки.
Разберем вариант, когда требуется полностью перехватить нажатие кнопки отмены отбора и прописать собственную логику очистки полей.
Проанализируем пример программного кода для обработчика нашей кнопки:
Процедура КоманднаяПанельОтключитьОтбор(Кнопка)
// Перебираем элементы отбора и снимаем использование со всех, кроме обязательного
Для Каждого ЭлементОтбора Из Список.Отбор Цикл
Если ЭлементОтбора.Имя <> "Организация" Тогда
ЭлементОтбора.Использование = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обратите внимание: чтобы пользователи не обходили данное ограничение через контекстное меню табличного поля, следует также перекрыть контекстное меню, указав созданную командную панель в свойстве КонтекстноеМеню табличного поля.
Если необходимо контролировать факт сброса отбора и оперативно реагировать на изменение состава фильтров (например, для пересчета итогов или восстановления обязательного параметра), можно использовать обработчик события ПриПолученииДанных().
Выясним, как реализовать этот подход на примере:
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
ТекущийОтбор = ЗначениеВСтрокуВнутр(Элемент.ОтборСтрок);
Если мПоследнийОтборСтрокТоваров = Неопределено
ИЛИ мПоследнийОтборСтрокТоваров <> ТекущийОтбор Тогда
// Отбор изменился (в том числе при нажатии кнопки "Отключить отбор")
// Здесь можно восстановить нужный отбор или пересчитать итоги
мПоследнийОтборСтрокТоваров = ТекущийОтбор;
КонецЕсли;
КонецПроцедуры
Если табличное поле или динамический список формируются с использованием произвольного запроса или ПостроителяОтчета, жесткое условие фильтрации можно прописать непосредственно в секции ГДЕ самого запроса.
Условие, зафиксированное в тексте запроса, не попадает в пользовательскую коллекцию Отбор. Соответственно, стандартная кнопка «Отключить отбор» физически не сможет его отменить, так как не видит его среди элементов пользовательского интерфейса.
Помните, что отборы, настроенные на уровне формы в обычных формах, являются исключительно интерфейсным средством комфорта пользователя. Если задача состоит в разграничении прав доступа (например, запрете просмотра чужих документов), любые манипуляции на форме не обеспечивают надежной защиты. Опытный пользователь сможет обойти такие ограничение через внешние обработки. Для реального ограничения доступа к данным следует настраивать правила RLS (Row Level Security) в ролях конфигурации.