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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Основы архитектуры регламентных заданий

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

Разберем основные свойства регламентного задания, которые нам понадобятся:

  1. Метаданные — ссылка на объект метаданных в конфигурации.
  2. Имя метода — процедура в общем модуле (обязательно серверном), которая будет выполняться.
  3. Использование — флаг активности задания.
  4. Расписание — объект РасписаниеРегламентногоЗадания.

Создание регламентного задания в конфигураторе

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

Для создания выполним следующие шаги:

  1. Перейдем в ветку Общие -> Регламентные задания.
  2. Добавим новое задание, укажем имя (например, ОбновлениеЦенНоменклатуры).
  3. В поле Имя метода выберем процедуру. Важно: процедура должна находиться в общем модуле с установленными флажками Сервер и Вызов сервера (либо без вызова, если модуль только серверный).
  4. Настроим расписание для ежедневного выполнения. Если вы используете актуальные версии платформы (начиная с 8.3.27), вам может пригодиться специальный конструктор Cron расписания для настройки рабочих процессов.

Программное управление регламентными заданиями

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


// Получаем регламентное задание по метаданным
МЗ = Метаданные.РегламентныеЗадания.ОбновлениеЦенНоменклатуры;
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(МЗ);

Если Задания.Количество() > 0 Тогда
    Задание = Задания[0];
Иначе
    // Если задания нет, создадим его программно
    Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(МЗ);
КонецЕсли;

// Настройка расписания: каждый день, раз в час
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.ПериодПовтораВТечениеДня = 3600; // в секундах
Задание.Расписание = НовоеРасписание;

// Активация и сохранение
Задание.Использование = Истина;
Задание.Записать();

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

Особенности работы в файловом режиме

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

Для обеспечения работы заданий в файловом режиме выполним следующие рекомендации:

  1. Выделенный сеанс: необходимо запустить один экземпляр 1С, который будет открыт постоянно. В этом сеансе система будет проверять необходимость запуска заданий.
  2. Параметр запуска: в старых версиях платформы использовался параметр /DoScheduledJobs, однако в актуальных версиях 8.3 это управляется программно или через настройки параметров информационной базы.
  3. Интервал проверки: проанализируем метод ВыполнитьОбработкуЗаданий(). Его можно вызывать в обработчике ПриОжидании, чтобы принудительно инициировать проверку очереди заданий.

Передача параметров в регламентное задание

Разберем по шагам, как передать данные в процедуру, выполняемую регламентным заданием. Поскольку задание выполняется автономно, мы не можем передать параметры напрямую при вызове. Для этого используется свойство Параметры объекта РегламентноеЗадание, которое представляет собой массив.


// Пример передачи параметров: Организация и Склад
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(СсылкаНаОрганизацию);
МассивПараметров.Добавить(СсылкаНаСклад);

Задание.Параметры = МассивПараметров;
Задание.Записать();

// В общем модуле процедура должна выглядеть так:
Процедура ВыполнитьОбработку(Организация, Склад) Экспорт
    // Логика обработки
КонецПроцедуры

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

Мониторинг и отладка

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


// Получаем историю последних 10 запусков конкретного задания
Отбор = Новый Структура;
Отбор.Вставить("РегламентноеЗадание", Задание);
История = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);

Для Каждого ТекЗадание Из История Цикл
    Если ТекЗадание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
        Сообщить("Ошибка в запуске от " + ТекЗадание.Начало + ": " + ТекЗадание.ИнформацияОбОшибке.Описание);
    КонецЕсли;
КонецЦикла;

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

Рекомендации по написанию кода для заданий

При написании кода, который будет выполняться в фоне, следует придерживаться строгих правил:

Используя приведенные инструкции и примеры кода, мы можем построить надежную систему автоматизации в 1С, которая будет эффективно работать в любых инфраструктурных условиях.

← На главную