В процессе разработки АРМ Оператора часто возникает задача синхронизации данных между несколькими активными пользователями. Когда один оператор перемещает заказ в другой статус или меняет его исполнителя, у остальных пользователей данные должны стать актуальными в реальном времени. Рассмотрим, как реализовать обновление динамического списка, не перезагружая всю форму целиком и не создавая избыточной нагрузки на сервер.
Одним из наиболее классических и эффективных способов является использование метода Оповестить() в сочетании с ОбработкаОповещения(). Этот механизм позволяет передавать сигналы между формами в пределах одного клиентского приложения. Однако для межсеансового взаимодействия одного лишь Оповестить недостаточно, так как он работает только внутри одного сеанса.
Для того чтобы уведомление дошло до других сеансов, нам необходимо «сообщить» о событии всем активным пользователям. Если мы не используем сторонние сервисы, логика строится следующим образом:
Обновить() для элемента управления ДинамическийСписок.Чтобы избежать постоянного принудительного обновления (polling), которое перегружает базу данных, мы можем использовать свойство Автообновление у элемента формы. Установим его в значение Истина и настроим интервал в свойстве ПериодАвтообновления.
Если ваша конфигурация поддерживает Систему взаимодействия, это становится наиболее предпочтительным «пуш-решением». Сервер 1С позволяет организовать подписку на обсуждения, через которые можно рассылать сообщения об изменениях данных.
Рассмотрим алгоритм действий:
Этот способ позволяет избежать периодических запросов, так как сервер сам «подталкивает» актуальную информацию клиентам.
В актуальных версиях Библиотеки стандартных подсистем (БСП 3.1.7 и выше) реализован штатный механизм серверных оповещений. Он является предпочтительным, так как избавляет от необходимости писать свой велосипед для обмена сообщениями между сеансами.
При использовании БСП процесс выглядит так:
Элементы.Список.Обновить().Независимо от способа оповещения, важно правильно обновлять данные. Перерисовка всей формы — это дорогая операция. Рассмотрим, как сделать обновление «легким»:
1. Использование условного оформления
Вместо удаления строки из списка программно, лучше изменить статус заказа. В Динамическом списке настройте Условное оформление, которое будет окрашивать строки с определенным статусом в серый цвет или скрывать их. Это позволяет не выполнять перестроение выборки данных при каждом мелком изменении.
2. Параметризация запроса
Вместо вызова метода Обновить(), который заставляет список перевыполнить весь запрос, попробуйте менять значения параметров запроса динамического списка. Система сама поймет, что данные изменились, и обновит только те строки, которые удовлетворяют новым параметрам:
// Пример программного изменения параметра динамического списка
Список.Параметры.УстановитьЗначениеПараметра("Статус", ПредопределенноеЗначение("Перечисления.СтатусыЗаказов.ВРаботе"));
// При установке параметра список обновится автоматически и максимально эффективно
Для реализации задачи мы рекомендуем придерживаться следующей стратегии:
ПериодаАвтообновления для динамического списка.Не забывайте, что избыточное использование Обработчиков ожидания с коротким интервалом (например, 1-2 секунды) может привести к деградации производительности сервера. Всегда старайтесь отдавать предпочтение событиям, которые инициируются сервером, а не опросу базы данных клиентом.