Разработка и Конфигурация · 10 мин
Как запустить процедуру в фоне в 1С
Как запустить процедуру в фоне в 1С: фоновые задания, БСП ДлительныеОперации, передача параметров, отслеживание результата, типичные ошибки и ограничения.
Запуск процедуры в фоне нужен, когда операция занимает заметное время — загрузка прайсов, перепроведение документов, формирование тяжёлого отчёта — и блокировать интерфейс пользователя недопустимо. В 1С это решается двумя способами: напрямую через менеджер фоновых заданий (ФоновыеЗадания.Выполнить) или через механизм длительных операций Библиотеки стандартных подсистем (БСП), если она встроена в конфигурацию.
Фоновое задание выполняется на сервере 1С:Предприятия (или в отдельном потоке файловой базы) асинхронно: пользователь продолжает работать, а по завершении можно получить результат и показать его в форме. Важно понимать ограничения: фоновая процедура не имеет доступа к интерфейсу, не может открыть форму или показать предупреждение, а результат передаётся только через специальные механизмы — временное хранилище или сообщения пользователю.
Как работает фоновое выполнение в 1С
Фоновое задание — это объект встроенного языка, который запускает указанную процедуру на сервере независимо от клиентского сеанса. Процедура обязательно должна быть экспортной и располагаться в общем модуле с установленным флагом «Сервер». Если модуль клиентский или процедура не экспортная, задание завершится с ошибкой сразу после запуска.
Параметры передаются массивом и сериализуются при передаче на сервер. Это накладывает ограничение: нельзя передать объекты, не поддерживающие сериализацию, — например, элементы формы, COM-объекты, открытые соединения. Ссылочные типы, структуры, массивы и таблицы значений передаются без проблем.
Запуск через ФоновыеЗадания.Выполнить
Базовый вариант подходит для собственных конфигураций без БСП. Вызов выглядит так:
&НаСервере
Процедура ЗапуститьОбработкуНаСервере()
ПараметрыПроцедуры = Новый Массив;
ПараметрыПроцедуры.Добавить(Организация);
ПараметрыПроцедуры.Добавить(Период);
Задание = ФоновыеЗадания.Выполнить(
"ОбработкаДанных.ПерепровестиДокументы",
ПараметрыПроцедуры,
Новый УникальныйИдентификатор,
"Перепроведение документов");
КонецПроцедуры
Первый параметр — строка вида «ИмяОбщегоМодуля.ИмяПроцедуры». Третий параметр — ключ задания: если запустить задание с уже занятым активным ключом, платформа выдаст ошибку. Это удобный способ запретить параллельный запуск одной и той же операции. Четвёртый параметр — произвольное наименование, видимое в консоли заданий и журнале регистрации.
Полученный объект задания сохраните в реквизит формы или переменную — по его УникальныйИдентификатор позже проверяют состояние и получают результат.
Получение результата и контроль состояния
Чтобы вернуть данные из фоновой процедуры, внутри неё результат помещают во временное хранилище, а адрес передают через параметры или читают после завершения. Типовой приём — передать в параметрах адрес хранилища, созданный заранее через ПоместитьВоВременноеХранилище, и в фоновой процедуре записать туда результат по этому же адресу.
Состояние проверяют периодически:
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
Результат = ПолучитьИзВременногоХранилища(АдресРезультата);
ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
ТекстОшибки = Задание.ИнформацияОбОшибке.Описание;
КонецЕсли;
На клиенте опрос организуют через ПодключитьОбработчикОжидания с интервалом в несколько секунд. Слишком частый опрос (чаще раза в секунду) создаёт лишнюю нагрузку на сервер при большом числе пользователей.
Как проверить результат
Завершено
ЗавершеноАварийно — смотреть ИнформацияОбОшибке
По адресу лежит ожидаемая структура/таблица
Неопределено — процедура не записала результат
Есть запись о старте и завершении
Ошибка вызова метода — неверное имя модуля или процедуры
Запуск через БСП: ДлительныеОперации.ВыполнитьВФоне
В типовых конфигурациях (БП, УТ, ERP, ЗУП) встроена Библиотека стандартных подсистем, и правильный путь — использовать её механизм. Он сам управляет временным хранилищем, умеет показывать форму ожидания, поддерживает прогресс и отмену задания.
&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Загрузка данных";
ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне(
"ОбработкаДанных.ВыполнитьЗагрузку",
ПараметрыПроцедуры,
ПараметрыВыполнения);
КонецПроцедуры
Для интерактивного ожидания используют ДлительныеОперацииКлиент.ОжидатьЗавершение с описанием оповещения — платформа сама покажет индикатор и вызовет вашу процедуру по завершении. Сигнатура фоновой процедуры для БСП строго определена: Процедура ИмяПроцедуры(Параметры, АдресРезультата) Экспорт.
Выбор способа: прямой вызов или БСП
Если конфигурация на БСП — почти всегда выбирайте длительные операции: меньше ручного кода, готовый механизм отмены, корректная работа в веб-клиенте и при закрытии формы. Прямой вызов ФоновыеЗадания.Выполнить оправдан в самописных конфигурациях без библиотеки, в регламентных операциях, запускаемых с сервера без формы, и когда нужен тонкий контроль над ключами и пулом заданий.
Сравнение вариантов
Подходит для конфигураций без БСП и серверных сценариев. Ограничение: опрос состояния, хранилище и отмену реализуете вручную.
Подходит для типовых конфигураций и интерактивных форм. Ограничение: требует БСП и фиксированной сигнатуры процедуры.
Подходят для запуска по расписанию без участия пользователя. Не подходят для запуска по кнопке с передачей параметров из формы.
Типичные ошибки и ограничения
Самая частая ошибка — попытка вызвать процедуру из модуля объекта или формы. Фоновое задание выполняется в отдельном сеансе, где нет ни формы, ни контекста объекта, поэтому код должен жить в общем серверном модуле, а все нужные данные приходить через параметры.
Вторая группа ошибок — работа с результатом: забытый ПоместитьВоВременноеХранилище внутри фоновой процедуры, чтение хранилища до завершения задания, использование адреса хранилища после закрытия формы, чей идентификатор был передан. В файловом режиме есть ещё одно ограничение: фоновые задания выполняются последовательно в рамках одного соединения, поэтому длительные операции могут вставать в очередь.
Безопасность и транзакционные риски
Фоновая процедура, изменяющая данные, работает в отдельном сеансе и может конфликтовать с пользователями по блокировкам. Массовое перепроведение или изменение регистров в фоне при активной работе пользователей способно вызвать взаимоблокировки и превышение времени ожидания. Планируйте тяжёлые модифицирующие задания на периоды низкой активности и обрабатывайте данные порциями с фиксацией транзакций.
Если задание «зависло», его можно отменить методом Отменить объекта фонового задания. Учтите: отмена прерывает выполнение, но не откатывает уже зафиксированные транзакции — частично обработанные данные останутся в базе. Перед запуском разрушающих операций в рабочей базе сделайте резервную копию или отладьте процедуру на копии.
Что важно запомнить
Фоновая процедура — это экспортная процедура общего серверного модуля, запускаемая через ФоновыеЗадания.Выполнить или ДлительныеОперации.ВыполнитьВФоне. Результат возвращается через временное хранилище, состояние проверяется по идентификатору задания, интерактивные вызовы в фоне запрещены.
Частые вопросы
Можно ли запустить в фоне процедуру из модуля формы?
Нет. Фоновое задание выполняется в отдельном серверном сеансе без контекста формы. Вынесите логику в общий серверный модуль, а из формы передавайте только необходимые параметры — ссылки, структуры, примитивные типы.
Как показать пользователю прогресс длительной операции?
В БСП используйте ДлительныеОперации.СообщитьПрогресс внутри фоновой процедуры — процент и текст отобразятся в форме ожидания. Без БСП прогресс можно писать в регистр сведений или хранилище и опрашивать его обработчиком ожидания на клиенте.
Что произойдёт с фоновым заданием, если пользователь закроет программу?
Задание продолжит выполняться на сервере — оно не привязано к клиентскому сеансу. Однако адрес временного хранилища, привязанный к идентификатору формы, станет недоступен, поэтому результат, рассчитанный на закрытую форму, будет потерян.
Как запретить повторный запуск, пока задание ещё выполняется?
Передайте в ФоновыеЗадания.Выполнить фиксированный ключ задания — платформа не даст запустить второе задание с тем же активным ключом. Альтернатива — перед запуском искать активное задание через ФоновыеЗадания.ПолучитьФоновыеЗадания с отбором по наименованию или ключу.
Почему в файловой базе фоновые задания выполняются медленно и по очереди?
В файловом режиме фоновые задания обрабатываются в рамках ограниченного числа потоков одного соединения, поэтому параллельность сильно ограничена. Для регулярной параллельной фоновой работы рекомендуется клиент-серверный вариант с СУБД.
Чем фоновое задание отличается от регламентного?
Регламентное задание запускается автоматически по расписанию и настраивается в конфигураторе. Фоновое — запускается программно в любой момент с произвольными параметрами. При этом регламентное задание при срабатывании физически порождает именно фоновое задание.