В процессе автоматизации бизнес-процессов часто возникает задача оперативного информирования: например, при нажатии кнопки в документе необходимо мгновенно доставить уведомление конкретному ответственному сотруднику. Рассмотрим подробнее основные архитектурные подходы реализации такого механизма на управляемых формах 1С:Предприятия 8.3, их преимущества и ограничения.
Штатная Система взаимодействия платформы 1С — наиболее производительный и современный способ организации мгновенной доставки сообщений без создания лишней нагрузки на базу данных. Механизм работает через технологию push-уведомлений: клиентское приложение адресата получает сигнал от сервера взаимодействия мгновенно в режиме реального времени.
Разберем по шагам, как программно отправить сообщение адресату через Систему взаимодействия:
КлючКонтекста.Посмотрим на пример программной отправки сообщения:
// Проверим доступность системы взаимодействия в информационной базе
Если СистемаВзаимодействия.Доступна() Тогда
// Получаем идентификатор текущего пользователя и адресата в Системе взаимодействия
ИдентификаторПолучателя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ОтветственныйПользовательИБ);
Если ИдентификаторПолучателя <> Неопределено Тогда
// Получаем обсуждение, привязанное к объекту (например, текущему документу)
КлючОбъекта = СистемаВзаимодействия.ПолучитьКлючКонтекста(СсылкаНаДокумент);
Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(КлючОбъекта);
// Создаем и отправляем сообщение
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
НовоеСообщение.Текст = "Проверьте документ: " + Строка(СсылкаНаДокумент);
НовоеСообщение.Получатели.Добавить(ИдентификаторПолучателя);
НовоеСообщение.Записать();
КонецЕсли;
КонецЕсли;
Важное преимущество: при использовании контекстных обсуждений уведомление не только сразу всплывает на экране у пользователя, но и сохраняется в истории переписки по данному документу. Для работы функционала требуется подключение базы к облачному сервису 1С или развертывание локального сервера 1С:Диалог.
Если в конфигурации используется Библиотека Стандартных Подсистем (БСП), проанализируем возможность применения уже готовых подсистем:
ЗадачаИсполнителя с назначением на нужного пользователя.Классический подход для баз, где отключена Система взаимодействия и нет БСП, заключается в записи сообщений в отдельный регистр сведений с последующим чтением на стороне клиента получателя.
Разберем структуру такого регистра сведений:
Пользователь (СправочникСсылка.Пользователи) — обязательно ведущее измерение, ИдентификаторСообщения (УникальныйИдентификатор).ТекстСообщения (Строка), ДатаСоздания (Дата), Прочитано (Булево), НавигационнаяСсылка (Строка).На стороне клиента получателя при начале работы системы запускается фоновый опрос через обработчик ожидания:
// В модуле управляемого приложения при начале работы системы
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьВходящиеУведомления", 30);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьВходящиеУведомления()
СписокСообщений = ПроверитьНовыеСообщенияНаСервере();
Для Каждого СтрСообщение Из СписокСообщений Цикл
ПоказатьОповещениеПользователя(
"Новое уведомление",
СтрСообщение.НавигационнаяСсылка,
СтрСообщение.ТекстСообщения
);
КонецЦикла;
КонецПроцедуры
Ограничения и риски данного подхода:
ПодключитьОбработчикОжидания могут задерживаться на несколько минут, нарушая мгновенность доставки.Пользователь и Прочитано.Начиная с версии платформы 8.3.20 доступен встроенный объект ВебСокетКлиент. Он позволяет организовать постоянное легкое двустороннее соединение с внешним брокером сообщений. При возникновении события в 1С сервер отправляет сигнал во внешний брокер, а тот мгновенно рассылает push-уведомление подключенным клиентам.
Если адресат может находиться вне рабочего места, надежным дополнением станет отправка уведомления через HTTP-запросы в корпоративные мессенджеры (Telegram, Mattermost) или сервис push-уведомлений мобильного клиента 1С.
Чтобы адресат мог в один клик открыть нужную форму прямо из всплывающего окна, передадим в сообщение навигационную ссылку платформы:
// Формирование навигационной ссылки на сервере
СсылкаНаОбъект = ПолучитьНавигационнуюСсылку(ДокументСсылка);
При щелчке по такому оповещению платформа автоматически откроет форму соответствующего объекта в сеансе пользователя.