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

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

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

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

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

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

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

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

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

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

Получение ссылки на регламентное задание

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

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

Новый УникальныйИдентификатор("a1b2c3d4-..."));

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

Отбор = Новый Структура("ИмяМетода", "ВыполнитьОбменДанными");

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

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

Задание = Найденные[0];

КонецЕсли;

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

Способ 1. Прямой вызов метода ВыполнитьРегламентноеЗадание

Менеджер регламентных заданий предоставляет метод, который выполняет задание немедленно в текущем сеансе:

РегламентныеЗадания.ВыполнитьРегламентноеЗадание(Задание);

Это синхронный вызов: сеанс пользователя блокируется до завершения процедуры. Для коротких операций (несколько секунд) это приемлемо, для длительных обменов — нет. Метод доступен только на сервере, поэтому вызывайте его из серверной процедуры или из серверного вызова общего модуля.

Способ 2. Запуск через фоновое задание

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

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

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

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

Задание.ИмяМетода,

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

Задание.Ключ,

Задание.Наименование);

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

Метод возвращает объект ФоновоеЗадание, по которому можно отслеживать состояние выполнения, что невозможно при прямом вызове.

bsl
Попытка
    ФЗ = ФоновыеЗадания.Выполнить(Задание.ИмяМетода, , Задание.Ключ, Задание.Наименование);
Исключение
    Сообщить("Задание уже выполняется");
КонецПопытки;

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

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

ФЗ.ОжидатьЗавершенияВыполнения(600);

Если ФЗ.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда

Сообщить(ПодробноеПредставлениеОшибки(ФЗ.ИнформацияОбОшибке));

КонецЕсли;

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

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

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

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

Завершено

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

ЗавершеноАварийно или зависло в состоянии Активно

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

Есть событие о запуске метода без ошибок

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

Записи с уровнем Ошибка по имени метода

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

Данные обмена или обработки появились в базе

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

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

Ограничения и особенности режимов работы

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

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

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

Типичные ошибки при программном запуске

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

Отдельно стоит упомянуть права доступа. Пользователь, из-под которого выполняется программный запуск, должен иметь права на все объекты, которые затрагивает метод задания. Частая ситуация: по расписанию задание работает (выполняется от имени служебного сеанса с полными правами), а при ручном программном запуске падает с ошибкой доступа. Решение — либо запускать код в привилегированном режиме (УстановитьПривилегированныйРежим(Истина)) там, где это оправдано, либо выдать пользователю необходимые права.

Итог

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

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

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

Можно ли запустить регламентное задание с тонкого клиента?

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

Как запустить задание, если оно отключено (Использование = Ложь)?

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

Что делать, если при запуске ошибка «Фоновое задание с таким ключом уже выполняется»?

Это штатная защита от параллельного выполнения. Найдите активное задание через ФоновыеЗадания.ПолучитьФоновыеЗадания с отбором по ключу и дождитесь его завершения, либо сообщите пользователю, что операция уже идёт. Если задание «зависло», его можно отменить методом Отменить.

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

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

Почему задание работает по расписанию, но падает при ручном запуске из-под пользователя?

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

Можно ли запустить регламентное задание через внешнюю обработку?

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