Разработка и Конфигурация · 10 мин
Как запустить регламентное задание программно в 1С
Как программно запустить регламентное задание в 1С: метод ВыполнитьРегламентноеЗадание, фоновые задания, проверка результата, типичные ошибки и FAQ.
Обмен не выполнился по расписанию, данные нужно выгрузить повторно, а процедуру регламентного задания требуется отладить прямо сейчас — в 1С для программного запуска достаточно вызвать метод объекта метаданных или запустить процедуру через фоновое задание с возможностью отследить её состояние и дождаться завершения.
Ключевой момент, который нужно понять сразу: регламентное задание в 1С — это не сама процедура, а объект метаданных, который по расписанию вызывает экспортную процедуру общего модуля. Поэтому «запустить регламентное задание» можно двумя принципиально разными путями: вызвать его метод напрямую или создать фоновое задание, связанное с регламентным. Выбор зависит от того, нужен ли вам контроль выполнения, журнал регистрации и неблокирующий режим работы.
Ниже разобраны рабочие способы запуска, получение ссылки на задание по имени или уникальному идентификатору, проверка результата и ограничения, о которых часто забывают при переносе кода из файловой базы в клиент-серверный режим.
Как устроен запуск регламентных заданий в 1С
Регламентное задание описывается в конфигураторе: у него есть имя, расписание, имя метода (экспортная процедура общего модуля) и признак использования. Планировщик сервера 1С (или отдельное соединение в файловом режиме) периодически проверяет расписание и создаёт фоновое задание, которое исполняет указанный метод. То есть фактическое выполнение всегда происходит в рамках фонового задания.
Из этого следует важное следствие: когда вы запускаете регламентное задание программно, вы либо имитируете работу планировщика (создаёте фоновое задание), либо вызываете метод напрямую в текущем сеансе. Первый вариант безопаснее для пользователя — интерфейс не блокируется, а ход выполнения виден в консоли заданий.
Получение ссылки на регламентное задание
Перед запуском нужно получить объект РегламентноеЗадание. Самый надёжный способ — поиск по уникальному идентификатору, который виден в консоли заданий или в свойствах задания:
Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(
Новый УникальныйИдентификатор("a1b2c3d4-..."));
Если идентификатор неизвестен, используйте отбор по имени метода или по имени задания через коллекцию РегламентныеЗадания.ПолучитьРегламентныеЗадания() со структурой отбора:
Отбор = Новый Структура("ИмяМетода", "ВыполнитьОбменДанными");
Найденные = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Если Найденные.Количество() > 0 Тогда
Задание = Найденные[0];
КонецЕсли;
Учтите, что отбор по имени метода может вернуть несколько заданий, если один и тот же метод используется в разных регламентных заданиях. В таком случае уточняйте отбор дополнительными полями или переходите на поиск по идентификатору — это исключает запуск «не того» задания.
Способ 1. Прямой вызов метода ВыполнитьРегламентноеЗадание
Менеджер регламентных заданий предоставляет метод, который выполняет задание немедленно в текущем сеансе:
РегламентныеЗадания.ВыполнитьРегламентноеЗадание(Задание);
Это синхронный вызов: сеанс пользователя блокируется до завершения процедуры. Для коротких операций (несколько секунд) это приемлемо, для длительных обменов — нет. Метод доступен только на сервере, поэтому вызывайте его из серверной процедуры или из серверного вызова общего модуля.
Способ 2. Запуск через фоновое задание
Рекомендуемый вариант для длительных операций — создать фоновое задание, которое выполнит тот же метод, что и регламентное:
Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Ид);
ПараметрыМетода = Новый Массив;
ФоновоеЗадание = ФоновыеЗадания.Выполнить(
Задание.ИмяМетода,
ПараметрыМетода,
Задание.Ключ,
Задание.Наименование);
Передача Ключ регламентного задания важна: фоновые задания с одинаковым ключом не могут выполняться одновременно. Это защищает от параллельного запуска одного и того же обмена, который может привести к блокировкам и дублированию данных. Если задание уже выполняется, попытка запуска с тем же ключом вызовет исключение — его нужно обработать и сообщить пользователю, что операция уже идёт.
Метод возвращает объект ФоновоеЗадание, по которому можно отслеживать состояние выполнения, что невозможно при прямом вызове.
Попытка
ФЗ = ФоновыеЗадания.Выполнить(Задание.ИмяМетода, , Задание.Ключ, Задание.Наименование);
Исключение
Сообщить("Задание уже выполняется");
КонецПопытки;Контроль выполнения и проверка результата
После запуска фонового задания проверяйте его состояние через свойство Состояние: оно принимает значения Активно, Завершено, ЗавершеноАварийно или Отменено. Для ожидания завершения используется метод ОжидатьЗавершенияВыполнения(Таймаут), а текст ошибки доступен через ИнформацияОбОшибке:
ФЗ.ОжидатьЗавершенияВыполнения(600);
Если ФЗ.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
Сообщить(ПодробноеПредставлениеОшибки(ФЗ.ИнформацияОбОшибке));
КонецЕсли;
Дополнительно результат фиксируется в журнале регистрации: фоновые задания пишут туда события запуска и ошибок. Если задание завершилось аварийно без видимых сообщений в интерфейсе, первым делом откройте журнал регистрации с отбором по имени метода или по фоновому заданию.
Как проверить результат
Завершено
ЗавершеноАварийно или зависло в состоянии Активно
Есть событие о запуске метода без ошибок
Записи с уровнем Ошибка по имени метода
Данные обмена или обработки появились в базе
Задание завершено, но данных нет — метод отработал с пропуском логики
Ограничения и особенности режимов работы
В файловом режиме регламентные задания выполняются только если запущен отдельный сеанс с разрешённым выполнением заданий (или включён соответствующий параметр запуска). Программный запуск через фоновое задание в файловой базе тоже зависит от этого: убедитесь, что выполнение регламентных заданий не отключено в параметрах информационной базы.
В клиент-серверном режиме задания исполняет рабочий процесс сервера 1С. Там действуют ограничения: количество фоновых заданий на один рабочий процесс, возможная блокировка выполнения регламентных заданий на уровне кластера (свойство информационной базы «Блокировка регламентных заданий» — она же отключает и программный запуск через планировщик). Проверьте этот флаг, если задание «молча» не стартует.
Ещё одно ограничение: метод регламентного задания не должен интерактивно взаимодействовать с пользователем. Вызовы Предупреждение, Вопрос, открытие форм внутри метода приведут к ошибке, потому что фоновое задание выполняется без интерфейса.
Типичные ошибки при программном запуске
Отдельно стоит упомянуть права доступа. Пользователь, из-под которого выполняется программный запуск, должен иметь права на все объекты, которые затрагивает метод задания. Частая ситуация: по расписанию задание работает (выполняется от имени служебного сеанса с полными правами), а при ручном программном запуске падает с ошибкой доступа. Решение — либо запускать код в привилегированном режиме (УстановитьПривилегированныйРежим(Истина)) там, где это оправдано, либо выдать пользователю необходимые права.
Что важно запомнить
Для длительных операций запускайте регламентное задание через ФоновыеЗадания.Выполнить с передачей ключа задания — это не блокирует сеанс и защищает от параллельного запуска. Ссылку получайте по уникальному идентификатору, результат проверяйте по состоянию фонового задания и журналу регистрации. Все вызовы выполняйте только на сервере.
Частые вопросы
Можно ли запустить регламентное задание с тонкого клиента?
Напрямую — нет: менеджер регламентных заданий доступен только на сервере. С тонкого клиента вызовите серверную процедуру общего модуля (с признаком «Сервер» и «Вызов сервера»), которая выполнит запуск. Именно так устроены кнопки «Выполнить сейчас» в типовых конфигурациях.
Как запустить задание, если оно отключено (Использование = Ложь)?
Программный запуск через фоновое задание не проверяет признак использования — он влияет только на срабатывание по расписанию. Поэтому отключённое задание можно запустить вручную: создайте фоновое задание с его методом и ключом. Прямой вызов метода процедуры общего модуля тоже работает независимо от этого флага.
Что делать, если при запуске ошибка «Фоновое задание с таким ключом уже выполняется»?
Это штатная защита от параллельного выполнения. Найдите активное задание через ФоновыеЗадания.ПолучитьФоновыеЗадания с отбором по ключу и дождитесь его завершения, либо сообщите пользователю, что операция уже идёт. Если задание «зависло», его можно отменить методом Отменить.
Как передать параметры в метод регламентного задания?
Метод регламентного задания объявляется без параметров, и планировщик вызывает его именно так. Если нужны параметры, создайте отдельную экспортную процедуру с параметрами и запускайте её через ФоновыеЗадания.Выполнить, передав массив параметров вторым аргументом. Либо сохраняйте настройки в константе или регистре, откуда метод их прочитает при старте.
Почему задание работает по расписанию, но падает при ручном запуске из-под пользователя?
Чаще всего причина в правах: по расписанию задание выполняется в служебном сеансе с полными правами, а ручной запуск наследует права текущего пользователя. Проверьте журнал регистрации на ошибки доступа и при необходимости выполните критичные операции в привилегированном режиме.
Можно ли запустить регламентное задание через внешнюю обработку?
Да. В модуле обработки (на сервере) доступны те же менеджеры РегламентныеЗадания и ФоновыеЗадания. Это удобный способ сделать сервисную кнопку «запустить обмен» без изменения конфигурации — обработку можно открыть в режиме предприятия в любой базе с нужными правами.