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

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

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

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

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

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

Ниже разобраны оба способа с примерами кода, условиями выбора, ограничениями файлового и клиент-серверного режимов, а также типичными ошибками, из-за которых фоновое задание «зависает» или падает без видимой причины.

Когда фоновый режим нужен, а когда только мешает

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

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

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

Способ 1. Запуск через ДлительныеОперации (БСП)

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

Серверная часть

Процедура, которую нужно выполнить, размещается в общем модуле с признаком «Сервер» и принимает два параметра: структуру входных данных и адрес временного хранилища для результата.

Процедура ВыполнитьОбработкуДанных(Параметры, АдресРезультата) Экспорт

Результат = Новый Структура;

КоличествоОбработано = 0;

Для Каждого Элемент Из Параметры.СписокДокументов Цикл

// полезная работа

КоличествоОбработано = КоличествоОбработано + 1;

КонецЦикла;

Результат.Вставить("Обработано", КоличествоОбработано);

ПоместитьВоВременноеХранилище(Результат, АдресРезультата);

КонецПроцедуры

Клиентская часть с оповещением

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

&НаКлиенте

Процедура ЗапуститьВФоне(Команда)

ПараметрыПроцедуры = Новый Структура;

ПараметрыПроцедуры.Вставить("СписокДокументов", СписокДокументов());

ПараметрыВыполнения = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);

ПараметрыВыполнения.ВыводитьПрогрессВыполнения = Истина;

Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияФоновогоЗадания", ЭтотОбъект);

ДлительныеОперацииКлиент.ОжидатьЗавершение(

ЗапуститьНаСервере(ПараметрыПроцедуры), Оповещение, ПараметрыВыполнения);

КонецПроцедуры

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

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

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

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

&НаСервере

Процедура ЗапуститьОбработкуНаСервере()

ПараметрыЗадания = Новый Массив;

ПараметрыЗадания.Добавить(ПериодОтчета);

ПараметрыЗадания.Добавить(АдресХранилища);

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

"ОбработкиДанных.СформироватьДанные",

ПараметрыЗадания,

Новый УникальныйИдентификатор,

"Формирование данных отчета");

КонецПроцедуры

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

Проверить состояние можно методом ФоновыеЗадания.НайтиПоУникальномуИдентификатору и анализом свойства Состояние (Активно, Завершено, ЗавершеноАварийно). Сообщения, выведенные в фоне через Сообщить, доступны через метод ПолучитьСообщенияПользователю объекта задания.

Сравнение подходов

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

Подходит для типовых конфигураций: готовый прогресс, обработка ошибок, уведомления. Ограничение — требует подсистемы БСП.

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

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

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

Подходят для запуска по расписанию без участия пользователя. Не подходят для интерактивного запуска с возвратом результата в форму.

Передача параметров и получение результата

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

Обратная передача результата делается через временное хранилище: фоновое задание помещает туда структуру с данными, клиентская часть забирает её по адресу после завершения. Адрес хранилища создавайте с привязкой к уникальному идентификатору формы (ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификаторФормы)), чтобы данные жили, пока открыта форма.

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

Особенности файлового и клиент-серверного режимов

В клиент-серверном варианте фоновые задания выполняются на сервере 1С:Предприятия и могут работать параллельно в нескольких рабочих процессах. Это основной сценарий для многопользовательской работы.

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

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

Контроль выполнения и отмена задания

Отменить активное задание можно методом ФоновыеЗадания.НайтиПоУникальномуИдентификатору(...).Отменить() — но только программно и только если у пользователя есть административные права. В типовых конфигурациях список активных и завершённых заданий доступен в разделе «Администрирование → Обслуживание → Регламентные и фоновые задания» (в некоторых конфигурациях — «Регламентные операции»).

Признак аварийного завершения — состояние «ЗавершеноАварийно» и заполненное свойство ИнформацияОбОшибке. Текст ошибки также дублируется в журнале регистрации, где по событию фонового задания можно найти полный стек вызовов.

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

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

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

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

Статус «Выполнено», результат доступен по адресу хранилища

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

Статус «Ошибка» или «ЗавершеноАварийно»

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

Изменения соответствуют ожидаемому количеству объектов

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

Обработана только часть данных или данные не изменились

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

Нет ошибок по сеансу фонового задания

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

Есть записи об исключениях во время выполнения

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

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

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

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

Типичные ошибки
01
Размещение процедуры в модуле формы — фоновое задание её не увидит, нужен общий серверный модуль
02
Передача несериализуемых объектов в параметрах — задание падает при старте
03
Отсутствие проверки статуса в обработчике завершения — ошибка задания молча игнорируется
04
Запуск тяжёлой операции без ограничения объёма — задание занимает все ресурсы сервера
05
Ожидание результата циклом на клиенте — интерфейс зависает, смысл фона теряется

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

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

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

Почему фоновое задание не видит данные, введённые в форму?

Фоновое задание выполняется в отдельном сеансе и не имеет доступа к контексту формы. Все нужные значения — отборы, периоды, ссылки — соберите в структуру на клиенте или сервере и передайте через параметры при запуске.

Как запустить обработку по расписанию, а не по кнопке?

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

Что делать, если задание зависло и не отменяется?

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

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

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

Итог

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

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