Как отправить сообщение пользователю в другой сеанс в 1С:Розница

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

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

Тем не менее решить эту задачу можно несколькими надежными путями. Проанализируем каждый из них подробнее — от штатных возможностей платформы до прикладных доработок.

Решение 1. Использование Системы взаимодействия (штатный механизм)

Начиная с версии платформы 8.3.10 в 1С появился полноценный встроенный инструмент обмена сообщениями — Система взаимодействия. Это наиболее технологичный способ, так как доставка оповещений осуществляется в режиме реального времени по технологии Push, без лишней нагрузки на базу данных.

Рассмотрим особенности механизма:

  1. Архитектура: Обмен данными происходит не напрямую через таблицы СУБД, а через внешний брокер сообщений — либо через бесплатный публичный облачный сервис 1С, либо через локально развернутый сервер 1CEIC (1C:Enterprise Interaction Communication).
  2. Лицензирование: Для подключения к базовому публичному сервису взаимодействия подписка на ИТС не требуется. Главное требование — наличие прямого выхода в интернет у сервера 1С и клиентских рабочих станций.
  3. Программная отправка: Помимо ручной переписки в чате, платформа позволяет отправлять сообщения программно через глобальный менеджер СистемаВзаимодействия.

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


// Получаем идентификатор пользователя Системы взаимодействия
ИдентификаторПолучателя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательСсылка);

Если ИдентификаторПолучателя <> Неопределено Тогда
    // Создаем невидимый или контекстный диалог
    МассивУчастников = Новый Массив;
    МассивУчастников.Добавить(ИдентификаторПолучателя);
    
    Диалог = СистемаВзаимодействия.СоздатьОбсуждение();
    Диалог.Участники = Новый Массив(МассивУчастников);
    Диалог.Записать();
    
    // Формируем и отправляем сообщение
    НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Диалог.Идентификатор);
    НовоеСообщение.Текст = "Внимание! Необходимо закрыть смену на кассе №2.";
    НовоеСообщение.Записать();
КонецЕсли;

При выполнении этого кода у пользователя-получателя на клиенте автоматически появится штатное всплывающее оповещение платформы со звуковым сигналом.

Решение 2. Использование механизма напоминаний пользователя (БСП)

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

Разберем по шагам логику работы с регистром сведений НапоминанияПользователя:

  1. В момент необходимости передачи сообщения программно создается запись в регистре сведений с указанием целевого пользователя.
  2. Время срабатывания устанавливается на текущий момент (или с минимальным смещением).
  3. Штатный обработчик ожидания БСП, запущенный на клиенте у каждого пользователя, считывает появление нового напоминания и открывает модальное или всплывающее окно со списком напоминаний.

Пример программного создания напоминания:


Запись = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
Запись.Пользователь = ЦелевойПользователь; // Ссылка на справочник Пользователи
Запись.ВремяСобытия = ТекущаяДатаСеанса();
Запись.СрокНапоминания = ТекущаяДатаСеанса();
Запись.Описание = "Срочное сообщение: пересчитайте остаток в денежном ящике!";
Запись.СпособУстановкиВремени = Перечисления.СпособыУстановкиВремениНапоминания.ВУказанноеВремя;
Запись.Записать();

Решение 3. Реализация собственного регистра сообщений и клиентского обработчика

Если требуется нестандартный дизайн окна или более строгий контроль доставки (например, фиксация факта нажатия кнопки «Прочитано»), можно реализовать простую самописную подсистему.

Разберем схему реализации:

  1. Создаем непериодический независимый регистр сведений СообщенияСеансов с измерениями Получатель, ИдентификаторСообщения и ресурсами ТекстСообщения, Прочитано (булево). Поля должны быть проиндексированы.
  2. Сеанс-отправитель создает запись в регистре с флагом Прочитано = Ложь.
  3. В модуле управляемого приложения сеанса-получателя при начале работы подключается фоновый таймер через метод ПодключитьОбработчикОжидания.
  4. Процедура-обработчик раз в определенный интервал выполняет легкий запрос к регистру и при обнаружении новых записей вызывает метод ПоказатьОповещениеПользователя или открывает отдельную управляемую форму.

Важное ограничение: Частый вызов сервера (например, каждые 3–5 секунд) десятками пользователей может создать паразитную нагрузку на СУБД. Рекомендуется устанавливать интервал опроса не менее 30–60 секунд и оптимизировать условия выборки.

Решение 4. Оповещение на уровне операционной системы (для терминальных сред)

Если пользователи 1С:Розница работают в режиме терминального сервера (RDP или RemoteApp), отправить мгновенное уведомление можно минуя саму базу данных 1С.

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

← На главную