Разберем классическую задачу архитектуры 1С: как отправить сигнал с сервера, где выполняется регламентное задание, на клиентские сеансы пользователей. Поскольку регламентное задание работает в отрыве от пользовательского сеанса, прямой связи «сервер-клиент» в платформе не существует. Мы вместе проанализируем наиболее надежные подходы к решению этой задачи.
Это самый популярный и стабильный способ «подружить» фоновое задание с интерфейсом пользователя. Суть заключается в разделении логики исполнения и логики уведомления.
ОчередьОповещений. В нем предусмотрим измерения: Пользователь (тип СправочникСсылка.Пользователи) и Прочитано (тип Булево), а также ресурсы для самого сообщения.ПодключитьОбработчикОжидания.Разберем пример кода для клиентской части:
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьНаличиеОповещений", 60);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНаличиеОповещений()
Результат = ПолучитьНовыеОповещенияНаСервере();
Для Каждого СтрокаОповещения Из Результат Цикл
Описание = Новый ОписаниеОповещения("ПослеНажатияНаОповещение", ЭтотОбъект, СтрокаОповещения.Параметры);
ПоказатьОповещениеПользователю("Задание завершено", , СтрокаОповещения.Текст, , Описание);
КонецЦикла;
КонецПроцедуры
Чтобы оповещение не просто висело, а приносило пользу, мы можем сделать его интерактивным. Используя объект ОписаниеОповещения, мы передаем контекст, который поможет пользователю сразу перейти к результату.
Рассмотрим, как реализовать открытие формы после того, как пользователь нажал на всплывшее окно:
&НаКлиенте
Процедура ПослеНажатияНаОповещение(Параметры) Экспорт
// Здесь мы открываем нужную форму с переданными параметрами
ОткрытьФорму("Обработка.МояОбработка.Форма", Параметры);
КонецПроцедуры
Помимо регистра сведений, существуют и другие методы, однако каждый из них имеет свои ограничения:
ПоместитьВоВременноеХранилище. Однако помните: этот метод работает только если фоновое задание было запущено из конкретного сеанса (например, интерактивно пользователем), а не по расписанию регламентного задания.Мы выяснили, что архитектурно правильный путь для регламентных заданий — это асинхронный обмен данными через РегистрСведений. Этот подход обладает рядом преимуществ:
Прочитано вы всегда будете знать, увидел ли пользователь уведомление.Используя ОбработчикОжидания на клиенте с интервалом в 60 секунд, вы создадите комфортную систему уведомлений, которая не будет создавать избыточную нагрузку на сервер, но при этом обеспечит своевременное информирование команды о завершении длительных фоновых процессов.