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

Администрирование · 11 мин

Фоновые задания в 1С: что это и как с ними работать

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

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

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

Типичная ситуация, где без фонового задания не обойтись, — обработка большого массива данных. Если запустить пересчёт себестоимости по сотням тысяч записей в интерактивном режиме, сеанс пользователя «зависнет» до завершения операции. Запуск той же процедуры в фоне освобождает интерфейс, а результат пользователь получает после завершения.

Что такое фоновое задание и как оно устроено

Фоновое задание — это объект исполнения, который платформа создаёт для запуска экспортируемой процедуры или функции общего модуля. Каждое задание получает уникальный идентификатор (UUID), наименование, состояние и привязку к информационной базе. Управление выполняется через менеджер фоновых заданий — программный интерфейс платформы.

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

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

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

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

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

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

Программный запуск (ФоновыеЗадания.Выполнить)

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

Регламентное задание по расписанию

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

Внешний планировщик (Windows Task Scheduler, cron)

Подходит для файловых баз без постоянно работающего сеанса. Запускает 1С в пакетном режиме с указанной обработкой.

Как программно запустить фоновое задание

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

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

ПараметрыЗадания.Добавить(ПериодОтчета);

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

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

"ОтчетыОбработчики.СформироватьОтчетВФоне",

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

"Отчет_" + Строка(Организация),

"Формирование отчета за период");

ИдентификаторЗадания = Задание.УникальныйИдентификатор;

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

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

Требования к коду, выполняемому в фоне

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

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

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

Как отслеживать и диагностировать фоновые задания

Основной инструмент администратора — консоль заданий. В типовых конфигурациях на БСП она доступна в разделе администрирования («Регламентные и фоновые задания»). Там видны список заданий, их состояние, время начала и окончания, а также текст ошибки при аварийном завершении.

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

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

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

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

«Завершено», время выполнения соответствует ожиданиям

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

«Завершено аварийно» или задание висит в состоянии «Активно» неестественно долго

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

Нет ошибок по имени метода задания

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

Исключения, ошибки блокировок, обрывы соединения с СУБД

Результат работы
Норма

Данные обновлены, отчёт сформирован, обмен прошёл

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

Данные не изменились или изменились частично

Типичные проблемы и ограничения

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

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

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

Типичные ошибки
01
Интерактивные вызовы в фоновом коде — задание падает с ошибкой сразу после старта
02
Попытка вернуть результат напрямую из процедуры вместо временного хранилища — вызывающий код получает пустоту
03
Одинаковый ключ у разных логических задач — второе задание не запускается из-за конфликта уникальности
04
Длинная транзакция на всю обработку — блокировки пользователей и риск отката всей работы при сбое
05
Отсутствие обработки аварийного завершения — пользователь не узнает, что операция не выполнена

Когда фоновые задания не нужны

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

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

Маршрут решения

Как выбрать действие

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

FAQ: частые вопросы о фоновых заданиях в 1С

Можно ли отменить зависшее фоновое задание?

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

Почему фоновое задание не видит мои данные из формы?

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

Сколько фоновых заданий может работать одновременно?

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

Чем фоновое задание отличается от длительной операции в БСП?

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

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

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

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

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

Итог

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

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