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