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

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

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

Почему стандартное переопределение кнопок не работает надежно

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

  1. Контекстное меню: Пользователь может вызвать команду отключения отбора через контекстное меню списка документов по правой кнопке мыши.
  2. Диалог «Отбор и сортировка»: Пользователь может открыть стандартное окно настройки отбора и снять флажки активности условий вручную.
  3. Горячие клавиши платформы: Стандартные сочетания клавиш позволяют управлять фильтрацией напрямую через платформенные механизмы, полностью минуя кнопки командной панели.

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

Основное решение: метод ПодключитьОбработчикИзмененияДанных

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

Рассмотрим синтаксис данного метода:

ПодключитьОбработчикИзмененияДанных(<ИмяДанных>, <ИмяПроцедуры>, <ОтслеживатьПодчиненныеДанные>)

Разберем параметры подробнее:

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

Пошаговая реализация обработчика отбора

Подключим обработчик при инициализации формы (например, в событии ПриОткрытии) и опишем логику анализа состояния элементов отбора.

Посмотрим на пример кода подключения:


Процедура ПриОткрытии()
    // Подключаем отслеживание изменений коллекции отбора списка
    ПодключитьОбработчикИзмененияДанных("ЖурналДокументовСписок.Отбор", "ЖурналДокументовСписокПриИзмененииОтбора", Истина);
КонецПроцедуры

Теперь создадим саму процедуру обработки. Обратите внимание на важный нюанс: процедура обязана принимать ровно один параметр — строку, в которую платформа передает путь к изменившимся данным. Если объявить процедуру без параметров, платформа аварийно завершит вызов с ошибкой несоответствия количества параметров.

Разберем реализацию процедуры анализа отбора:


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

Процедура ВыполнитьДействияПриОтменеОтбора()
    // Реализация сопутствующей логики очистки
КонецПроцедуры

Альтернативные варианты и их особенности

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

  1. Событие списка «ПриПолученииДанных»: Табличное поле списка документов имеет событие ПриПолученииДанных. Однако проверять состояние отбора внутри него крайне неэффективно: данное событие вызывается непрерывно при любой прокрутке списка, получении порций строк и обновлении отображения. Нагружать его дополнительными проверками не рекомендуется из соображений производительности.
  2. Событие формы «ОбновлениеОтображения»: В модуле формы можно использовать обработчик ОбновлениеОтображения. Для этого в переменной модуля сохраняется предыдущее состояние структуры отбора, а в событии выполняется сравнение текущего состояния с сохраненным. Это рабочий вариант, однако он требует ручного управления хранением состояния и осторожности, чтобы не спровоцировать циклическое обновление интерфейса.

Ограничения механизма и переход на управляемые формы

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

В управляемых формах для решения аналогичных задач применяются другие механизмы:

  1. Отслеживание событий связанных элементов формы, если поля отбора вынесены в область быстрых пользовательских настроек;
  2. Использование серверных событий формы, связанных с компоновщиком настроек динамического списка, таких как ПриОбновленииСоставаПользовательскихНастроекНаСервере или ПриЗагрузкеПользовательскихНастроекНаСервере.

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

← На главную