Как получить результат выполнения регламентного задания в 1С?

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

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

Использование регистра сведений для хранения статусов

Это самый надежный и архитектурно правильный способ передачи данных между сеансами, особенно если работа пользователя и работа регламентного задания разнесены по времени. Суть метода заключается в создании специального РегистрСведений, в который фоновое задание записывает состояние своего выполнения.

Шаги реализации:

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

Пример записи данных в фоновом задании:


// Внутри регламентного задания
МенеджерЗаписи = РегистрыСведений.СтатусыРегламентныхЗаданий.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИдентификаторЗадания = УникальныйИдентификаторЗадания;
МенеджерЗаписи.Статус = "Выполнено";
МенеджерЗаписи.ОписаниеОшибки = "";
МенеджерЗаписи.Записать();

Использование механизма длительных операций

Если задача подразумевает интерактивный запуск пользователем процесса, который перерастает в длительное фоновое задание, лучше всего использовать стандартный механизм ДлительныеОперации из состава БСП (Библиотека стандартных подсистем).

Этот метод позволяет передать результат через АдресВоВременномХранилище. Клиентская часть получает идентификатор задания и периодически опрашивает сервер о его состоянии.

Работа с сообщениями фонового задания

Объект ФоновоеЗадание имеет метод ПолучитьСообщения(). Этот механизм позволяет считывать поток сообщений, отправленных процедурой Сообщить() внутри фонового сеанса. Это отличное решение для отображения прогресса выполнения (например, "Обработано 50 из 100 элементов").

Важные нюансы:

Подход с использованием временного хранилища

Если вам нужно передать не просто статус, а сложный объект (например, ТаблицаЗначений или Структура), лучшим вариантом будет сериализация этого объекта и сохранение его во временное хранилище. Адрес этого хранилища запишите в регистр сведений, чтобы клиент мог получить результат по ссылке.

Разберем пример получения результата на клиенте:


&НаКлиенте
Процедура ПроверитьРезультат(Команда)
    // Получаем адрес результата из регистра (предварительно считанного)
    Адрес = ПолучитьАдресРезультатаИзРегистра(); 
    Если ЗначениеЗаполнено(Адрес) Тогда
        Результат = ПолучитьИзВременногоХранилища(Адрес);
        // Обработка полученного результата
    КонецЕсли;
КонецПроцедуры

Использование вышеописанных подходов позволит вам организовать прозрачный и удобный механизм мониторинга фоновых процессов, обеспечивая обратную связь с пользователем в любых конфигурациях, включая 1С:Управление нашей фирмой.

← На главную