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

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

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

Анализ механизмов регламентных заданий

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

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

Программное создание регламентного задания

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


НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ОбновлениеДанныхСайта");
НовоеЗадание.Наименование = "Регламентное обновление цен (программное)";
НовоеЗадание.Использование = Истина;
НовоеЗадание.Ключ = "УникальныйКлючЗадания_123";
Попытка
    НовоеЗадание.Записать();
Исключение
    Сообщить("Не удалось создать задание: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

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

Настройка расписания задания

Одной из самых сложных частей является настройка расписания. В 1С расписание описывается объектом РасписаниеРегламентногоЗадания. Разберем подробнее, как настроить ежедневное выполнение с интервалом в один час в рабочее время.

Проанализируем следующий пример кода:


Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовторенияВТечениеДня = 3600; // Интервал в секундах (1 час)
Расписание.ВремяНачала = '00010101090000'; // Начало в 09:00
Расписание.ВремяКонца = '00010101180000';   // Конец в 18:00
Расписание.ДниНедели = "ПН,ВТ,СР,ЧТ,ПТ";

НовоеЗадание.Расписание = Расписание;
НовоеЗадание.Записать();

Важно отметить, что если ВремяНачала и ВремяКонца не заданы, задание будет выполняться круглосуточно с указанным интервалом. Мы использовали свойство ПериодПовторенияВТечениеДня, чтобы обеспечить цикличность выполнения внутри одних суток.

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

Часто процедуре, которую вызывает задание, требуются входные данные (например, ссылка на склад или идентификатор узла обмена). Эти данные передаются через массив Параметры. Посмотрим на пример реализации:


СписокПараметров = Новый Массив;
СписокПараметров.Добавить(Справочники.Склады.НайтиПоКоду("00001"));
СписокПараметров.Добавить(Истина); // Признак полной выгрузки

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

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

Мониторинг и поиск существующих заданий

В процессе эксплуатации системы часто возникает необходимость изменить существующее задание или проверить его статус. Для этого мы используем метод НайтиПоНаименованию или поиск по уникальному идентификатору/ключу. Рассмотрим, как найти и временно отключить задание:


НайденныеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.ОбновлениеДанныхСайта));

Для Каждого ТекущееЗадание Из НайденныеЗадания Цикл
    Если ТекущееЗадание.Наименование = "Регламентное обновление цен (программное)" Тогда
        ТекущееЗадание.Использование = Ложь;
        ТекущееЗадание.Записать();
        Прервать;
    КонецЕсли;
КонецЦикла;

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

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

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

  1. Включите режим отладки на сервере приложений 1С (параметр -debug или -http в зависимости от версии).
  2. В конфигураторе откройте меню Отладка -> Подключение.
  3. В списке доступных предметов отладки найдите тип "Фоновое задание".
  4. Если задание выполняется слишком быстро и вы не успеваете подключиться, добавьте в начало кода процедуры небольшую паузу или используйте запись в ЖурналРегистрации для анализа промежуточных значений.

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


Процедура ВыполнитьОбмен() Экспорт
    Попытка
        // Основная логика обмена
    Исключение
        ЗаписьЖурналаРегистрации("РегламентноеЗадание.Обмен",
            УровеньЖурналаРегистрации.Ошибка, , ,
            ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
КонецПроцедуры

Безопасность и права доступа

Важным аспектом является то, от имени какого пользователя выполняется регламентное задание. По умолчанию, если пользователь не указан, задание выполняется от имени "Системного пользователя" (без прав доступа в терминах 1С), что часто приводит к ошибкам Нарушение прав доступа. Рассмотрим, как назначить пользователя заданию:

Разберем пример установки пользователя:


НовоеЗадание.ИмяПользователя = "АдминистраторРобот";
// Убедитесь, что у пользователя установлены необходимые роли для выполнения кода
НовоеЗадание.Записать();

Проанализируем альтернативный подход: выполнение кода в Привилегированном режиме. Если процедура общего модуля помечена как Привилегированный или внутри кода используется УстановитьПривилегированныйРежим(Истина), проверка прав доступа RLS будет игнорироваться, что ускорит выполнение и решит проблемы с доступом к данным.

Заключение

Мы рассмотрели полный цикл работы с регламентными заданиями в 1С 8.3. Использование программного интерфейса РегламентныеЗадания позволяет создавать гибкие и динамические системы автоматизации. Помните о важности обработки исключений и корректной настройки расписания для минимизации нагрузки на сервер в пиковые часы. Правильное использование Ключ и ИмяПользователя обеспечит стабильность и прозрачность работы ваших фоновых процессов.

← На главную