При разработке небольших нетиповых конфигураций часто возникает задача оперативного информирования пользователей о событиях в системе — например, уведомить сотрудника принимающего склада о том, что с другой точки отправлен товар. Если в тяжелых типовых решениях для этого предусмотрены развитые подсистемы Библиотеки стандартных подсистем (БСП), то в легковесных базах подключение объемных библиотек неоправданно раздувает размер конфигурации.
Разберем основные практические способы организации оповещений в среде 1С:Предприятие 8.3 на управляемых формах при работе через тонкий и веб-клиент.
Рассмотрим классический и наиболее автономный вариант, не требующий внешних сервисов и библиотек. Логика строится на фиксации события в информационной базе и периодической проверке очереди на стороне клиента.
Разберем по шагам создание такого механизма:
ОчередьОповещений со следующими реквизитами:
– Измерения: Пользователь (тип СправочникСсылка.Пользователи) и Идентификатор (тип УникальныйИдентификатор или Число);
– Ресурсы / Реквизиты: ТекстСообщения (тип Строка), Заголовок (тип Строка), НавигационнаяСсылка (тип Строка), ДатаСоздания (тип Дата).
Движение = РегистрыСведений.ОчередьОповещений.СоздатьМенеджерЗаписи();
Движение.Пользователь = ОтветственныйСкладаПолучателя;
Движение.Идентификатор = Новый УникальныйИдентификатор();
Движение.Заголовок = "Поступление товара";
Движение.ТекстСообщения = "Отправлен товар по документу № " + СокрЛП(Номер);
Движение.НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Ссылка);
Движение.ДатаСоздания = ТекущаяДатаСеанса();
Движение.Записать();
ПодключитьОбработчикОжидания:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьОповещенияПользователя", 15);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОповещенияПользователя() Экспорт
СписокОповещений = ПолучитьИУдалитьОповещенияНаСервере();
Для Каждого Оповещение Из СписокОповещений Цикл
ПоказатьОповещениеПользователя(
Оповещение.Заголовок,
Оповещение.НавигационнаяСсылка,
Оповещение.ТекстСообщения,
БиблиотекаКартинок.Информация32
);
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьИУдалитьОповещенияНаСервере()
Результат = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Очередь.Заголовок КАК Заголовок,
| Очередь.ТекстСообщения КАК ТекстСообщения,
| Очередь.НавигационнаяСсылка КАК НавигационнаяСсылка,
| Очередь.Идентификатор КАК Идентификатор
|ИЗ
| РегистрСведений.ОчередьОповещений КАК Очередь
|ГДЕ
| Очередь.Пользователь = &ТекущийПользователь";
Запрос.УстановитьПараметр("ТекущийПользователь", ПользователиИнформационнойБазы.ТекущийПользователь());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураОповещения = Новый Структура("Заголовок,ТекстСообщения,НавигационнаяСсылка");
ЗаполнитьЗначенияСвойств(СтруктураОповещения, Выборка);
Результат.Добавить(СтруктураОповещения);
// Удаляем прочитанное оповещение
МенеджерЗаписи = РегистрыСведений.ОчередьОповещений.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
МенеджерЗаписи.Идентификатор = Выборка.Идентификатор;
МенеджерЗаписи.Удалить();
КонецЦикла;
Возврат Результат;
КонецФункции
Проанализируем преимущества встроенного клиентского метода ПоказатьОповещениеПользователя. Он выводит системное всплывающее окно в правом нижнем углу интерфейса (как в тонком, так и в веб-клиенте) без блокировки основного окна приложения.
Важный нюанс: если в параметр НавигационнаяСсылка передать ссылку на объект информационной базы, полученную функцией ПолучитьНавигационнуюСсылку(), при клике на всплывающее окно платформа 1С автоматически откроет целевой документ у пользователя без написания дополнительного обработчика.
Разберем технические ограничения, о которых необходимо помнить при реализации опроса через обработчики ожидания:
Посмотрим на современную штатную альтернативу постоянному опросу — механизм «Система взаимодействия». Начиная с платформы 8.3.10 данный инструмент встроен непосредственно в платформу и не требует интеграции тяжелых модулей БСП.
Главное достоинство этого механизма — работа по технологии Push, когда сервер 1С мгновенно доставляет уведомление на клиент без постоянных холостых запросов к базе.
Разберем пример программной отправки сообщения через Систему взаимодействия:
&НаСервере
Процедура ОтправитьОповещениеЧерезСистемуВзаимодействия(ПользовательПолучатель, ТекстОповещения, СсылкаНаДокумент)
// Получаем идентификатор пользователя в Системе взаимодействия
ИДПолучателя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательПолучатель);
Если ИДПолучателя <> Неопределено Тогда
// Создаем неконтекстное обсуждение или находим существующее
МассивУчастников = Новый Массив;
МассивУчастников.Добавить(ИДПолучателя);
Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение();
Обсуждение.Участники = МассивУчастников;
Обсуждение.Записать();
// Формируем и отправляем сообщение
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
НовоеСообщение.Текст = ТекстОповещения;
НовоеСообщение.Данные = ПолучитьНавигационнуюСсылку(СсылкаНаДокумент);
НовоеСообщение.Записать();
КонецЕсли;
КонецПроцедуры
На стороне клиента оповещение отобразится в стандартной панели сообщений («колокольчике»), либо может быть перехвачено в коде методом СистемаВзаимодействия.ПодключитьОбработчикПолученияСообщения().
Если пользователи работают на удаленных складах или точках и не всегда держат открытой базу 1С, эффективным и легковесным решением является отправка прямых HTTP-запросов к Telegram Bot API.
Для такой реализации не нужны внешние компоненты. Достаточно использовать стандартные объекты HTTPСоединение и HTTPЗапрос. Код выполняется на сервере за доли секунды и одинаково стабильно работает под любым веб-сервером (Apache или IIS).