Как сохранить нужные отборы при нажатии на кнопку «Отключить отбор» в обычных формах 1С?

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

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

Способ 1. Использование свойства «НастройкаОтбора» для отключения доступности реквизита

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

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


// Отключаем доступность изменения отбора для конкретного реквизита
ЭлементыФормы.Список.НастройкаОтбора.Организация.Доступность = Ложь;

После выполнения этого кода пользователь не сможет сбросить отбор по организации ни кнопкой на командной панели, ни через стандартный диалог настройки отбора и сортировки.

Способ 2. Замена стандартной кнопки на пользовательскую

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

  1. Открываем форму списка в режиме конфигуратора.
  2. У командной панели табличного поля снимаем флаг «Автозаполнение».
  3. Нажимаем правой кнопкой мыши по командной панели и выбираем пункт «Заполнить автоматически». Это сохранит все существующие стандартные кнопки как отдельные элементы.
  4. Заменяем стандартную кнопку «Отключить отбор» на свою пользовательскую кнопку и назначаем ей аналогичную картинку.
  5. В обработчике нажатия кнопки прописываем программную очистку только нужных элементов коллекции отбора.

Проанализируем пример программного кода для обработчика нашей кнопки:


Процедура КоманднаяПанельОтключитьОтбор(Кнопка)
    
    // Перебираем элементы отбора и снимаем использование со всех, кроме обязательного
    Для Каждого ЭлементОтбора Из Список.Отбор Цикл
        Если ЭлементОтбора.Имя <> "Организация" Тогда
            ЭлементОтбора.Использование = Ложь;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

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

Способ 3. Отслеживание изменения отбора в событии ПриПолученииДанных()

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

Выясним, как реализовать этот подход на примере:


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

КонецПроцедуры

Способ 4. Фиксация условия прямо в тексте запроса

Если табличное поле или динамический список формируются с использованием произвольного запроса или ПостроителяОтчета, жесткое условие фильтрации можно прописать непосредственно в секции ГДЕ самого запроса.

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

Важное примечание по безопасности (RLS)

Помните, что отборы, настроенные на уровне формы в обычных формах, являются исключительно интерфейсным средством комфорта пользователя. Если задача состоит в разграничении прав доступа (например, запрете просмотра чужих документов), любые манипуляции на форме не обеспечивают надежной защиты. Опытный пользователь сможет обойти такие ограничение через внешние обработки. Для реального ограничения доступа к данным следует настраивать правила RLS (Row Level Security) в ролях конфигурации.

← На главную