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

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

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

Способ 1. Использование клиентского обработчика ожидания

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

Разберем по шагам базовую реализацию такого механизма:

  1. При открытии формы инициализируем запуск периодического вызова клиентской процедуры обновления.
  2. В обработчике вызываем серверную процедуру для повторной выборки и перезаполнения таблицы.
  3. При закрытии формы обязательно отключаем ранее запущенный таймер.

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


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

&НаКлиенте
Процедура ОбновитьДанныеТаблицы()
    ОбновитьДанныеТаблицыНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбновитьДанныеТаблицыНаСервере()
    // Выполняем расчет или запрос к базе и заполняем реквизит формы
    // Например: ЗначениеВРеквизитФормы(НоваяТаблица, "ТаблицаНаФорме");
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
    ОтключитьОбработчикОжидания("ОбновитьДанныеТаблицы");
КонецПроцедуры

Тонкости и подводные камни при работе с обработчиком ожидания

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

  1. Защита от наложения вызовов при долгих серверных операциях. Если выполнение серверного запроса или расчет остатков занимает продолжительное время или происходят сетевые задержки, периодический таймер может сработать повторно до завершения предыдущего вызова. Чтобы полностью исключить наложение серверных вызовов, подключим процедуру в однократном режиме с параметром Однократно = Истина, а повторный запуск таймера выполним в самом конце процедуры обновления:
    
    &НаКлиенте
    Процедура ОбновитьДанныеТаблицы()
        Попытка
            ОбновитьДанныеТаблицыНаСервере();
        Исключение
            // Логирование или обработка ошибки
        КонецПопытки;
        
        // Перезапускаем однократный таймер после успешного завершения
        ПодключитьОбработчикОжидания("ОбновитьДанныеТаблицы", 600, Истина);
    КонецПроцедуры
    
  2. Обязательное отключение таймера. В событиях формы ПриЗакрытии или ПередЗакрытием необходимо гарантированно вызывать метод ОтключитьОбработчикОжидания. Если этого не сделать, платформа продолжит попытки вызывать процедуру модуля уже уничтоженного окна, что спровоцирует ошибки времени выполнения на клиенте.
  3. Сброс фокуса и мерцание интерфейса. При полной перезаписи строк таблицы (например, через очистку и повторное заполнение или через метод ЗначениеВРеквизитФормы) сбрасывается положение курсора, теряется текущая строка и вертикальный скролл. Чтобы этого избежать, перед серверным вызовом запомним идентификатор активной строки через свойство Элементы.Таблица.ТекущаяСтрока, а после заполнения восстановим фокус на нужной строке.
  4. Конфликт с редактированием данных. Если таблица на форме предназначена не только для просмотра, но и для редактирования пользователем, внезапное срабатывание таймера очистит введенные, но еще не сохраненные строки. Проверим свойство формы Модифицированность перед обновлением, и если пользователь вносит изменения, пропустим текущую итерацию автообновления.

Способ 2. Использование динамического списка с автообновлением

Рассмотрим альтернативный вариант, когда данные в таблице не требуют ручного редактирования со стороны пользователя, а строятся на основе запроса к объектам метаданных (документам, регистрам сведений, справочникам). В такой ситуации реквизит формы с типом ТаблицаЗначений целесообразно заменить на ДинамическийСписок.

У динамического списка на управляемых формах есть встроенный механизм:

  1. В свойствах реквизита формы устанавливаем флаг Автообновление.
  2. Указываем свойство Период автообновления (значение задается в секундах).

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

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

Альтернативные архитектурные решения

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

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