К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно запустить фоновое задание в 1С

Как программно запустить фоновое задание в 1С: методы Выполнить и ВыполнитьВФоне, параметры, ключ, ожидание завершения, ошибки и проверка результата.

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

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

Ниже разобраны оба способа: сигнатуры методов, передача параметров, контроль выполнения, типичные ошибки и способы проверить, что задание действительно отработало.

Где размещается код фонового задания

Фоновое задание выполняется на сервере, поэтому вызываемый метод обязан находиться в общем модуле с установленными флагами «Сервер» и «Вызов сервера» не требуется, но желателен флаг «Привилегированный режим», если заданию нужен доступ к данным без проверки прав. Процедура или функция должна быть экспортной — с ключевым словом Экспорт.

Метод указывается строкой в формате ИмяОбщегоМодуля.ИмяМетода. Если модуль не серверный или метод не экспортный, при запуске возникнет ошибка «Метод не обнаружен». Нельзя вызывать методы модулей объектов, модулей форм и клиентских общих модулей — фоновое задание о них ничего не знает.

Внутри фонового задания недоступен интерактивный контекст: нельзя открывать формы, показывать предупреждения, обращаться к ТекущиеДанные формы. Всё, что нужно методу, передаётся через параметры при запуске.

Запуск через ФоновыеЗадания.Выполнить

Базовый способ — метод Выполнить менеджера фоновых заданий. Он принимает четыре параметра: имя метода, массив параметров, ключ и наименование. Возвращает объект ФоновоеЗадание, через который можно отслеживать состояние.

bsl
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(Организация);
ПараметрыЗадания.Добавить(ДатаНачала);

Задание = ФоновыеЗадания.Выполнить(
    "ОбработкаДанныхСервер.ЗагрузитьДанные",
    ПараметрыЗадания,
    "Загрузка_" + Строка(Организация.УникальныйИдентификатор()),
    "Загрузка данных по организации");

ИдентификаторЗадания = Задание.УникальныйИдентификатор;

Имя метода задаётся строкой — это частая причина опечаток, которые проявляются только в момент запуска. Параметры передаются массивом строго в том порядке, в каком объявлены в сигнатуре процедуры. Если процедура принимает два параметра, а массив содержит один, задание завершится с ошибкой.

Ключ — строковый идентификатор, который предотвращает запуск дублей: пока активно задание с таким ключом, повторный вызов Выполнить с тем же ключом выбросит исключение. Это удобно для защиты от двойного нажатия кнопки. Наименование — произвольный текст, который виден в консоли заданий и журнале регистрации.

Ограничения по параметрам

В параметры фонового задания можно передавать только сериализуемые значения: примитивные типы, структуры, массивы, ссылки на объекты базы, таблицы значений. Нельзя передать объект ТабличныйДокумент с открытой формой, элементы формы, COM-объекты и другие несериализуемые типы. Если нужно передать сложные данные, соберите их в структуру или таблицу значений.

Современный способ: ДлительныеОперации.ВыполнитьВФоне

В конфигурациях на базе БСП рекомендуется использовать программный интерфейс длительных операций. Он сам формирует ключ, сохраняет результат во временное хранилище, помещает информацию об ошибках в журнал регистрации и возвращает структуру с параметрами выполнения.

bsl
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификаторФормы);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка данных'");
ПараметрыВыполнения.ОжидатьЗавершение = 0; // не ждать, вернуть управление сразу

Результат = ДлительныеОперации.ВыполнитьВФоне(
    "ОбработкаДанныхСервер.ЗагрузитьДанные",
    ПараметрыПроцедуры, // структура с параметрами метода
    ПараметрыВыполнения);

// Результат.Статус = "Выполняется", "Выполнено" или "Ошибка"
// Результат.ИдентификаторЗадания - для последующего контроля

Ключевое отличие от прямого вызова: параметры процедуры передаются структурой, а не массивом, и вызываемый метод должен иметь сигнатуру Процедура ИмяМетода(Параметры, АдресРезультата) Экспорт. Результат работы метод помещает во временное хранилище по адресу АдресРезультата через ПоместитьВоВременноеХранилище.

Параметр ОжидатьЗавершение управляет поведением: если задание завершится за указанное число секунд, метод вернёт уже готовый результат со статусом «Выполнено» — это избавляет от лишнего ожидания на клиенте для быстрых операций.

Сравнение вариантов запуска

ФоновыеЗадания.Выполнить

Подходит для собственных разработок без БСП и простых задач. Полный контроль над ключом, но обработку ошибок и передачу результата реализуете сами.

ДлительныеОперации.ВыполнитьВФоне

Стандарт для типовых конфигураций. Встроенные статусы, журналирование ошибок, ожидание завершения, интеграция с формами через ожидание оповещений. Требует БСП.

Регламентные задания

Для периодических задач по расписанию. Программно создавать их для разовых операций не стоит — используйте фоновые задания.

Как дождаться завершения и получить результат

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

Состояние задания проверяется через свойство Состояние: Активно, Завершено, ЗавершеноАварийно, Отменено. Если задание завершилось аварийно, текст ошибки доступен в свойстве ИнформацияОбОшибке.

bsl
Задание.ОжидатьЗавершенияВыполнения(60);

Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
    Результат = ПолучитьИзВременногоХранилища(АдресРезультата);
ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
    ВызватьИсключение ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
КонецЕсли;

Найти ранее запущенное задание можно по уникальному идентификатору: ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор). Поэтому идентификатор задания принято сохранять — в реквизит формы, регистр сведений или параметр сеанса, если контроль нужен между вызовами.

Типичные ошибки при программном запуске

Типичные ошибки
01
Метод размещён в клиентском модуле или модуле формы — задание падает с ошибкой «Метод не обнаружен». Перенесите код в серверный общий модуль и добавьте Экспорт.
02
Параметры переданы не массивом или в неверном порядке — ошибка несоответствия параметров. Сверьте порядок элементов массива с сигнатурой процедуры.
03
Попытка показать сообщение пользователю из фона через Предупреждение или открытие формы — интерактивные вызовы в фоне недоступны. Используйте Сообщить или запись в журнал регистрации.
04
Игнорирование статуса «ЗавершеноАварийно» — вызывающий код считает операцию успешной, хотя данные не обработаны. Всегда проверяйте состояние задания.
05
Повторный запуск с тем же ключом без проверки — исключение о конфликте блокировки. Перед запуском ищите активные задания по ключу через ФоновыеЗадания.ПолучитьФоновыеЗадания.

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

Как проверить, что задание отработало

Первый источник информации — журнал регистрации: события запуска и завершения фоновых заданий фиксируются там, а при аварийном завершении сохраняется текст ошибки. В типовых конфигурациях удобно открыть журнал с отбором по событию «Фоновое задание».

Второй способ — консоль заданий (внешняя обработка или встроенный механизм в некоторых конфигурациях), где видны активные и завершённые задания, их ключи, наименования и состояния. Программно список активных заданий получают через ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор).

Контрольные точки

Как проверить результат

Состояние задания после ожидания
Норма

Завершено

Тревожный признак

ЗавершеноАварийно или Отменено — смотрите ИнформацияОбОшибке и журнал регистрации

Результат во временном хранилище
Норма

По адресу лежит структура или значение, помещённое методом

Тревожный признак

Хранилище пустое — метод не поместил результат или задание упало до этого места

Данные в базе
Норма

Появились ожидаемые записи, количество совпадает с расчётным

Тревожный признак

Записей нет или их меньше — проверяйте логику и отборы внутри метода

Отмена и защита от дублей

Отменить активное задание можно методом Отменить() объекта фонового задания. Учтите, что отмена не мгновенна: платформа прерывает выполнение в ближайшей безопасной точке, и уже записанные данные останутся в базе. Если метод работает в одной большой транзакции, она откатится; если запись идёт порциями — часть данных сохранится.

Для защиты от повторного запуска используйте связку ключа и отбора активных заданий: перед вызовом Выполнить получите задания с отбором по ключу и состоянию «Активно». Если такое задание есть — не запускайте новое, а верните пользователю сообщение, что операция уже выполняется.

Порядок безопасного запуска
  1. 1
    Создайте серверный общий модуль и экспортную процедуру с нужными параметрами
  2. 2
    Проверьте отсутствие активного задания с тем же ключом через ПолучитьФоновыеЗадания
  3. 3
    Запустите задание через Выполнить или ВыполнитьВФоне, сохраните идентификатор
  4. 4
    Дождитесь завершения или организуйте ожидание оповещения на клиенте
  5. 5
    Проверьте состояние задания и обработайте аварийное завершение
  6. 6
    Сверьте результат: данные в базе, содержимое временного хранилища, журнал регистрации

Частые вопросы

Можно ли запустить фоновое задание из клиентского кода формы?

Да, но вызов всё равно уходит на сервер: из клиентской процедуры вызывайте серверную процедуру формы или серверного общего модуля, которая выполнит ФоновыеЗадания.Выполнить. Напрямую с тонкого клиента менеджер фоновых заданий недоступен.

Сколько фоновых заданий можно запустить одновременно?

Жёсткого ограничения в платформе нет, но каждое задание занимает рабочий процесс сервера 1С. Массовый запуск десятков заданий способен перегрузить кластер. Для параллельной обработки запускайте разумное число заданий и контролируйте нагрузку.

Чем фоновое задание отличается от регламентного?

Регламентное задание — это фоновое задание плюс расписание и настройки в метаданных: оно запускается автоматически по расписанию. Фоновое задание в узком смысле создаётся программно для разового выполнения и не имеет расписания.

Как передать в фоновое задание таблицу значений?

Таблица значений сериализуется и передаётся в параметрах напрямую. Альтернатива — поместить таблицу во временное хранилище и передать адрес, а внутри метода забрать данные по адресу. Второй вариант удобен для больших объёмов.

Почему задание завершается с ошибкой «Метод не обнаружен», хотя процедура существует?

Проверьте три вещи: модуль должен быть общим и серверным, процедура должна иметь ключевое слово Экспорт, а строка имени метода должна точно совпадать с форматом «ИмяМодуля.ИмяПроцедуры» без лишних пробелов.

Можно ли узнать прогресс выполнения фонового задания?

Штатного механизма прогресса нет. Обычно метод периодически пишет процент выполнения в регистр сведений или временное хранилище, а клиент с периодичностью опрашивает это значение и обновляет индикатор на форме.

Итог

Что важно запомнить

Фоновое задание запускается из серверного общего модуля через ФоновыеЗадания.Выполнить или ДлительныеОперации.ВыполнитьВФоне в типовых конфигурациях. Параметры передаются массивом или структурой, ключ защищает от дублей, а результат контролируется через состояние задания и временное хранилище. Всегда обрабатывайте аварийное завершение и проверяйте журнал регистрации.