Как отследить изменение данных и фильтров в динамическом списке управляемой формы 1С?

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

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

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

Причина проблемы: Почему стандартного метода нет в УФ?

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

Вариант 1. Использование события ПриИзмененииПользовательскихНастроек

Рассмотрим самый простой способ — использование штатного события компоновщика настроек динамического списка. Это событие срабатывает, когда пользователь меняет настройки через форму «Настройка списка».

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


&НаКлиенте
Процедура СписокПриИзмененииПользовательскихНастроек(Элемент)
    // Метод сработает при изменении настроек в стандартном окне компоновки
    ОбновитьИтогиНаСервере();
КонецПроцедуры

Вариант 2. Контроль изменения настроек через ОбработчикОжидания

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

Для этого нам понадобится переменная в модуле формы для хранения предыдущего состояния настроек (например, в виде хеш-строки или сериализованного значения). Алгоритм следующий:

  1. При создании формы или при первом обновлении фиксируем текущие настройки.
  2. Подключаем обработчик ожидания с небольшим интервалом (1–2 секунды).
  3. В обработчике сравниваем текущие настройки с сохраненными. Если они отличаются — выполняем пересчет.

Пример реализации:


&НаСервере
Функция ПолучитьХешНастроек()
    // Сериализуем пользовательские настройки в строку для сравнения
    Возврат ЗначениеВСтрокуВнутр(Список.КомпоновщикНастроек.ПользовательскиеНастройки);
КонецФункции

&НаКлиенте
Процедура ПодключитьМониторингСписка()
    ТекущийХешНастроек = ПолучитьХешНастроек();
    ПодключитьОбработчикОжидания("ПроверитьИзменениеНастроекСписка", 2);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьИзменениеНастроекСписка()
    НовыйХеш = ПолучитьХешНастроек();
    Если НовыйХеш <> ТекущийХешНастроек Тогда
        ТекущийХешНастроек = НовыйХеш;
        // Вызываем логику обновления данных (например, расчет итогов)
        РассчитатьИтоги();
    КонецЕсли;
КонецПроцедуры

Важно: Этот метод считается «грязным», так как создает постоянную нагрузку на клиент и сервер (хоть и небольшую). Рекомендуется использовать его только в тех случаях, когда бизнес-логика критически требует актуальных данных в подвале списка.

Вариант 3. Использование механизма оповещений (ОповеститьОбИзменении)

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

В целевой форме списка мы перехватываем это событие:


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

Вариант 4. Система взаимодействия (Современный подход)

Проанализируем возможности новых версий платформы (8.3.11+). Фирма «1С» реализовала механизм СистемаВзаимодействия.ПодключитьОбработчикИзмененияДанных(). Этот метод позволяет подписаться на изменения объектов определенных типов.

Это наиболее технологичный способ «поймать» изменения в базе данных без постоянных запросов к серверу. Когда объект в базе меняется, сервер Системы взаимодействия посылает пуш-уведомление клиенту, и срабатывает назначенный обработчик. Это отлично подходит для многопользовательских систем, где важно видеть актуальные остатки или статусы в списках в реальном времени.

Особенности реализации в мобильном приложении

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

Резюме

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

← На главную