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