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

Разработка и Конфигурация · 12 мин

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

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

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

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

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

Как устроены фоновые задания в платформе 1С

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

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

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

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

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

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

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

Фоновое или регламентное: что выбрать

Фоновое задание

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

Регламентное задание

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

Длительные операции (БСП)

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

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

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

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

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

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

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

Где посмотреть выполняющиеся задания и их результат

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

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

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

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

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

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

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

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

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

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

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

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

Отладка фонового задания

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

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

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

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

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

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

Итог

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

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

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

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

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

Что произойдёт с фоновым заданием, если закрыть программу?

В клиент-серверном режиме — ничего: задание выполняет сервер, и закрытие клиентского приложения на него не влияет. В файловом режиме задание выполняется внутри процесса запустившего его приложения, поэтому закрытие программы прервёт выполнение.

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

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

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

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

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

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

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

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