Как отправить сообщение или оповещение пользователю в 1С:Предприятие?

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

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

Вариант 1. Реализация через регистр сведений и обработчик ожидания

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

Разберем по шагам структуру необходимых метаданных:

  1. Регистр сведений СообщенияПользователям (непериодический или периодический по позиции в пределах секунды):
    • Измерения/Реквизиты: ПользовательОтКого (СправочникСсылка.Пользователи), ПользовательКому (СправочникСсылка.Пользователи), Сообщение (Строка), ДатаИсполненияДо (Дата).
    • Ресурсы: Выполнено (Булево).
  2. Общая форма (например, ОповещениеПользователя) или встроенное окно для визуального отображения текста адресату.
  3. Общий модуль с экспортной процедурой проверки входящих сообщений.

Рассмотрим код подключения обработчика ожидания при старте программы. В модуле управляемого приложения или модуле обычного приложения в процедуре ПриНачалеРаботыСистемы пропишем периодический вызов проверки (например, каждые 60 секунд):


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

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


Процедура ОбработкаСообщенийПользователю() Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	СообщенияПользователямСрезПоследних.Период,
        |	СообщенияПользователямСрезПоследних.ПользовательОтКого,
        |	СообщенияПользователямСрезПоследних.ПользовательКому,
        |	СообщенияПользователямСрезПоследних.Сообщение,
        |	СообщенияПользователямСрезПоследних.ДатаИсполненияДо,
        |	СообщенияПользователямСрезПоследних.Выполнено
        |ИЗ
        |	РегистрСведений.СообщенияПользователям.СрезПоследних(, ПользовательКому = &ПользовательКому) КАК СообщенияПользователямСрезПоследних
        |ГДЕ
        |	СообщенияПользователямСрезПоследних.ДатаИсполненияДо >= &ДатаИсполненияДо
        |	И (НЕ СообщенияПользователямСрезПоследних.Выполнено)";
    
    Запрос.УстановитьПараметр("ПользовательКому", ПараметрыСеанса.ТекущийПользователь);
    Запрос.УстановитьПараметр("ДатаИсполненияДо", ТекущаяДата());
    
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат;
    КонецЕсли;
    
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        Форма = ПолучитьОбщуюФорму("ОповещениеПользователя");
        Макет = ПолучитьОбщийМакет("СообщениеПользователю");
        ТС = Макет.ПолучитьОбласть("ТекстСообщения");
        ТС.Параметры.Сообщение = "Вам сообщение от пользователя: " + Строка(Выборка.ПользовательОтКого);
        ТС.Параметры.Сообщение1 = Выборка.Сообщение;
        Форма.ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТС);
        
        Если Форма.Открыта() Тогда
            Форма.Обновить();
            Форма.Активизировать();
        Иначе
            Форма.Открыть();
        КонецЕсли;
        
        ПолучилосьЗаписать = Ложь;
        КоличествоПопыток = 0;
        
        Пока (Не ПолучилосьЗаписать) И (КоличествоПопыток < 20) Цикл
            Попытка
                Рег = РегистрыСведений.СообщенияПользователям.СоздатьМенеджерЗаписи();
                Рег.Период = Выборка.Период;
                Рег.ПользовательОтКого = Выборка.ПользовательОтКого;
                Рег.ПользовательКому = Выборка.ПользовательКому;
                Рег.Сообщение = Выборка.Сообщение;
                Рег.ДатаИсполненияДо = Выборка.ДатаИсполненияДо;
                Рег.Выполнено = Истина;
                Рег.Записать();
                ПолучилосьЗаписать = Истина;
            Исключение
                КоличествоПопыток = КоличествоПопыток + 1;
            КонецПопытки;
        КонецЦикла;
        
    КонецЦикла;
    
КонецПроцедуры

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

Вариант 2. Использование штатного механизма «Система взаимодействия»

Начиная с версии платформы 8.3.10 в 1С:Предприятие встроен механизм «Система взаимодействия». Это рекомендуемый современный инструмент для отправки сообщений, создания чатов и контекстных обсуждений.

Преимущества Системы взаимодействия:

  1. Мгновенная доставка (Push): Клиенты получают сообщения через постоянное двустороннее веб-сокет соединение без необходимости непрерывного опроса СУБД фоновыми запросами.
  2. Контекстность: Сообщение можно привязать к конкретному объекту информационной базы (документу, элементу справочника). Пользователь сразу видит гиперссылку на нужный объект.
  3. Программный интерфейс: Управление обсуждениями и отправка выполняются через объект глобального контекста СистемаВзаимодействия.

Вариант 3. Всплывающие системные уведомления

Если в управляемом приложении необходимо показать немодальное всплывающее оповещение (тост), применяется процедура клиентского контекста ПоказатьОповещениеПользователя.


ПоказатьОповещениеПользователя(
    "Новое событие",
    ПолучитьНавигационнуюСсылку(СсылкаНаДокумент),
    "Документ Заказ покупателя №123 был успешно проведен!",
    БиблиотекаКартинок.Информация
);

Такое окно появляется в правом нижнем углу экрана, не блокирует пользовательский ввод и позволяет сразу перейти к объекту по клику на навигационную ссылку.

Вариант 4. Отправка сообщений средствами операционной системы

В терминальных средах (RDP) на базе Windows для экстренных системных оповещений (например, о завершении сеансов перед регламентными работами) можно вызывать системную утилиту msg через метод ЗапуститьПриложение:


// Отправка сообщения конкретному пользователю Windows
ЗапуститьПриложение("msg " + ИмяПользователяОС + " ""Просьба срочно завершить работу в 1С!""");

// Отправка сообщения всем пользователям терминального сервера
ЗапуститьПриложение("msg * ""Внимание! Через 10 минут сервер будет перезагружен.""");

Ограничения метода: Команда msg работает только в среде ОС Windows при наличии соответствующих прав и недоступна в веб-клиентах, операционных системах Linux и мобильных приложениях.

← На главную