Разработка и настройка регламентных заданий — это одна из ключевых задач при автоматизации бизнес-процессов в 1С. Часто начинающие разработчики сталкиваются с ситуацией, когда код написан верно, расписание задано, но система упорно игнорирует выполнение задачи. В этой статье мы подробно разберем, как устроены регламентные задания, почему важен флаг «Предопределенное», и как заставить ваш код работать в фоновом режиме.
Рассмотрим ситуацию: вы создали объект РегламентноеЗадание в дереве метаданных конфигурации, указали метод (процедуру в общем модуле) и настроили расписание. Однако в режиме «Предприятие» ничего не происходит. Основная причина здесь кроется в свойстве «Предопределенное».
Проанализируем, за что отвечает эта галочка. В платформе 1С существует разделение между объектом метаданных (шаблоном) и конкретным экземпляром задания, который хранится в базе данных. Если флаг «Предопределенное» установлен, система автоматически создает один экземпляр задания при обновлении конфигурации базы данных. Если же флаг снят, объект в метаданных существует, но «двигатель» для его запуска в режиме «Предприятие» отсутствует.
Зачем это нужно? Представьте, что вам необходимо выполнять обмен данными с разными филиалами по разным расписаниям. Вместо того чтобы плодить десятки объектов в конфигураторе, вы создаете одно непредопределенное регламентное задание и программно генерируете на его основе нужное количество экземпляров с разными параметрами. Если же задача уникальна (например, ежедневная очистка логов), смело ставьте флаг «Предопределенное».
Выясним, как поступить, если нам нужно создать задание программно, не используя предопределенные настройки. Это актуально для динамических задач. Для этого используется менеджер регламентных заданий. Рассмотрим пример кода:
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("МоеРегламентноеЗаданиеМетаданные");
НовоеЗадание.Наименование = "Обработка данных филиала №1";
НовоеЗадание.Активность = Истина;
// Настройка расписания
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.ПериодичностьПовторенияВТечениеДня = 3600; // Раз в час
НовоеЗадание.Расписание = НовоеРасписание;
// Передача параметров в процедуру
МассивПараметров = Новый Массив;
МассивПараметров.Добавить("СкладОсновной");
НовоеЗадание.Параметры = МассивПараметров;
НовоеЗадание.Записать();
Важно помнить, что при программном создании вы привязываете объект к конкретному методу, описанному в метаданных, но можете гибко управлять его жизненным циклом и настройками прямо из интерфейса пользователя.
Проанализируем техническую среду, в которой работает ваше задание, так как это напрямую влияет на его запуск:
Если код проверен и «вручную» работает, а по расписанию — нет, необходимо проверить статус выполнения. В типовых конфигурациях (на базе БСП) существует обработка «Регламентные и фоновые задания». В пустой конфигурации её нет, но вы можете использовать внешнюю обработку «Консоль регламентных заданий» с диска ИТС или аналогичные сторонние инструменты.
В этой консоли вы можете увидеть:
Если специализированной консоли под рукой нет, разберем альтернативный метод — Журнал регистрации. При возникновении ошибки внутри фонового процесса (например, обращение к недоступному на сервере методу или нехватка прав), платформа сделает запись в ЖР. В фильтре журнала необходимо выбрать событие «Фоновое задание» и проверить последние записи.
Просто установить точку останова в коде модуля недостаточно, так как задание выполняется в отдельном сеансе на сервере. Посмотрим на алгоритм настройки отладки:
Теперь, когда регламентное задание запустится по расписанию, конфигуратор автоматически «подхватит» этот сеанс, и вы сможете пройтись по коду по шагам.
Выясним причину, по которой код создания документа может не срабатывать в фоновом режиме. Регламентные задания всегда выполняются на стороне сервера. Это накладывает серьезные ограничения:
Предупреждение(), Вопрос(), ОткрытьФорму() приведут к немедленному завершению задания с ошибкой.Сообщить() не выводится пользователю на экран, но сохраняется в логах выполнения фонового задания, которые можно прочитать программно.Рассмотрим ситуацию, когда нужно запустить тяжелую процедуру немедленно, не дожидаясь расписания. В коде это реализуется через менеджер фоновых заданий:
// Однократный запуск метода из общего модуля в фоновом режиме
ФоновыеЗадания.Выполнить("МойОбщийМодуль.МояПроцедураСозданияДокументов", ПараметрыМассив);
Это создаст временное ФоновоеЗадание, которое выполнит код и исчезнет. Это отличный способ протестировать поведение кода в серверном контексте, максимально приближенном к условиям реального регламентного задания.
Подводя итог, если ваше задание не работает: проверьте флаг «Предопределенное», убедитесь, что в файловой базе есть активные пользователи, проверьте наличие прав у назначенного пользователя и настройте автоматическое подключение отладчика для поиска логических ошибок в коде.