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