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

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

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

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

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

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

Ниже разобраны оба способа с примерами кода, настройкой расписания, способами контроля выполнения и разбором типичных ошибок, из-за которых задание «не запускается» или завершается с ошибкой.

Что такое фоновое задание и когда оно нужно

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

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

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

Программный запуск: ФоновыеЗадания.Выполнить

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

// В общем модуле ДлительныеОперацииСервер (Сервер, Вызов сервера)

Процедура ЗагрузитьДанныеОбмена(ПараметрыОбмена, АдресРезультата) Экспорт

Результат = ВыполнитьЗагрузку(ПараметрыОбмена);

ПоместитьВоВременноеХранилище(Результат, АдресРезультата);

КонецПроцедуры

// В коде, который запускает задание

ПараметрыМетода = Новый Массив;

ПараметрыМетода.Добавить(ПараметрыОбмена);

ПараметрыМетода.Добавить(АдресРезультата);

Задание = ФоновыеЗадания.Выполнить(

"ДлительныеОперацииСервер.ЗагрузитьДанныеОбмена",

ПараметрыМетода,

,

"Загрузка данных обмена");

Имя метода указывается строкой в формате «ИмяОбщегоМодуля.ИмяПроцедуры». Если модуль не серверный, не экспортный или имя указано с ошибкой, задание завершится с исключением сразу после старта. Параметры передаются массивом строго в том порядке, в котором они объявлены в процедуре.

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

bsl
Задание = ФоновыеЗадания.Выполнить("МойМодуль.МояПроцедура", ПараметрыМетода, , "Моё задание");
ИдентификаторЗадания = Задание.УникальныйИдентификатор;

Длительные операции в БСП: готовый механизм

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

ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();

ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка данных'");

ПараметрыВыполнения.ОжидатьЗавершение = 0; // не ждать, вернуть управление сразу

Результат = ДлительныеОперации.ВыполнитьПроцедуру(

ПараметрыВыполнения,

"ДлительныеОперацииСервер.ЗагрузитьДанныеОбмена",

ПараметрыОбмена);

// Результат.Статус = "Выполняется" / "Выполнено" / "Ошибка"

// Результат.ИдентификаторЗадания — для последующей проверки

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

Запуск регламентного задания по расписанию

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

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

Запустить регламентное задание вручную вне расписания можно через консоль заданий (кнопка «Выполнить») или программно:

Отбор = Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.МоеЗадание);

Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);

Если Задания.Количество() > 0 Тогда

ФоновыеЗадания.Выполнить(Задания[0].Метаданные.ИмяМетода);

КонецЕсли;

Файловая и клиент-серверная база: в чём разница

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

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

Сравнение вариантов

ФоновыеЗадания.Выполнить

Разовый запуск из кода, передача параметров, полный контроль. Требует самостоятельной обработки ошибок и отслеживания состояния.

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

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

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

Периодические задачи без участия пользователя. Не принимает параметры, в файловой базе работает только при открытом сеансе.

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

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

Программно состояние проверяют по сохранённому идентификатору:

Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);

Если Задание <> Неопределено Тогда

// Задание.Состояние: Активно, Завершено, ЗавершеноАварийно, Отменено

// Задание.ИнформацияОбОшибке — причина аварийного завершения

КонецЕсли;

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

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

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

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

«Завершено», время окончания заполнено

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

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

Сообщения задания
Норма

Нет сообщений об ошибках

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

Есть сообщения с уровнем «Ошибка»

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

Событие начала и окончания задания без ошибок

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

Записи «Ошибка» по событию фонового задания

Прикладной результат
Норма

Данные загружены/документы проведены, отчёт сформирован

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

Данные не изменились, хотя задание завершилось

Типичные ошибки и их устранение

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

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

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

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

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

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

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

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

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

Почему регламентное задание не запускается по расписанию?

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

Можно ли передать параметры в регламентное задание?

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

Что значит состояние «Завершено аварийно»?

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

Как ограничить число одновременно работающих заданий?

Используйте ключ задания: два фоновых задания с одинаковым ключом одного метода не выполняются параллельно — второй запуск вызовет исключение. Для регламентных заданий ключ задаётся в свойствах. Дополнительно нагрузку регулируют настройками кластера серверов 1С.

Итог

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

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