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