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

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

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

Как программно запустить регламентное задание в 1С 8.3: методы Выполнить, НайтиПоУникальномуИдентификатору, типовые процедуры БСП, ошибки и проверка результата.

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

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

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

Как найти нужное регламентное задание в коде

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

// Поиск по имени метаданных регламентного задания

Отбор = Новый Структура;

Отбор.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОбновлениеКурсовВалют);

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

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

ВызватьИсключение "Регламентное задание не найдено в базе";

КонецЕсли;

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

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

Запуск задания методом Выполнить()

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

Процедура ЗапуститьОбновлениеКурсовНаСервере() Экспорт

Отбор = Новый Структура;

Отбор.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОбновлениеКурсовВалют);

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

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

Найденные[0].Выполнить();

КонецЕсли;

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

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

Ещё одна особенность — метод не возвращает ссылку на созданное фоновое задание. Если нужно отслеживать состояние выполнения, ищите фоновое задание отбором по имени метода и времени начала, либо используйте альтернативный способ через ФоновыеЗадания.Выполнить(), который сразу возвращает объект фонового задания.

Запуск через ФоновыеЗадания.Выполнить()

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

// Имя метода — общий серверный модуль и экспортная процедура

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

ПараметрыМетода.Добавить(ДатаНачала);

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

"ОбработкаДанныхСервер.ВыполнитьЗагрузку",

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

"КлючЗагрузки_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMddHHmmss"),

"Загрузка данных (ручной запуск)");

// Дождаться завершения не дольше 5 минут

Попытка

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

Исключение

// Таймаут или ошибка выполнения

КонецПопытки;

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

// Успех

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

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

КонецЕсли;

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

Сравнение способов запуска

Задание.Выполнить()

Запуск именно регламентного задания с сохранением его настроек. Не возвращает объект фонового задания, параметры передать нельзя.

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

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

API БСП

Удобные обёртки для типовых конфигураций, единый подход к длительным операциям. Требует наличия БСП в конфигурации.

Запуск в типовых конфигурациях на базе БСП

В конфигурациях на Библиотеке стандартных подсистем (УТ 11, ERP, Бухгалтерия 3.0, ЗУП 3.1) есть готовые программные интерфейсы. Для ручного запуска регламентного задания используется служебный модуль:

// Только для конфигураций с БСП

Результат = РегламентныеЗаданияСлужебный.ВыполнитьРегламентноеЗаданиеВручную(Задание);

Если Результат.ЗапускВыполнен Тогда

// Задание запущено

Иначе

Сообщить(Результат.ОписаниеОшибки);

КонецЕсли;

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

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

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

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

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

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

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

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

Отбор = Новый Структура;

Отбор.Вставить("ИмяМетода", "ОбработкаДанныхСервер.ВыполнитьЗагрузку");

Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);

Активные = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);

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

// Задание уже выполняется — повторный запуск не нужен

КонецЕсли;

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

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

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

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

Завершено

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

ЗавершеноАварийно или Активно дольше обычного времени выполнения

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

Нет ошибок по пользователю в момент запуска

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

Записи уровня Ошибка с текстом исключения из обработчика

Результат работы обработчика
Норма

Данные появились или обновились в ожидаемых объектах

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

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

Защита от повторного запуска и блокировки

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

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

Порядок безопасного ручного запуска
  1. 1
    Найдите задание отбором по метаданным и убедитесь, что оно существует
  2. 2
    Проверьте, нет ли активного фонового задания с тем же методом
  3. 3
    Запустите задание методом Выполнить() в серверной процедуре
  4. 4
    Получите состояние фонового задания и проверьте отсутствие аварийного завершения
  5. 5
    Проверьте журнал регистрации и фактическое изменение данных

Частые вопросы по программному запуску

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

Нет, менеджер регламентных заданий и метод Выполнить() доступны только на сервере. Из клиентской процедуры вызывайте серверную (&НаСервере или &НаСервереБезКонтекста), в которой выполняется поиск и запуск задания.

Чем запуск задания отличается от прямого вызова процедуры-обработчика?

При прямом вызове код выполняется синхронно в текущем сеансе и блокирует пользователя до завершения. Запуск задания создаёт фоновое задание: код исполняется асинхронно на сервере, а сеанс пользователя остаётся свободным.

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

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

Почему задание запускается, но сразу завершается аварийно?

Чаще всего причина в обращении к недоступной в фоновом задании функциональности (формы, диалоги, клиентские объекты) или в нехватке прав у пользователя. Точный текст ошибки смотрите в свойстве ИнформацияОбОшибке фонового задания и в журнале регистрации.

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

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

Работает ли программный запуск в файловой базе?

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

Итог

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

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