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