В процессе автоматизации рабочих мест кассиров и менеджеров нередко возникает необходимость передать оповещение или служебное уведомление конкретному пользователю, работающему в параллельном сеансе. В типовой конфигурации 1С:Розница и платформе 1С:Предприятие 8.3 архитектура клиент-серверного взаимодействия имеет строгое ограничение: серверный вызов не может напрямую заставить клиентское приложение другого сеанса отобразить диалоговое окно или принудительно выполнить произвольный код.
Тем не менее решить эту задачу можно несколькими надежными путями. Проанализируем каждый из них подробнее — от штатных возможностей платформы до прикладных доработок.
Начиная с версии платформы 8.3.10 в 1С появился полноценный встроенный инструмент обмена сообщениями — Система взаимодействия. Это наиболее технологичный способ, так как доставка оповещений осуществляется в режиме реального времени по технологии Push, без лишней нагрузки на базу данных.
Рассмотрим особенности механизма:
СистемаВзаимодействия.Посмотрим на пример отправки текстового сообщения конкретному пользователю:
// Получаем идентификатор пользователя Системы взаимодействия
ИдентификаторПолучателя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательСсылка);
Если ИдентификаторПолучателя <> Неопределено Тогда
// Создаем невидимый или контекстный диалог
МассивУчастников = Новый Массив;
МассивУчастников.Добавить(ИдентификаторПолучателя);
Диалог = СистемаВзаимодействия.СоздатьОбсуждение();
Диалог.Участники = Новый Массив(МассивУчастников);
Диалог.Записать();
// Формируем и отправляем сообщение
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Диалог.Идентификатор);
НовоеСообщение.Текст = "Внимание! Необходимо закрыть смену на кассе №2.";
НовоеСообщение.Записать();
КонецЕсли;
При выполнении этого кода у пользователя-получателя на клиенте автоматически появится штатное всплывающее оповещение платформы со звуковым сигналом.
В конфигурацию 1С:Розница встроена Библиотека стандартных подсистем (БСП), в которой присутствует механизм напоминаний. Этот вариант отлично подходит, если в программе не настроена Система взаимодействия, но нужно стандартными средствами показать пользователю окно с сообщением.
Разберем по шагам логику работы с регистром сведений НапоминанияПользователя:
Пример программного создания напоминания:
Запись = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
Запись.Пользователь = ЦелевойПользователь; // Ссылка на справочник Пользователи
Запись.ВремяСобытия = ТекущаяДатаСеанса();
Запись.СрокНапоминания = ТекущаяДатаСеанса();
Запись.Описание = "Срочное сообщение: пересчитайте остаток в денежном ящике!";
Запись.СпособУстановкиВремени = Перечисления.СпособыУстановкиВремениНапоминания.ВУказанноеВремя;
Запись.Записать();
Если требуется нестандартный дизайн окна или более строгий контроль доставки (например, фиксация факта нажатия кнопки «Прочитано»), можно реализовать простую самописную подсистему.
Разберем схему реализации:
СообщенияСеансов с измерениями Получатель, ИдентификаторСообщения и ресурсами ТекстСообщения, Прочитано (булево). Поля должны быть проиндексированы.Прочитано = Ложь.ПодключитьОбработчикОжидания.ПоказатьОповещениеПользователя или открывает отдельную управляемую форму.Важное ограничение: Частый вызов сервера (например, каждые 3–5 секунд) десятками пользователей может создать паразитную нагрузку на СУБД. Рекомендуется устанавливать интервал опроса не менее 30–60 секунд и оптимизировать условия выборки.
Если пользователи 1С:Розница работают в режиме терминального сервера (RDP или RemoteApp), отправить мгновенное уведомление можно минуя саму базу данных 1С.
Для этого используется стандартная системная утилита Windows msg.exe, которая запускается из сеанса 1С с помощью функции ЗапуститьПриложение. Сообщение мгновенно отображается прямо поверх всех открытых окон рабочего стола терминальной сессии указанного пользователя.