В процессе разработки прикладных решений нередко возникает задача уведомить одного или нескольких активных пользователей о некотором событии, инициированном другим клиентом или фоновым заданием на сервере. Например, это может быть оповещение о завершении длительного расчета, запрос на согласование документа или мгновенное системное сообщение.
Рассмотрим архитектурные особенности платформы 1С:Предприятие, разберем возможные пути решения этой задачи и проанализируем преимущества и ограничения каждого подхода.
По умолчанию взаимодействие в клиент-серверной архитектуре 1С строится по классической модели «клиент запрашивает — сервер отвечает». Сервер 1С не может произвольно инициировать TCP-соединение с тонким или веб-клиентом и напрямую вызвать клиентскую процедуру без предварительного запроса со стороны этого клиента.
Для передачи оповещений в реальном времени между сеансами применяются три основных подхода: штатная Система взаимодействия, механизм периодического опроса (поллинг) и сторонние интеграции через внешние компоненты.
Начиная с версии платформы 8.3.10, в 1С:Предприятии реализована Система взаимодействия. Этот механизм позволяет не только организовывать чаты и видеозвонки между пользователями, но и программно отправлять структурированные push-уведомления и данные с сервера на клиентские приложения без блокировки интерфейса.
Разберем ключевые особенности Системы взаимодействия:
Если подключение к Системе взаимодействия невозможно по политикам безопасности или техническим причинам, классическим решением внутри платформы остается реализация поллинга.
Принцип работы заключается в том, что каждый клиентский сеанс с заданной периодичностью самостоятельно опрашивает сервер на наличие новых сообщений, адресованных текущему пользователю или сеансу.
Разберем по шагам схему реализации такого механизма:
Получатель, ДатаСообщения, ТекстСообщения, Прочитано).ПодключитьОбработчикОжидания.Посмотрим на пример подключения обработчика на клиенте:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
// Подключаем опрос каждые 30 секунд
ПодключитьОбработчикОжидания("ПроверитьВходящиеОповещения", 30, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьВходящиеОповещения() Экспорт
НовыеСообщения = ПолучитьНовыеСообщенияНаСервере();
Для Каждого ТекстСообщения Из НовыеСообщения Цикл
ПоказатьОповещениеПользователя("Новое событие", , ТекстСообщения);
КонецЦикла;
КонецПроцедуры
Ограничения метода поллинга:
Для создания высоконагруженных систем обмена сообщениями без использования Системы взаимодействия применяются внешние компоненты (ВК), работающие по протоколам WebSockets, TCP или через брокеры сообщений (RabbitMQ, Redis, MQTT).
Схема работы выглядит следующим образом:
ПодключитьОбработчикВнешнегоСобытия.Данный подход обеспечивает доставку в реальном времени, однако существенно усложняет архитектуру решения, требует поддержки стороннего ПО и может накладывать ограничения при работе через веб-клиент в различных браузерах и операционных системах.
Если конфигурация разработана на базе Библиотеки стандартных подсистем, в ней уже присутствуют готовые механизмы оповещения пользователей (например, подсистемы «Напоминания пользователей» и «Текущие дела»). Они построены на оптимизированном механизме опроса регистров и фоновых заданий, что избавляет от необходимости писать архитектуру хранения и проверки сообщений с нуля.
Для большинства современных задач на управляемых формах оптимальным выбором является штатная Система взаимодействия, так как она поддерживается платформой на уровне встроенного языка и не создает избыточной нагрузки на базу данных. Если требуется полная автономность без внешних подключений, используют периодический опрос (ПодключитьОбработчикОжидания) с оптимизированной структурой регистров или функционал подсистем БСП.