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

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

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

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

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

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

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

Как работает запуск фонового задания и что нужно подготовить

Фоновое задание исполняется в отдельном сеансе на сервере 1С (или на клиенте в файловой базе). У этого сеанса нет доступа к клиентскому контексту: нельзя обращаться к формам, элементам интерфейса, модальным диалогам и объектам типа «ВнешняяОбработка», созданным на клиенте. Всё, что задание должно знать, передаётся через параметры при запуске.

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

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

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

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

Метод принимает четыре параметра: имя метода в формате «ИмяОбщегоМодуля.ИмяПроцедуры», массив параметров, ключ (необязательный, нужен для контроля уникальности) и наименование, которое отображается в консоли заданий и журнале регистрации. Возвращает объект ФоновоеЗадание, у которого есть свойства УникальныйИдентификатор и Состояние.

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

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

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

Обратите внимание: вызов ФоновыеЗадания.Выполнить — серверный. Если код расположен в клиентской процедуре формы обработки, его нужно вынести в серверную процедуру формы с директивой &НаСервере или вызывать через обёртку. В модуле внешней обработки с директивой &НаСервере вызов работает напрямую.

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

Способ 2: длительные операции БСП в типовых конфигурациях

Если обработка встраивается в типовую конфигурацию (УТ, ERP, БП, ЗУП), правильнее использовать механизм «Длительные операции» из Библиотеки стандартных подсистем. Он решает сразу несколько задач: запуск задания, ожидание завершения с показом индикатора пользователю, возврат результата и сообщений об ошибках.

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

bsl
&НаСервере
Функция НачатьДлительнуюОперацию()
    ПараметрыПроцедуры = Новый Структура;
    ПараметрыПроцедуры.Вставить("ПериодНачало", ПериодНачало);
    ПараметрыПроцедуры.Вставить("Организация", Организация);

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

    Возврат ДлительныеОперации.ВыполнитьВФоне(
        "МойОбщийМодуль.ВыполнитьЗагрузкуДанных",
        ПараметрыПроцедуры,
        ПараметрыВыполнения);
КонецФункции

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

Сравнение двух способов запуска

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

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

ДлительныеОперации БСП

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

Проверка статуса и получение результата

После запуска задания обработка должна как-то узнать о его завершении. При прямом вызове есть два подхода: периодический опрос по уникальному идентификатору через ФоновыеЗадания.НайтиПоУникальномуИдентификатору() с проверкой свойства Состояние, либо ожидание через Задание.ОжидатьЗавершенияВыполнения(Таймаут) — но второй вариант блокирует сеанс и противоречит самой идее фонового выполнения, поэтому на практике используют опрос по таймеру формы.

Если задание завершилось с ошибкой, состояние будет СостояниеФоновогоЗадания.Ошибка, а текст исключения доступен через свойство ИнформацияОбОшибке найденного объекта задания. Эти данные стоит выводить пользователю или писать в журнал регистрации — иначе отладка превращается в гадание.

При работе через БСП опрос делать не нужно: механизм ОжидатьЗавершение сам периодически проверяет задание и вызывает оповещение, передавая структуру с полями Статус («Выполнено», «Ошибка») и АдресРезультата.

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

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

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

Состояние = Завершено, ошибок в журнале регистрации нет

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

Состояние = Ошибка или задание исчезло из списка без результата

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

Ожидаемые документы/записи созданы, количество совпадает с расчётным

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

Данных нет или они частичные — задание оборвалось на середине

Журнал регистрации
Норма

Есть записи о старте и штатном завершении задания

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

Записи об исключении с текстом ошибки в фоновом сеансе

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

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

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

Типичные ошибки
01
Вызов метода обработки или формы вместо общего модуля — задание падает с ошибкой «Метод не обнаружен»
02
Передача несериализуемых объектов (COM, элементы формы) — исключение при старте задания
03
Отсутствие обработки ошибок в фоновой процедуре — задание завершается молча, пользователь не видит причину
04
Запуск задания без ключа при повторных нажатиях кнопки — несколько копий одной операции работают параллельно и конфликтуют за данные
05
Ожидание результата циклом на клиенте без таймера — интерфейс зависает, смысл фонового запуска теряется

Ещё одна ловушка — права. Фоновое задание исполняется от имени пользователя, который его запустил, со всеми его ограничениями RLS и прав доступа. Если в интерактивном режиме обработка работает, а в фоне «не видит» данные, первым делом проверяют права и установку привилегированного режима в общем модуле.

Ограничения и риски фонового выполнения

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

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

Отладка фоновых заданий

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

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

Порядок запуска фонового задания из обработки
  1. 1
    Создайте общий серверный модуль и разместите в нём экспортную процедуру с логикой операции
  2. 2
    В обработке сформируйте массив или структуру параметров (только сериализуемые значения)
  3. 3
    На сервере вызовите ФоновыеЗадания.Выполнить с именем метода, параметрами, ключом и наименованием
  4. 4
    Сохраните УникальныйИдентификатор задания в реквизит формы
  5. 5
    Настройте опрос состояния по таймеру или ожидание через ДлительныеОперацииКлиент
  6. 6
    После завершения проверьте состояние, получите результат и выведите ошибки пользователю
Если результат фонового задания нужен пользователю в виде таблицы или отчёта, не пытайтесь вернуть его «напрямую». Поместите данные во временное хранилище в фоновой процедуре, а в форме по окончании заберите по адресу и загрузите в реквизит формы. Это стандартный и единственный надёжный путь передачи результата из фона в интерфейс.
ПЗ
Практическое замечание
Итог

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

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

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

Можно ли запустить фоновое задание из внешней обработки без изменения конфигурации?

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

Почему фоновое задание завершается с ошибкой «Метод объекта не обнаружен»?

Почти всегда причина в том, что в имени метода указана процедура модуля обработки, формы или неэкспортная процедура общего модуля. Проверьте, что имя задано строкой в формате «ИмяОбщегоМодуля.ИмяПроцедуры», процедура объявлена с ключевым словом «Экспорт», а у общего модуля установлен флаг «Сервер».

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

Таблица значений сериализуется и может быть передана в массиве параметров или внутри структуры напрямую. Если таблица находится в реквизите формы типа «ТаблицаЗначений», на сервере её получают через РеквизитФормыВЗначение() и передают в задание. Обратно результат возвращают через временное хранилище.

Можно ли отменить уже запущенное фоновое задание?

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

В чём разница между фоновым и регламентным заданием?

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

Почему фоновое задание не видит данные, которые пользователь видит интерактивно?

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