В процессе работы с внешними обработками часто возникает задача: как сделать так, чтобы при выполнении действия одним пользователем, у всех остальных, кто в этот момент работает с этой же обработкой, автоматически обновилась форма? Стандартный механизм Оповестить() работает только в рамках одного сеанса. При этом потребность в уведомлениях может выходить и за рамки интерфейса, например, когда нужен Телеграмм-Бот для контроля над дисковым пространством сервера. Давайте разберем несколько проверенных и современных способов решения этой задачи, чтобы обеспечить синхронную работу пользователей.
Это самый распространенный и надежный метод, основанный на стандартных механизмах платформы. Его суть заключается в том, что один сеанс оставляет "сообщение" в базе данных, а другие сеансы периодически проверяют, не появилось ли для них новых сообщений.
Проанализируем алгоритм по шагам:
ОповещенияМеждуСеансами. Он будет служить централизованным хранилищем событий. Структура может быть следующей:
ПриСозданииНаСервере) нужно запустить обработчик ожидания.
// В модуле формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Подключаем обработчик, который будет срабатывать каждые 5 секунд
ПодключитьОбработчикОжидания("ПроверитьОповещения", 5, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьДействие(Команда)
ВыполнитьДействиеНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьДействиеНаСервере()
// ... здесь выполняется основная логика ...
// Отправляем оповещение всем остальным
МенеджерЗаписи = РегистрыСведений.ОповещенияМеждуСеансами.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИмяСобытия = "ОбновитьДанныеНаФорме";
МенеджерЗаписи.Источник = УникальныйИдентификатор; // УникальныйИдентификатор формы
МенеджерЗаписи.Записать();
КонецПроцедуры
&НаСервере
Процедура ПроверитьОповещения()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОповещенияМеждуСеансами.Период,
| ОповещенияМеждуСеансами.ИмяСобытия
|ИЗ
| РегистрСведений.ОповещенияМеждуСеансами КАК ОповещенияМеждуСеансами
|ГДЕ
| ОповещенияМеждуСеансами.Источник <> &Источник";
Запрос.УстановитьПараметр("Источник", УникальныйИдентификатор);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
// Нашли новые оповещения. Удаляем их, чтобы не сработать повторно.
НаборЗаписей = РегистрыСведений.ОповещенияМеждуСеансами.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Источник.Установить(УникальныйИдентификатор, ВидСравнения.НеРавно);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
// Оповещаем клиентскую часть формы для обновления
Оповестить("ВыполнитьОбновлениеИнтерфейса");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ВыполнитьОбновлениеИнтерфейса" Тогда
// Здесь вызываем процедуру, которая обновляет данные на форме
ОбновитьФорму();
КонецЕсли;
КонецПроцедуры
Важные моменты:
Если в вашей инфраструктуре развернут и настроен "1С:Сервер взаимодействия", его можно использовать не только для чатов между пользователями, но и для программных уведомлений. Этот метод более современный и может быть удобнее, если оповещение должно быть заметно пользователю.
Принцип работы:
Этот способ отлично подходит, если нужно совместить автоматическое обновление и информирование пользователя. В качестве альтернативы можно организовать внешний центр оповещений в Телеграм. Однако для полностью "бесшовного" обновления интерфейса метод СВ менее удобен и требует наличия дополнительного компонента — сервера взаимодействия.
Этот метод является развитием первого способа и особенно полезен, когда операция, инициирующая оповещение, является длительной и ресурсоемкой. Чтобы не "замораживать" интерфейс пользователя, который ее запустил, основную логику выносят в фоновое задание.
Рассмотрим алгоритм:
Основное преимущество этого метода — асинхронность. Он избавляет пользователя от ожидания завершения долгих операций и является предпочтительным для тяжелых расчетов или обработок.
С развитием платформы появляются и более технологичные решения. Они могут быть сложнее в настройке, но обеспечивают наилучшую производительность и отзывчивость.
WebSocket
Начиная с версии платформы 8.3.27, в 1С появилась встроенная поддержка протокола WebSocket. Это технология, созданная для постоянного двунаправленного соединения между клиентом и сервером. В отличие от метода с обработчиком ожидания, здесь не нужно постоянно "опрашивать" сервер. Сервер сам отправляет сообщение клиенту, как только оно появляется.
Этот способ является наиболее эффективным для систем с высокими требованиями к скорости реакции интерфейса.
Внешние сервисы и Webhooks
Идея заключается в использовании внешней системы как посредника. Например, сеанс 1С отправляет HTTP-запрос (вебхук) на адрес внешнего микросервиса. Однако здесь возникает ключевая сложность: как этот микросервис доставит оповещение обратно в другие клиентские сеансы 1С? Для этого ему все равно придется использовать один из вышеописанных механизмов: либо записать данные в регистр сведений 1С, либо (что более правильно) взаимодействовать с клиентами через WebSocket. Поэтому вебхуки чаще всего являются не самостоятельным решением, а частью более сложной архитектуры.