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