При работе с крупными конфигурациями, такими как 1С:ERP Управление предприятием 2.4 или Комплексная автоматизация, разработчики часто сталкиваются с механизмами, которые работают "под капотом" Библиотеки стандартных подсистем (БСП). Одним из таких механизмов является динамическое создание регламентных заданий для рассылки отчетов. Рассмотрим ситуацию, когда процедура регламентного задания ВыполнитьРассылкуПоРасписанию имеет экспортный параметр, и разберемся, каким образом платформа передает в него данные.
В конфигураторе мы можем видеть объект метаданных РегламентноеЗадание.РассылкаОтчетов. Однако, если мы откроем список регламентных заданий в пользовательском режиме, мы увидим не одну запись, а множество — по одной на каждую настроенную рассылку в справочнике. Проанализируем, почему так происходит. В 1С существует два типа регламентных заданий:
Рассылка отчетов относится ко второму типу. Для каждой записи справочника РассылкиОтчетов система создает отдельный экземпляр регламентного задания. Именно в этот экземпляр при создании записываются Параметры, которые платформа будет передавать в процедуру-обработчик.
Процедура, указанная в метаданных, обычно выглядит так:
Процедура ВыполнитьРассылкуПоРасписанию(Рассылка) Экспорт
// Здесь Рассылка — это ссылка на элемент справочника РассылкиОтчетов
РассылкиОтчетов.ВыполнитьРассылку(Рассылка);
КонецПроцедуры
Многих смущает вопрос: откуда берется значение аргумента Рассылка, если планировщик задач запускает задание автоматически? Ответ кроется в свойстве Параметры объекта РегламентноеЗадание.
Рассмотрим подробнее объект РегламентноеЗадание. У него есть свойство Параметры, которое представляет собой Массив. Когда планировщик 1С:Предприятия запускает задание, он считывает этот массив и передает его элементы в процедуру по порядку: первый элемент массива — в первый параметр процедуры, второй — во второй и так далее.
Для рассылки отчетов в массив Параметры на этапе записи регламентного задания помещается один элемент — Ссылка на текущую рассылку. Выясним, как это выглядит в коде при создании задания:
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("РассылкаОтчетов");
НовоеЗадание.Наименование = "Рассылка: " + ОбъектРассылка.Наименование;
// Формируем массив параметров
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ОбъектРассылка.Ссылка);
// Записываем массив в задание
НовоеЗадание.Параметры = МассивПараметров;
НовоеЗадание.Записать();
Таким образом, когда срабатывает расписание, платформа вызывает РассылкаОтчетов.ВыполнитьРассылкуПоРасписанию(МассивПараметров[0]).
Если вам необходимо проверить, какие параметры передаются в уже созданное задание, вы не сможете сделать это через стандартный список регламентных заданий в "Обслуживании", так как поле "Параметры" там зачастую не отображается для удобства пользователя. Рассмотрим способы получения этой информации:
Способ 1. Использование консоли заданий
Рекомендуется использовать "Консоль заданий" (входит в состав инструментов разработчика или доступна как внешняя обработка на ИТС). В ней можно найти нужную строку, открыть её свойства и увидеть состав массива параметров. Это самый быстрый способ без написания кода.
Способ 2. Программный поиск
Проанализируем ситуацию, когда нам нужно найти все параметры программно. Мы можем воспользоваться менеджером регламентных заданий:
Отбор = Новый Структура;
Отбор.Вставить("Метаданные", Метаданные.РегламентныеЗадания.РассылкаОтчетов);
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Для Каждого Задание Из Задания Цикл
Если Задание.Параметры.Количество() > 0 Тогда
Сообщить("Задание: " + Задание.Наименование + ", Ссылка в параметрах: " + Задание.Параметры[0]);
КонецЕсли;
КонецЦикла;
Поскольку процедура ВыполнитьРассылкуПоРасписанию выполняется в контексте фонового задания на сервере, обычная установка точки останова может не сработать. Разберем по шагам, как отладить передачу параметров:
ВыполнитьРассылкуПоРасписанию.При остановке в этой точке вы сможете в табло (Shift+F9) посмотреть значение переменной Рассылка. Если в параметрах передана "битая" ссылка (объект удален), переменная будет содержать значение Объект не найден, что приведет к ошибке при попытке обращения к методам этой ссылки.
Проанализируем несколько важных моментов, о которых стоит помнить разработчику:
Параметры — это всегда Массив. Даже если у процедуры всего один аргумент, вы обязаны передать массив с одним элементом.СправочникСсылка, а вы передадите Строку (УникальныйИдентификатор), произойдет ошибка времени выполнения.РегламентноеЗадание стали более стабильными, но принципиальная схема с массивом параметров остается неизменной многие годы.Теперь мы выяснили, что таинственная "ссылка на рассылку" — это всего лишь первый элемент массива, хранящегося в настройках конкретного экземпляра регламентного задания. Понимание этого механизма позволяет гибко настраивать любые автоматизированные процессы в 1С:ERP.