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