Разработка и Конфигурация · 12 мин
Как запустить регламентное задание 1С 8.3 программно
Как программно запустить регламентное задание в 1С 8.3: методы Выполнить, НайтиПоУникальномуИдентификатору, типовые процедуры БСП, ошибки и проверка результата.
Регламентные задания в 1С 8.3 обычно выполняются по расписанию, но на практике регулярно возникает потребность запустить их принудительно — прямо сейчас, не дожидаясь очередного срабатывания. Это нужно при отладке обработчиков, при ручной синхронизации данных, при восстановлении после сбоя или когда пользователь должен инициировать тяжёлую операцию кнопкой в форме.
Платформа предоставляет несколько способов программного запуска: через метод Выполнить() объекта регламентного задания, через создание фонового задания с указанием метода и через механизмы типовой Библиотеки стандартных подсистем (БСП). Выбор зависит от того, где выполняется код — на клиенте или на сервере, — и от того, нужно ли дождаться результата.
Важно понимать разницу: прямой вызов процедуры-обработчика — это не запуск регламентного задания, а просто вызов метода. При таком вызове не создаётся фоновое задание, не пишется история выполнения в консоль заданий и не действуют настройки расписания. Ниже разберём все рабочие варианты с готовым кодом и проверкой результата.
Как найти нужное регламентное задание в коде
Прежде чем запустить задание, его нужно получить. Менеджер РегламентныеЗадания предлагает три пути: поиск по уникальному идентификатору, отбор по метаданным и получение полного списка с фильтрацией. Самый надёжный способ — поиск по метаданным, потому что идентификаторы различаются между информационными базами (например, в рабочей базе и в копии для тестов).
// Поиск по имени метаданных регламентного задания
Отбор = Новый Структура;
Отбор.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОбновлениеКурсовВалют);
Найденные = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Если Найденные.Количество() = 0 Тогда
ВызватьИсключение "Регламентное задание не найдено в базе";
КонецЕсли;
Задание = Найденные[0];
Если задание предопределённое, оно существует в базе всегда. Непредопределённое задание создаётся программно или администратором, и его отсутствие нужно обрабатывать как штатную ситуацию, а не как ошибку. Для поиска по идентификатору используется метод НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(СтрокаGUID)) — он удобен, когда идентификатор хранится в настройках вашей подсистемы.
Запуск задания методом Выполнить()
После того как объект задания получен, запуск выполняется одной строкой. Метод Выполнить() создаёт фоновое задание, которое исполняет процедуру, указанную в свойстве ИмяМетода регламентного задания. Вызов неблокирующий: управление возвращается сразу, а само задание выполняется асинхронно на сервере.
Процедура ЗапуститьОбновлениеКурсовНаСервере() Экспорт
Отбор = Новый Структура;
Отбор.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОбновлениеКурсовВалют);
Найденные = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Если Найденные.Количество() > 0 Тогда
Найденные[0].Выполнить();
КонецЕсли;
КонецПроцедуры
Обратите внимание: метод Выполнить() доступен только в серверном контексте. Если вызвать его из клиентской процедуры, получите ошибку о недопустимости вызова. Поэтому кнопка в управляемой форме должна вызывать серверную процедуру с директивой &НаСервере или &НаСервереБезКонтекста.
Ещё одна особенность — метод не возвращает ссылку на созданное фоновое задание. Если нужно отслеживать состояние выполнения, ищите фоновое задание отбором по имени метода и времени начала, либо используйте альтернативный способ через ФоновыеЗадания.Выполнить(), который сразу возвращает объект фонового задания.
Запуск через ФоновыеЗадания.Выполнить()
Этот способ не запускает регламентное задание как объект, а создаёт фоновое задание, которое вызывает ту же процедуру-обработчик. Плюс подхода — полный контроль: вы получаете объект фонового задания, можете передать параметры, задать ключ и наименование, дождаться завершения методом ОжидатьЗавершенияВыполнения().
// Имя метода — общий серверный модуль и экспортная процедура
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(ДатаНачала);
ФоновоеЗадание = ФоновыеЗадания.Выполнить(
"ОбработкаДанныхСервер.ВыполнитьЗагрузку",
ПараметрыМетода,
"КлючЗагрузки_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMddHHmmss"),
"Загрузка данных (ручной запуск)");
// Дождаться завершения не дольше 5 минут
Попытка
ФоновоеЗадание.ОжидатьЗавершенияВыполнения(300);
Исключение
// Таймаут или ошибка выполнения
КонецПопытки;
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
// Успех
ИначеЕсли ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
Сообщить(ФоновоеЗадание.ИнформацияОбОшибке.Описание);
КонецЕсли;
Имя метода задаётся строкой в формате «ИмяОбщегоМодуля.ИмяПроцедуры». Модуль обязан быть серверным, неглобальным, с установленным признаком «Вызов сервера» — если вызываете его из фонового задания. Процедура должна быть экспортной. Параметры передаются массивом, и их состав должен точно совпадать с сигнатурой процедуры, иначе получите ошибку вызова.
Сравнение способов запуска
Запуск именно регламентного задания с сохранением его настроек. Не возвращает объект фонового задания, параметры передать нельзя.
Полный контроль: параметры, ключ, ожидание завершения. Но это запуск метода, а не задания — расписание и настройки задания не участвуют.
Удобные обёртки для типовых конфигураций, единый подход к длительным операциям. Требует наличия БСП в конфигурации.
Запуск в типовых конфигурациях на базе БСП
В конфигурациях на Библиотеке стандартных подсистем (УТ 11, ERP, Бухгалтерия 3.0, ЗУП 3.1) есть готовые программные интерфейсы. Для ручного запуска регламентного задания используется служебный модуль:
// Только для конфигураций с БСП
Результат = РегламентныеЗаданияСлужебный.ВыполнитьРегламентноеЗаданиеВручную(Задание);
Если Результат.ЗапускВыполнен Тогда
// Задание запущено
Иначе
Сообщить(Результат.ОписаниеОшибки);
КонецЕсли;
Для длительных операций, которые нужно запустить из формы с индикатором прогресса, БСП предлагает механизм длительных операций: ДлительныеОперации.ВыполнитьВФоне() на сервере и ДлительныеОперацииКлиент.ОжидатьЗавершение() на клиенте. Это рекомендуемый путь для кнопок «Выполнить обмен» и подобных — пользователь видит прогресс, а форма не зависает.
Проверьте также, не заблокировано ли задание. В типовых конфигурациях регламентные задания могут быть отключены через обработку «Регламентные и фоновые задания», а в серверном кластере — через консоль кластера. Запуск заблокированного задания методом Выполнить() обычно проходит, но в некоторых сценариях БСП ручной запуск отклоняется с пояснением.
Типичные ошибки и ограничения
Самая частая проблема — попытка вызвать запуск из клиентского контекста. Вторая по частоте — обращение к методам, недоступным в фоновом задании: внутри фонового задания нельзя открывать формы, вызывать модальные диалоги, работать с Предупреждение() и Вопрос(). Если обработчик задания содержит такие вызовы, фоновое задание завершится аварийно.
Третья группа ошибок связана с правами. Пользователь, из-под которого выполняется программный запуск, должен иметь права на все объекты, которые читает и изменяет обработчик. Фоновое задание наследует права пользователя, создавшего его, если в коде явно не указано иное. Поэтому задание, успешно работающее под администратором, может падать под рядовым пользователем с ошибкой доступа.
Как проверить результат выполнения
Признак успешного запуска — появившееся фоновое задание с состоянием «Активно» или «Завершено». Программно список получают через ФоновыеЗадания.ПолучитьФоновыеЗадания() с отбором по имени метода или ключу. Для диагностики полезно сохранять идентификатор фонового задания в журнал вашей подсистемы.
Отбор = Новый Структура;
Отбор.Вставить("ИмяМетода", "ОбработкаДанныхСервер.ВыполнитьЗагрузку");
Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
Активные = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если Активные.Количество() > 0 Тогда
// Задание уже выполняется — повторный запуск не нужен
КонецЕсли;
Визуально результат проверяется в типовых конфигурациях через раздел «Администрирование → Обслуживание → Регламентные и фоновые задания». Там видны состояние, время начала и окончания, а также текст ошибки для аварийно завершённых заданий. Дополнительно все исключения фоновых заданий фиксируются в журнале регистрации — фильтруйте события по имени пользователя и уровню «Ошибка».
Как проверить результат
Завершено
ЗавершеноАварийно или Активно дольше обычного времени выполнения
Нет ошибок по пользователю в момент запуска
Записи уровня Ошибка с текстом исключения из обработчика
Данные появились или обновились в ожидаемых объектах
Задание завершено, но данные не изменились — проверяйте логику отборов и права
Защита от повторного запуска и блокировки
Если кнопка ручного запуска доступна пользователям, защититесь от двойного нажатия и параллельных запусков. Простейший способ — проверка активных фоновых заданий с тем же именем метода перед стартом, как показано в примере выше. Более строгий вариант — объектная блокировка служебной константы или запись в регистр сведений «Признак выполнения» в транзакции.
Для заданий, критичных к конкурентному доступу, задайте свойство регламентного задания Ключ: платформа не допускает одновременного выполнения двух фоновых заданий с одинаковым ключом. Это встроенный механизм защиты, который работает и при автоматическом запуске по расписанию, и при программном.
- 1Найдите задание отбором по метаданным и убедитесь, что оно существует
- 2Проверьте, нет ли активного фонового задания с тем же методом
- 3Запустите задание методом Выполнить() в серверной процедуре
- 4Получите состояние фонового задания и проверьте отсутствие аварийного завершения
- 5Проверьте журнал регистрации и фактическое изменение данных
Частые вопросы по программному запуску
Можно ли запустить регламентное задание с клиента напрямую?
Нет, менеджер регламентных заданий и метод Выполнить() доступны только на сервере. Из клиентской процедуры вызывайте серверную (&НаСервере или &НаСервереБезКонтекста), в которой выполняется поиск и запуск задания.
Чем запуск задания отличается от прямого вызова процедуры-обработчика?
При прямом вызове код выполняется синхронно в текущем сеансе и блокирует пользователя до завершения. Запуск задания создаёт фоновое задание: код исполняется асинхронно на сервере, а сеанс пользователя остаётся свободным.
Как передать параметры в регламентное задание при запуске?
Метод Выполнить() параметров не принимает. Если нужны параметры, используйте ФоновыеЗадания.Выполнить() с массивом параметров, либо сохраните настройки в хранилище (константа, регистр сведений), откуда обработчик задания прочитает их сам.
Почему задание запускается, но сразу завершается аварийно?
Чаще всего причина в обращении к недоступной в фоновом задании функциональности (формы, диалоги, клиентские объекты) или в нехватке прав у пользователя. Точный текст ошибки смотрите в свойстве ИнформацияОбОшибке фонового задания и в журнале регистрации.
Как отменить уже запущенное фоновое задание программно?
Получите объект задания через ФоновыеЗадания.НайтиПоУникальномуИдентификатору() и вызовите метод Отменить(). Учтите: отмена прерывает выполнение принудительно, поэтому обработчик должен корректно переживать обрыв — не оставлять незавершённые транзакции с частично записанными данными.
Работает ли программный запуск в файловой базе?
Да, метод Выполнить() работает и в файловом варианте, но фоновое задание исполняется внутри процесса клиентского приложения. Это значит: при закрытии программы выполнение прервётся, а тяжёлая операция будет нагружать тот же компьютер, где работает пользователь.
Что важно запомнить
Программный запуск регламентного задания выполняется на сервере методом Выполнить() или через ФоновыеЗадания.Выполнить() с контролем состояния. Перед запуском проверяйте отсутствие активных дублей, после — состояние завершения и журнал регистрации. Обработчик задания не должен содержать клиентских вызовов и должен корректно работать под правами запускающего пользователя.