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

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

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

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

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

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

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

Что такое фоновое задание и когда оно нужно

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

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

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

Требования к процедуре для фонового запуска

Не любую процедуру можно выполнить в фоне. Платформа предъявляет три обязательных условия:

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

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

Пример корректной процедуры в общем модуле ОбработкаДанныхСервер:

Процедура ЗагрузитьДанныеИзФайла(ПутьКФайлу, АдресРезультата) Экспорт

Результат = Новый Структура("Успешно, ЗагруженоЗаписей", Истина, 0);

// ... логика загрузки ...

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

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

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

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

&НаСервере

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

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

ПараметрыЗадания.Добавить(ПутьКФайлу);

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

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

"ОбработкаДанныхСервер.ЗагрузитьДанныеИзФайла",

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

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

"Загрузка данных из файла");

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

Метод возвращает объект ФоновоеЗадание, через который можно проверить состояние (Задание.Состояние), дождаться завершения (Задание.ОжидатьЗавершенияВыполнения(Таймаут)) или отменить выполнение (Задание.Отменить()).

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

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

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

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

Запуск выглядит так:

&НаКлиенте

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

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

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

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

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

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

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

&НаСервере

Функция ЗапуститьНаСервере()

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

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

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

УникальныйИдентификатор);

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

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

"ОбработкаДанныхСервер.ВыполнитьОбработку",

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

КонецФункции

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

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

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

Способ 3. Регламентные задания для запуска по расписанию

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

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

Программно запустить метод регламентного задания вне расписания можно, найдя его по имени и вызвав фоновое выполнение с тем же методом, либо через РегламентныеЗадания.НайтиПредопределенное() и принудительный запуск.

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

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

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

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

Интерактивные сценарии в типовых конфигурациях: прогресс-бар, уведомление, обработка ошибок из коробки. Требует БСП.

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

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

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

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

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

Для отладки фонового кода в конфигураторе включите «Отладка → Подключение» и установите флаг автоматического подключения фоновых заданий. Тогда точки останова в общем модуле сработают и в фоновом сеансе.

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

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

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

Состояние «Завершено», результат доступен во временном хранилище

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

«ЗавершеноАварийно» — смотрите ИнформацияОбОшибке и журнал регистрации

Повторный запуск с тем же ключом
Норма

Второй запуск отклоняется, пока активен первый

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

Запускаются параллельные копии — ключ не задан или различается

Данные после обработки
Норма

Количество обработанных записей совпадает с ожидаемым, ошибок в журнале нет

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

Часть записей пропущена или задвоена — проверяйте транзакционность и отборы

Типичные ошибки при фоновом выполнении

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

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

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

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

Ограничения и безопасная работа с данными

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

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

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

Итог

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

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

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

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

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

Как передать результат из фонового задания обратно в форму?

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

Почему фоновое задание висит в состоянии «Активно» и ничего не делает?

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

Как отменить запущенное фоновое задание?

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

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

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

Работают ли фоновые задания в файловой базе?

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