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