В процессе разработки и сопровождения конфигураций 1С часто возникает задача оперативного оповещения одного пользователя или группы пользователей о наступлении определенного события: проведении важного документа, согласовании заявки, необходимости выполнить действие или освободить базу. Разберем основные способы реализации обмена сообщениями внутри 1С:Предприятие — от классических архитектурных решений на базе регистра сведений до современных механизмов платформы.
Классический подход, подходящий как для обычных, так и для управляемых форм, заключается в создании буферного регистра сведений для хранения входящих сообщений и периодическом опросе этого регистра на стороне клиентского сеанса с помощью глобального метода ПодключитьОбработчикОжидания.
Разберем по шагам структуру необходимых метаданных:
СообщенияПользователям (непериодический или периодический по позиции в пределах секунды):
ПользовательОтКого (СправочникСсылка.Пользователи), ПользовательКому (СправочникСсылка.Пользователи), Сообщение (Строка), ДатаИсполненияДо (Дата).Выполнено (Булево).ОповещениеПользователя) или встроенное окно для визуального отображения текста адресату.Рассмотрим код подключения обработчика ожидания при старте программы. В модуле управляемого приложения или модуле обычного приложения в процедуре ПриНачалеРаботыСистемы пропишем периодический вызов проверки (например, каждые 60 секунд):
Процедура ПриНачалеРаботыСистемы()
// Первичная проверка при входе
МойОбщийМодуль.ОбработкаСообщенийПользователю();
// Подключение периодического опроса каждые 60 секунд
ПодключитьОбработчикОжидания("МойОбщийМодуль.ОбработкаСообщенийПользователю", 60);
КонецПроцедуры
Проанализируем реализацию процедуры обработки очереди сообщений в общем модуле. Процедура выбирает невыполненные сообщения, адресованные текущему пользователю сеанса, выводит их на экран и помечает как прочитанные:
Процедура ОбработкаСообщенийПользователю() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СообщенияПользователямСрезПоследних.Период,
| СообщенияПользователямСрезПоследних.ПользовательОтКого,
| СообщенияПользователямСрезПоследних.ПользовательКому,
| СообщенияПользователямСрезПоследних.Сообщение,
| СообщенияПользователямСрезПоследних.ДатаИсполненияДо,
| СообщенияПользователямСрезПоследних.Выполнено
|ИЗ
| РегистрСведений.СообщенияПользователям.СрезПоследних(, ПользовательКому = &ПользовательКому) КАК СообщенияПользователямСрезПоследних
|ГДЕ
| СообщенияПользователямСрезПоследних.ДатаИсполненияДо >= &ДатаИсполненияДо
| И (НЕ СообщенияПользователямСрезПоследних.Выполнено)";
Запрос.УстановитьПараметр("ПользовательКому", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("ДатаИсполненияДо", ТекущаяДата());
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Форма = ПолучитьОбщуюФорму("ОповещениеПользователя");
Макет = ПолучитьОбщийМакет("СообщениеПользователю");
ТС = Макет.ПолучитьОбласть("ТекстСообщения");
ТС.Параметры.Сообщение = "Вам сообщение от пользователя: " + Строка(Выборка.ПользовательОтКого);
ТС.Параметры.Сообщение1 = Выборка.Сообщение;
Форма.ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТС);
Если Форма.Открыта() Тогда
Форма.Обновить();
Форма.Активизировать();
Иначе
Форма.Открыть();
КонецЕсли;
ПолучилосьЗаписать = Ложь;
КоличествоПопыток = 0;
Пока (Не ПолучилосьЗаписать) И (КоличествоПопыток < 20) Цикл
Попытка
Рег = РегистрыСведений.СообщенияПользователям.СоздатьМенеджерЗаписи();
Рег.Период = Выборка.Период;
Рег.ПользовательОтКого = Выборка.ПользовательОтКого;
Рег.ПользовательКому = Выборка.ПользовательКому;
Рег.Сообщение = Выборка.Сообщение;
Рег.ДатаИсполненияДо = Выборка.ДатаИсполненияДо;
Рег.Выполнено = Истина;
Рег.Записать();
ПолучилосьЗаписать = Истина;
Исключение
КоличествоПопыток = КоличествоПопыток + 1;
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Важное ограничение архитектуры: Постоянные серверные вызовы через обработчики ожидания создают дополнительную нагрузку на СУБД. При большом числе одновременно работающих пользователей (десятки и сотни) частые запросы к одной таблице могут вызывать блокировки. Рекомендуется устанавливать интервал опроса не менее 60 секунд.
Начиная с версии платформы 8.3.10 в 1С:Предприятие встроен механизм «Система взаимодействия». Это рекомендуемый современный инструмент для отправки сообщений, создания чатов и контекстных обсуждений.
Преимущества Системы взаимодействия:
СистемаВзаимодействия.Если в управляемом приложении необходимо показать немодальное всплывающее оповещение (тост), применяется процедура клиентского контекста ПоказатьОповещениеПользователя.
ПоказатьОповещениеПользователя(
"Новое событие",
ПолучитьНавигационнуюСсылку(СсылкаНаДокумент),
"Документ Заказ покупателя №123 был успешно проведен!",
БиблиотекаКартинок.Информация
);
Такое окно появляется в правом нижнем углу экрана, не блокирует пользовательский ввод и позволяет сразу перейти к объекту по клику на навигационную ссылку.
В терминальных средах (RDP) на базе Windows для экстренных системных оповещений (например, о завершении сеансов перед регламентными работами) можно вызывать системную утилиту msg через метод ЗапуститьПриложение:
// Отправка сообщения конкретному пользователю Windows
ЗапуститьПриложение("msg " + ИмяПользователяОС + " ""Просьба срочно завершить работу в 1С!""");
// Отправка сообщения всем пользователям терминального сервера
ЗапуститьПриложение("msg * ""Внимание! Через 10 минут сервер будет перезагружен.""");
Ограничения метода: Команда msg работает только в среде ОС Windows при наличии соответствующих прав и недоступна в веб-клиентах, операционных системах Linux и мобильных приложениях.