Как мгновенно отправить сообщение конкретному пользователю в 1С 8.3

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе автоматизации бизнес-процессов часто возникает задача оперативного информирования: например, при нажатии кнопки в документе необходимо мгновенно доставить уведомление конкретному ответственному сотруднику. Рассмотрим подробнее основные архитектурные подходы реализации такого механизма на управляемых формах 1С:Предприятия 8.3, их преимущества и ограничения.

Вариант 1. Использование встроенной Системы взаимодействия

Штатная Система взаимодействия платформы 1С — наиболее производительный и современный способ организации мгновенной доставки сообщений без создания лишней нагрузки на базу данных. Механизм работает через технологию push-уведомлений: клиентское приложение адресата получает сигнал от сервера взаимодействия мгновенно в режиме реального времени.

Разберем по шагам, как программно отправить сообщение адресату через Систему взаимодействия:

  1. Получим идентификатор пользователя Системы взаимодействия по пользователю информационной базы.
  2. Сформируем контекстное или неконтекстное обсуждение. Если сообщение связано с конкретным документом, привяжем его через свойство КлючКонтекста.
  3. Создадим объект сообщения, заполним текст и вызовем метод записи.

Посмотрим на пример программной отправки сообщения:


// Проверим доступность системы взаимодействия в информационной базе
Если СистемаВзаимодействия.Доступна() Тогда
    
    // Получаем идентификатор текущего пользователя и адресата в Системе взаимодействия
    ИдентификаторПолучателя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ОтветственныйПользовательИБ);
    
    Если ИдентификаторПолучателя <> Неопределено Тогда
        
        // Получаем обсуждение, привязанное к объекту (например, текущему документу)
        КлючОбъекта = СистемаВзаимодействия.ПолучитьКлючКонтекста(СсылкаНаДокумент);
        Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(КлючОбъекта);
        
        // Создаем и отправляем сообщение
        НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
        НовоеСообщение.Текст = "Проверьте документ: " + Строка(СсылкаНаДокумент);
        НовоеСообщение.Получатели.Добавить(ИдентификаторПолучателя);
        
        НовоеСообщение.Записать();
        
    КонецЕсли;
    
КонецЕсли;

Важное преимущество: при использовании контекстных обсуждений уведомление не только сразу всплывает на экране у пользователя, но и сохраняется в истории переписки по данному документу. Для работы функционала требуется подключение базы к облачному сервису 1С или развертывание локального сервера 1С:Диалог.

Вариант 2. Механизмы задач и напоминаний БСП

Если в конфигурации используется Библиотека Стандартных Подсистем (БСП), проанализируем возможность применения уже готовых подсистем:

  1. Подсистема «Напоминания пользователя»: позволяет программно создать запись с определенным временем срабатывания или с привязкой к событию. Механизм сам выведет окно напоминания в клиентском сеансе адресата.
  2. Подсистема «Бизнес-процессы и задачи»: если сообщение предполагает не просто уведомление, а действие (например, «Согласовать» или «Проверить»), целесообразно программно сформировать объект ЗадачаИсполнителя с назначением на нужного пользователя.

Вариант 3. Использование регистра сведений и обработчика ожидания

Классический подход для баз, где отключена Система взаимодействия и нет БСП, заключается в записи сообщений в отдельный регистр сведений с последующим чтением на стороне клиента получателя.

Разберем структуру такого регистра сведений:

  1. Измерения: Пользователь (СправочникСсылка.Пользователи) — обязательно ведущее измерение, ИдентификаторСообщения (УникальныйИдентификатор).
  2. Ресурсы / Реквизиты: ТекстСообщения (Строка), ДатаСоздания (Дата), Прочитано (Булево), НавигационнаяСсылка (Строка).

На стороне клиента получателя при начале работы системы запускается фоновый опрос через обработчик ожидания:


// В модуле управляемого приложения при начале работы системы
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    ПодключитьОбработчикОжидания("ПроверитьВходящиеУведомления", 30);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьВходящиеУведомления()
    
    СписокСообщений = ПроверитьНовыеСообщенияНаСервере();
    
    Для Каждого СтрСообщение Из СписокСообщений Цикл
        ПоказатьОповещениеПользователя(
            "Новое уведомление",
            СтрСообщение.НавигационнаяСсылка,
            СтрСообщение.ТекстСообщения
        );
    КонецЦикла;
    
КонецПроцедуры

Ограничения и риски данного подхода:

  1. Высокая нагрузка на СУБД: если сотни пользователей одновременно каждые 10–30 секунд опрашивают таблицу регистра, это создает постоянный фоновый поток транзакций и блокировок, препятствуя переходу сеансов в спящий режим.
  2. Работа в веб-клиенте: современные браузеры «усыпляют» неактивные вкладки, из-за чего вызовы ПодключитьОбработчикОжидания могут задерживаться на несколько минут, нарушая мгновенность доставки.
  3. Для минимизации нагрузки прочитанные записи необходимо сразу удалять из регистра или индексировать таблицу строго по полям Пользователь и Прочитано.

Вариант 4. WebSockets и внешние каналы доставки

Начиная с версии платформы 8.3.20 доступен встроенный объект ВебСокетКлиент. Он позволяет организовать постоянное легкое двустороннее соединение с внешним брокером сообщений. При возникновении события в 1С сервер отправляет сигнал во внешний брокер, а тот мгновенно рассылает push-уведомление подключенным клиентам.

Если адресат может находиться вне рабочего места, надежным дополнением станет отправка уведомления через HTTP-запросы в корпоративные мессенджеры (Telegram, Mattermost) или сервис push-уведомлений мобильного клиента 1С.

Передача навигационной ссылки на документ

Чтобы адресат мог в один клик открыть нужную форму прямо из всплывающего окна, передадим в сообщение навигационную ссылку платформы:


// Формирование навигационной ссылки на сервере
СсылкаНаОбъект = ПолучитьНавигационнуюСсылку(ДокументСсылка);

При щелчке по такому оповещению платформа автоматически откроет форму соответствующего объекта в сеансе пользователя.

← На главную