Откуда берутся параметры регламентного задания при рассылке отчетов в 1С:ERP?

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

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

Суть проблемы и архитектура решения

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

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

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

Разберем процедуру-обработчик

Процедура, указанная в метаданных, обычно выглядит так:


Процедура ВыполнитьРассылкуПоРасписанию(Рассылка) Экспорт
    // Здесь Рассылка — это ссылка на элемент справочника РассылкиОтчетов
    РассылкиОтчетов.ВыполнитьРассылку(Рассылка);
КонецПроцедуры

Многих смущает вопрос: откуда берется значение аргумента Рассылка, если планировщик задач запускает задание автоматически? Ответ кроется в свойстве Параметры объекта РегламентноеЗадание.

Где хранятся и как передаются параметры

Рассмотрим подробнее объект РегламентноеЗадание. У него есть свойство Параметры, которое представляет собой Массив. Когда планировщик 1С:Предприятия запускает задание, он считывает этот массив и передает его элементы в процедуру по порядку: первый элемент массива — в первый параметр процедуры, второй — во второй и так далее.

Для рассылки отчетов в массив Параметры на этапе записи регламентного задания помещается один элемент — Ссылка на текущую рассылку. Выясним, как это выглядит в коде при создании задания:


НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("РассылкаОтчетов");
НовоеЗадание.Наименование = "Рассылка: " + ОбъектРассылка.Наименование;
// Формируем массив параметров
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ОбъектРассылка.Ссылка); 
// Записываем массив в задание
НовоеЗадание.Параметры = МассивПараметров;
НовоеЗадание.Записать();

Таким образом, когда срабатывает расписание, платформа вызывает РассылкаОтчетов.ВыполнитьРассылкуПоРасписанию(МассивПараметров[0]).

Как просмотреть параметры существующего задания

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

Способ 1. Использование консоли заданий

Рекомендуется использовать "Консоль заданий" (входит в состав инструментов разработчика или доступна как внешняя обработка на ИТС). В ней можно найти нужную строку, открыть её свойства и увидеть состав массива параметров. Это самый быстрый способ без написания кода.

Способ 2. Программный поиск

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


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

Для Каждого Задание Из Задания Цикл
    Если Задание.Параметры.Количество() > 0 Тогда
        Сообщить("Задание: " + Задание.Наименование + ", Ссылка в параметрах: " + Задание.Параметры[0]);
    КонецЕсли;
КонецЦикла;

Особенности отладки таких процедур

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

  1. Включите режим отладки на сервере (если он еще не включен).
  2. В конфигураторе откройте меню Отладка -> Подключение.
  3. Нажмите кнопку Настройка и убедитесь, что флажок "Отлаживать фоновые задания" установлен.
  4. Поставьте точку останова внутри процедуры ВыполнитьРассылкуПоРасписанию.
  5. В режиме "Предприятие" найдите нужную рассылку и запустите её выполнение (либо дождитесь срабатывания расписания).

При остановке в этой точке вы сможете в табло (Shift+F9) посмотреть значение переменной Рассылка. Если в параметрах передана "битая" ссылка (объект удален), переменная будет содержать значение Объект не найден, что приведет к ошибке при попытке обращения к методам этой ссылки.

Важные нюансы и советы

Проанализируем несколько важных моментов, о которых стоит помнить разработчику:

Теперь мы выяснили, что таинственная "ссылка на рассылку" — это всего лишь первый элемент массива, хранящегося в настройках конкретного экземпляра регламентного задания. Понимание этого механизма позволяет гибко настраивать любые автоматизированные процессы в 1С:ERP.

← На главную