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

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

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

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

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

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

Как работает фоновое выполнение в 1С

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

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

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

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

&НаСервере

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

ПараметрыПроцедуры = Новый Массив;

ПараметрыПроцедуры.Добавить(Организация);

ПараметрыПроцедуры.Добавить(Период);

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

"ОбработкаДанных.ПерепровестиДокументы",

ПараметрыПроцедуры,

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

"Перепроведение документов");

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

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

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

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

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

Состояние проверяют периодически:

Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);

Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда

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

ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда

ТекстОшибки = Задание.ИнформацияОбОшибке.Описание;

КонецЕсли;

На клиенте опрос организуют через ПодключитьОбработчикОжидания с интервалом в несколько секунд. Слишком частый опрос (чаще раза в секунду) создаёт лишнюю нагрузку на сервер при большом числе пользователей.

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

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

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

Завершено

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

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

Данные в хранилище
Норма

По адресу лежит ожидаемая структура/таблица

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

Неопределено — процедура не записала результат

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

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

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

Ошибка вызова метода — неверное имя модуля или процедуры

Запуск через БСП: ДлительныеОперации.ВыполнитьВФоне

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

&НаКлиенте

Процедура ЗапуститьОбработку(Команда)

ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);

ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Загрузка данных";

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

"ОбработкаДанных.ВыполнитьЗагрузку",

ПараметрыПроцедуры,

ПараметрыВыполнения);

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

Для интерактивного ожидания используют ДлительныеОперацииКлиент.ОжидатьЗавершение с описанием оповещения — платформа сама покажет индикатор и вызовет вашу процедуру по завершении. Сигнатура фоновой процедуры для БСП строго определена: Процедура ИмяПроцедуры(Параметры, АдресРезультата) Экспорт.

Выбор способа: прямой вызов или БСП

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

Сравнение вариантов

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

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

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

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

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

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

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Процедура не экспортная или модуль не серверный — задание падает сразу с ошибкой вызова метода
02
Передача в параметры элементов формы или COM-объектов — ошибка сериализации при запуске
03
Чтение результата до завершения задания — получаете Неопределено или устаревшие данные
04
Вызов Предупреждение или ОткрытьФорму в фоне — аварийное завершение задания
05
Запуск тяжёлой операции без ключа — пользователь нажимает кнопку повторно и плодит параллельные задания

Безопасность и транзакционные риски

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

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

Итог

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

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

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

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

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

Как показать пользователю прогресс длительной операции?

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

Что произойдёт с фоновым заданием, если пользователь закроет программу?

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

Как запретить повторный запуск, пока задание ещё выполняется?

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

Почему в файловой базе фоновые задания выполняются медленно и по очереди?

В файловом режиме фоновые задания обрабатываются в рамках ограниченного числа потоков одного соединения, поэтому параллельность сильно ограничена. Для регулярной параллельной фоновой работы рекомендуется клиент-серверный вариант с СУБД.

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

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