В современной разработке на платформе 1С:Предприятие 8.3 регламентные задания играют ключевую роль в автоматизации бизнес-процессов. Они позволяют выполнять тяжелые вычисления, обмен данными или рассылку уведомлений в фоновом режиме, не блокируя работу пользователей. В рамках данной статьи мы подробно разберем, как программно управлять этими механизмами, настраивать их расписание и обеспечивать стабильную работу фоновых процессов.
Прежде чем переходить к написанию кода, проанализируем, из чего состоит регламентное задание. Оно представляет собой объект метаданных, который ссылается на определенный метод (процедуру) в общем модуле. Важно помнить, что процедура должна быть расположена в модуле с установленным флагом "Сервер" и быть доступной для вызова (экспортной). Рассмотрим структуру взаимодействия: регламентное задание порождает фоновое задание, которое выполняется в отдельном сеансе на стороне сервера приложений.
Разберем по шагам процесс создания нового задания через встроенный язык. Это часто требуется в тиражных решениях, когда параметры задания (например, частота опроса внешнего сервиса) определяются пользователем в режиме 1С:Предприятие.
Для программного управления используется менеджер РегламентныеЗадания. Рассмотрим пример кода, который создает новое задание, назначает ему метаданные и устанавливает уникальное имя для идентификации.
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ОбновлениеДанныхСайта");
НовоеЗадание.Наименование = "Регламентное обновление цен (программное)";
НовоеЗадание.Использование = Истина;
НовоеЗадание.Ключ = "УникальныйКлючЗадания_123";
Попытка
НовоеЗадание.Записать();
Исключение
Сообщить("Не удалось создать задание: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Выясним причину использования свойства Ключ. Этот параметр критически важен, если вы планируете создавать несколько однотипных заданий с разными параметрами. Ключ позволяет избежать дублирования заданий и облегчает поиск конкретного экземпляра в списке всех заданий системы.
Одной из самых сложных частей является настройка расписания. В 1С расписание описывается объектом РасписаниеРегламентногоЗадания. Разберем подробнее, как настроить ежедневное выполнение с интервалом в один час в рабочее время.
Проанализируем следующий пример кода:
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовторенияВТечениеДня = 3600; // Интервал в секундах (1 час)
Расписание.ВремяНачала = '00010101090000'; // Начало в 09:00
Расписание.ВремяКонца = '00010101180000'; // Конец в 18:00
Расписание.ДниНедели = "ПН,ВТ,СР,ЧТ,ПТ";
НовоеЗадание.Расписание = Расписание;
НовоеЗадание.Записать();
Важно отметить, что если ВремяНачала и ВремяКонца не заданы, задание будет выполняться круглосуточно с указанным интервалом. Мы использовали свойство ПериодПовторенияВТечениеДня, чтобы обеспечить цикличность выполнения внутри одних суток.
Часто процедуре, которую вызывает задание, требуются входные данные (например, ссылка на склад или идентификатор узла обмена). Эти данные передаются через массив Параметры. Посмотрим на пример реализации:
СписокПараметров = Новый Массив;
СписокПараметров.Добавить(Справочники.Склады.НайтиПоКоду("00001"));
СписокПараметров.Добавить(Истина); // Признак полной выгрузки
НовоеЗадание.Параметры = СписокПараметров;
НовоеЗадание.Записать();
Обратите внимание: элементы массива должны соответствовать количеству и порядку аргументов вызываемой процедуры в общем модуле. Если процедура определена как Процедура ОбновитьДанные(Склад, ПолнаяВыгрузка) Экспорт, то массив должен содержать ровно два элемента соответствующих типов.
В процессе эксплуатации системы часто возникает необходимость изменить существующее задание или проверить его статус. Для этого мы используем метод НайтиПоНаименованию или поиск по уникальному идентификатору/ключу. Рассмотрим, как найти и временно отключить задание:
НайденныеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.ОбновлениеДанныхСайта));
Для Каждого ТекущееЗадание Из НайденныеЗадания Цикл
Если ТекущееЗадание.Наименование = "Регламентное обновление цен (программное)" Тогда
ТекущееЗадание.Использование = Ложь;
ТекущееЗадание.Записать();
Прервать;
КонецЕсли;
КонецЦикла;
Здесь мы применили фильтр по объекту метаданных, что значительно эффективнее, чем перебор всех заданий в базе данных. Это позволяет быстро получить список всех экземпляров конкретного типа регламентного задания.
Отладка фоновых заданий — это задача, требующая понимания контекста выполнения. Поскольку код выполняется на сервере без привязки к клиентскому сеансу, обычная точка останова в конфигураторе может не сработать. Разберем по шагам, как настроить среду для отладки:
-debug или -http в зависимости от версии).ЖурналРегистрации для анализа промежуточных значений.Проанализируем ситуацию, когда задание завершается с ошибкой, но текст ошибки не виден. В таких случаях рекомендуется использовать блок Попытка...Исключение внутри самой процедуры задания и записывать подробности в журнал регистрации:
Процедура ВыполнитьОбмен() Экспорт
Попытка
// Основная логика обмена
Исключение
ЗаписьЖурналаРегистрации("РегламентноеЗадание.Обмен",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Важным аспектом является то, от имени какого пользователя выполняется регламентное задание. По умолчанию, если пользователь не указан, задание выполняется от имени "Системного пользователя" (без прав доступа в терминах 1С), что часто приводит к ошибкам Нарушение прав доступа. Рассмотрим, как назначить пользователя заданию:
Разберем пример установки пользователя:
НовоеЗадание.ИмяПользователя = "АдминистраторРобот";
// Убедитесь, что у пользователя установлены необходимые роли для выполнения кода
НовоеЗадание.Записать();
Проанализируем альтернативный подход: выполнение кода в Привилегированном режиме. Если процедура общего модуля помечена как Привилегированный или внутри кода используется УстановитьПривилегированныйРежим(Истина), проверка прав доступа RLS будет игнорироваться, что ускорит выполнение и решит проблемы с доступом к данным.
Мы рассмотрели полный цикл работы с регламентными заданиями в 1С 8.3. Использование программного интерфейса РегламентныеЗадания позволяет создавать гибкие и динамические системы автоматизации. Помните о важности обработки исключений и корректной настройки расписания для минимизации нагрузки на сервер в пиковые часы. Правильное использование Ключ и ИмяПользователя обеспечит стабильность и прозрачность работы ваших фоновых процессов.