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

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

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

Ограничения платформы 1С в управляемом режиме

Проанализируем работу стандартных событий управляемой формы:

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

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

Решение 1. Использование системы оповещений (Оповестить и ОбработкаОповещения)

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

Разберем реализацию по шагам:

Шаг 1. В форме, где происходит изменение данных (например, в форме редактирования справочника или документа), вызовем процедуру Оповестить:


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

Шаг 2. На фоновой управляемой форме, где требуется поддерживать данные в актуальном состоянии, добавим предопределенную процедуру ОбработкаОповещения:


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

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

Решение 2. Использование обработчиков ожидания (ПодключитьОбработчикОжидания)

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

При открытии формы подключим клиентский обработчик ожидания:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем периодическую проверку каждые 30 секунд
    ПодключитьОбработчикОжидания("ПроверитьАктуальностьДанных", 30);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьАктуальностьДанных()
    // Проверяем, нужно ли обновить форму
    ОбновитьДанныеНаСервере();
КонецПроцедуры

При закрытии формы рекомендуется отключать обработчик с помощью ОтключитьОбработчикОжидания.

Решение 3. События элементов управления (ПриПолученииФокуса)

Если необходимо обновить форму именно тогда, когда пользователь начинает взаимодействовать с ней после возвращения, можно использовать события элементов формы. Например, у полей ввода есть событие ПриПолученииФокуса, а у таблиц — ПриАктивизацииСтроки или ПриАктивизацииЯчейки.

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

Решение 4. Настройка автообновления для динамических списков

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

← На главную