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

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

Фоновые задания в 1С: как они работают и как их использовать

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

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

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

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

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

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

Каждое фоновое задание имеет уникальный идентификатор (UUID), состояние (Активно, Завершено, ЗавершеноАварийно, Отменено) и может быть связано с регламентным заданием. Состояние и информация об ошибках хранятся в системе, что позволяет программно отслеживать ход выполнения.

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

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

Эти два механизма часто путают, но у них разная роль. Регламентное задание — это расписание: оно описывает, что и когда должно выполняться автоматически (каждую ночь, каждые 10 минут). Фоновое задание — это конкретный запуск выполнения кода. Каждый раз, когда срабатывает регламентное задание, платформа порождает фоновое задание, связанное с ним.

Фоновое задание можно запустить и вручную из кода — без всякого расписания. Например, пользователь нажал кнопку «Сформировать отчёт», и обработка ушла в фон. Регламентное же задание само по себе ничего не запускает вне расписания (хотя его можно инициировать принудительно через консоль заданий).

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

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

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

bsl
ПараметрыПроцедуры = Новый Массив;
ПараметрыПроцедуры.Добавить(ПериодОтчета);

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

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

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

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

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

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

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

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

Для визуального контроля администраторы используют консоль заданий — стандартную обработку из состава БСП или инструменты кластера серверов. Там видны активные и завершённые задания, время выполнения и тексты ошибок.

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

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

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

Значение «Завершено»

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

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

ИнформацияОбОшибке
Норма

Свойство пустое (Неопределено)

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

Заполнено описание ошибки — читайте текст и стек вызовов

Результат в базе или хранилище
Норма

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

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

Задание завершено, но данных нет — ошибка в логике процедуры

Особенности файлового и клиент-серверного режимов

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

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

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

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

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

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

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

Когда использовать фоновые задания, а когда — нет

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

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

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

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

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

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

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

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

Можно ли отменить запущенное фоновое задание?

Да. Программно используется метод ФоновыеЗадания.Отменить() с передачей уникального идентификатора. Отмена возможна, пока задание активно; уже завершённое задание отменить нельзя. Учтите, что отмена прерывает выполнение принудительно — если задание уже успело записать часть данных, откатывать их придётся самостоятельно в логике процедуры.

Почему фоновое задание завершается аварийно сразу после запуска?

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

Как передать в фоновое задание таблицу значений или сложный объект?

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

Выполняются ли регламентные задания, если никто не работает в базе?

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

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

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

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

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