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

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

Что означает фоновое задание в 1С и как с ним работать

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

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

Механизм встроен в платформу 1С:Предприятие и доступен во всех современных конфигурациях — от «Бухгалтерии предприятия» до «Управления торговлей» и «ERP». Именно через фоновые задания работают обмены с сайтами, синхронизация с банками, обновление курсов валют и многие типовые операции, которые пользователь видит как «выполняется автоматически».

Важно понимать разницу между двум родственными понятиями. Фоновое задание — это разовый запуск произвольной процедуры. Регламентное задание — это расписание, по которому платформа сама запускает фоновые задания. Когда в консоли заданий вы видите строку «Загрузка курсов валют», это регламентное задание, а каждый его фактический запуск — отдельное фоновое задание со своим состоянием и историей.

Как устроен механизм фоновых заданий

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

Каждое фоновое задание имеет жизненный цикл: оно создаётся, переходит в состояние «Активно», затем завершается успешно, завершается с ошибкой или отменяется принудительно. Информацию о запусках можно посмотреть через метод ФоновыеЗадания.ПолучитьФоновыеЗадания() или в типовой обработке «Консоль заданий», которая входит в состав Библиотеки стандартных подсистем.

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

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

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

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

КритерийФоновое заданиеРегламентное задание
Что этоРазовый запуск процедурыОбъект метаданных с расписанием
Как запускаетсяМетодом Выполнить() или регламентным заданиемАвтоматически по расписанию или вручную
РасписаниеНетЕсть, настраивается отдельно
Где создаётсяВ коде, программноВ конфигураторе, раздел «Общие»
СостояниеАктивно / Завершено / Ошибка / ОтмененоИспользуется / Не используется, блокировки

Где фоновые задания встречаются в типовых конфигурациях

Большинство пользователей сталкиваются с фоновыми заданиями, даже не подозревая об этом. В «1С:Бухгалтерии» в фоне выполняются загрузка курсов валют, обмен с банками по прямому обмену, отложенное проведение документов, обновление классификаторов. В «Управлении торговлей» — синхронизация с сайтом, расчёт себестоимости, рассылка отчётов. В «Зарплате и управлении персоналом» — обмен с ЕФС-1 и расчётные операции.

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

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

Индикатор не исчезаетЗадание зависло или упало с ошибкой

Проверить состояние в консоли заданий и журнал регистрации

Данные не обновляютсяРегламентное задание не запускается

Проверить расписание, признак использования и блокировки

Ошибка в журнале регистрацииФоновый сеанс аварийно завершился

Найти событие с именем задания и текстом исключения

База тормозит ночьюТяжёлые задания накладываются друг на друга

Развести расписания по времени

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

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

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

bsl
ПараметрыВызова = Новый Массив;
ПараметрыВызова.Добавить(СсылкаНаДокумент);
ПараметрыВызова.Добавить(АдресХранилища);

Задание = ФоновыеЗадания.Выполнить(
    "ОбработкаДанных.ВыполнитьДлительнуюОперацию",
    ПараметрыВызова,
    "Ключ_" + Строка(СсылкаНаДокумент.УникальныйИдентификатор()),
    "Обработка документа " + СсылкаНаДокумент.Номер);

Уникальный ключ защищает от дублирования: если задание с таким ключом уже активно, повторный вызов выбросит исключение. Это удобно, чтобы не запускать одну и ту же обработку по одному объекту дважды. Для ожидания завершения в коде используется метод ОжидатьЗавершенияВыполнения() с таймаутом.

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

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

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

Порядок диагностики упавшего задания
  1. 1
    Открыть консоль заданий и найти задание с состоянием «Ошибка»
  2. 2
    Скопировать текст ошибки из свойств задания
  3. 3
    Открыть журнал регистрации с отбором по имени задания за нужный период
  4. 4
    Определить причину: права, блокировка, ошибка в коде, нехватка ресурсов
  5. 5
    Исправить причину и перезапустить задание вручную
  6. 6
    Убедиться, что задание завершилось успешно и данные обновились
Контрольные точки

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

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

Завершено, без текста ошибки

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

Ошибка, Отменено или вечное Активно

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

Нет событий ошибок по этому заданию

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

Повторяющиеся исключения с одним текстом

Фактические данные
Норма

Курсы, остатки, отчёты обновились

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

Данные устарели, хотя задание «успешно»

Длительность выполнения
Норма

Укладывается в интервал между запусками

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

Задание работает дольше периода расписания

Типичные ошибки и ограничения

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

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

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

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

Ограничения и когда фоновое задание не подходит

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

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

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

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

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

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

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

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

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

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

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

Как отменить выполняющееся фоновое задание?

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

Расходует ли фоновое задание клиентскую лицензию?

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

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

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

Что делать, если регламентное задание вообще не запускается?

Проверьте по порядку: установлен ли признак «Использование» у задания; корректно ли расписание; не заблокировано ли задание в консоли; выполняется ли на сервере процедура обработки очереди заданий. В файловой базе регламентные задания запускаются только пока работает хотя бы один сеанс с включённым выполнением заданий.

Итог

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

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