К статье
Практический материал

Разработка и Конфигурация · 12 мин

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

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

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

Выбор способа зависит от того, откуда берётся параметр. Если значение известно заранее и меняется редко — удобнее хранить его в базе и читать внутри задания. Если параметр определяется в момент запуска (например, при ручном выполнении из обработки) — подойдёт метод ВыполнитьОбработкуЗадания с передачей массива параметров. Если значение зависит от пользователя или контекста сеанса — используются параметры сеанса.

Ниже разобраны все рабочие варианты с примерами кода, ограничениями каждого подхода и типичными ошибками, из-за которых задание либо падает, либо молча работает не с теми данными.

Почему у регламентного задания нет параметров «из коробки»

В конфигураторе у объекта метаданных «Регламентное задание» есть только имя метода, расписание, ключ и признак использования. Свойства «Параметры» там нет: платформа при наступлении времени расписания создаёт фоновое задание и вызывает указанную процедуру общего модуля без аргументов. Если объявить процедуру с параметрами и привязать её к заданию, при запуске будет ошибка — платформа не сможет подобрать значения.

Поэтому базовое правило: метод регламентного задания должен быть процедурой без параметров, расположенной в общем модуле с установленными флагами «Сервер» и «Вызов сервера» (для файлового варианта достаточно серверного контекста). Всё, что нужно методу для работы, он должен получить сам — из базы, из параметров сеанса или из констант.

Способ 1. Передача параметров через консоль заданий БСП

Если конфигурация построена на Библиотеке стандартных подсистем (УТ 11, ERP, БП 3.0 и другие типовые), в ней есть подсистема «Регламентные операции» с обработкой «Консоль заданий». Она позволяет выполнить произвольный метод с параметрами через метод РегламентныеОперацииСервер.ВыполнитьОбработкуЗадания либо программно через ФоновыеЗадания.Выполнить.

Ключевой момент: метод ФоновыеЗадания.Выполнить принимает имя процедуры, массив параметров, ключ и наименование. Параметры передаются позиционно, и их типы должны быть сериализуемыми — то есть допустимыми для передачи между клиентом и сервером (примитивные типы, структуры, массивы, ссылки). Передать, например, COM-объект или запрос нельзя.

bsl
ПараметрыПроцедуры = Новый Массив;
ПараметрыПроцедуры.Добавить(Организация);        // ссылка
ПараметрыПроцедуры.Добавить(НачалоМесяца(ТекущаяДатаСеанса()));

ФоновыеЗадания.Выполнить("ОбменДаннымиСервер.ВыгрузитьПоОрганизации",
    ПараметрыПроцедуры, "Выгрузка_" + Организация.УникальныйИдентификатор(),
    "Выгрузка по " + Организация);

Процедура-получатель в этом случае объявляется уже с параметрами — это законно, потому что вызывает её не планировщик, а ваш код. Если такую процедуру нужно запускать и по расписанию, делается «обёртка»: метод задания без параметров читает настройки из базы и вызывает рабочую процедуру с готовыми значениями.

Способ 2. Хранение параметров в базе: регистр сведений или константа

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

Пример: задание «Загрузка курсов валют» должно работать с разной глубиной истории для разных компаний. Создаётся регистр сведений «НастройкиЗаданий» с измерением «ИмяЗадания» и ресурсом «Значение» (или составным ресурсом). Метод задания первым делом читает свою настройку по имени и дальше работает с полученным значением.

bsl
Процедура ЗагрузитьДанныеПоНастройке() Экспорт
    Запрос = Новый Запрос("ВЫБРАТЬ Значение ИЗ РегистрСведений.НастройкиЗаданий
        |ГДЕ ИмяЗадания = &Имя");
    Запрос.УстановитьПараметр("Имя", "ЗагрузкаДанных");
    Выборка = Запрос.Выполнить().Выбрать();
    Если Не Выборка.Следующий() Тогда
        ВызватьИсключение "Не задана настройка задания ЗагрузкаДанных";
    КонецЕсли;
    ПериодЗагрузки = Выборка.Значение;
    // далее основная логика с использованием ПериодЗагрузки
КонецПроцедуры

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

Способ 3. Параметры сеанса и предопределённые ключи

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

Поэтому параметры сеанса — рабочий способ только для фоновых заданий, запущенных из пользовательского сеанса (кнопкой «Выполнить» в обработке). Для автономных регламентных заданий по расписанию они не подходят: там надёжнее чтение настроек из базы.

Отдельный приём — использование свойства «Ключ» регламентного задания. Создаётся несколько предопределённых заданий с одним методом, но разными ключами, а метод по ключу определяет, с каким «параметром» работать. Ключ доступен внутри через получение текущего фонового задания. Это удобно, когда вариантов немного и они фиксированы: «Выгрузка_Опт», «Выгрузка_Розница».

Сравнение вариантов

ФоновыеЗадания.Выполнить с массивом параметров

Подходит для запуска из кода и обработок. Требует сериализуемых типов; не работает для заданий по расписанию напрямую.

Регистр сведений / константа с настройками

Основной способ для заданий по расписанию. Настройки редактируются пользователями, но нужна защита от пустых значений.

Несколько заданий с разными ключами

Хорош при малом числе фиксированных вариантов. Каждый вариант требует отдельного объекта метаданных.

Параметры сеанса

Только для фоновых заданий, запущенных из пользовательского сеанса. В расписании значения не наследуются.

Организация вызова: процедура-обёртка и диспетчер

Универсальный архитектурный приём — сделать метод задания «диспетчером». Он без параметров, читает из регистра список задач с их настройками и в цикле вызывает рабочие процедуры, передавая каждой её параметры как обычные аргументы. Так одно регламентное задание обслуживает сколько угодно параметризованных сценариев, а добавление нового сводится к записи в регистр, без изменения кода.

Пример структуры: регистр «ОчередьЗадачЗадания» с измерением «ИдентификаторЗадачи» и ресурсами «Параметр1…ПараметрN» либо одним ресурсом типа «ХранилищеЗначения», куда сериализуется структура параметров. Хранилище значения удобно, когда состав параметров заранее не фиксирован.

Порядок действий для типовой реализации
  1. 1
    Создайте регистр сведений для настроек задания (измерение — имя или идентификатор задачи, ресурсы — значения параметров)
  2. 2
    Напишите рабочую процедуру с параметрами в общем серверном модуле
  3. 3
    Напишите метод-обёртку без параметров: читает настройки и вызывает рабочую процедуру
  4. 4
    Привяжите обёртку к регламентному заданию, задайте расписание
  5. 5
    Заполните настройки в базе и запустите задание вручную для проверки
  6. 6
    Проверьте результат и журнал регистрации на наличие ошибок

Проверка результата и отладка

После внедрения обязательно проверьте, что параметр реально дошёл до рабочего кода. Самый простой способ — временно добавить в начало метода запись в журнал регистрации через ЗаписьЖурналаРегистрации с полученным значением параметра. После отладки запись можно оставить на уровне «Информация» — она поможет разбирать инциденты.

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

Контрольные точки

Как проверить результат

Значение параметра внутри задания
Норма

В журнале регистрации видно ожидаемое значение

Тревожный признак

Параметр пустой или значение по умолчанию — настройка не прочитана

Состояние фонового задания в консоли
Норма

Статус «Завершено» без сообщений об ошибках

Тревожный признак

Статус «Ошибка» — смотрите текст исключения

Результат работы (данные, документы)
Норма

Изменения соответствуют переданному параметру

Тревожный признак

Обработаны не те данные — ключ или отбор задан неверно

Типичные ошибки и ограничения

Частая ошибка — объявить метод задания с параметрами и ждать, что платформа «как-нибудь» их подставит. Задание падает при первом же запуске по расписанию, хотя ручной вызов из кода работал. Вторая типичная проблема — передача несериализуемых типов (табличный документ, запрос, COM-объект) в ФоновыеЗадания.Выполнить: возникает ошибка сериализации. Передавайте ссылки и примитивы, а сложные объекты стройте уже внутри фоновой процедуры.

Третья группа ошибок связана с правами: фоновое задание по расписанию выполняется от имени пользователя, указанного в свойстве «Имя пользователя» задания, либо без пользователя. Если у этого контекста нет прав на чтение регистра настроек, задание упадёт или получит пустой параметр. Проверяйте права заранее и не полагайтесь на то, что «у администратора всё работало».

Типичные ошибки
01
Метод задания объявлен с параметрами — падение при запуске по расписанию
02
Передача несериализуемых типов в ФоновыеЗадания.Выполнить — ошибка сериализации
03
Ожидание параметров сеанса в задании по расписанию — значения пустые
04
Нет обработки отсутствующей настройки — задание молча работает с пустым параметром
05
Пользователь задания без прав на регистр настроек — ошибка доступа в журнале

Частые вопросы

Можно ли задать параметры прямо в расписании регламентного задания?

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

Как передать структуру с несколькими значениями в фоновое задание?

Добавьте структуру как один элемент массива параметров: структуры сериализуются, если содержат только допустимые типы (примитивы, ссылки, вложенные структуры и массивы). Внутри процедуры извлеките её по индексу: Параметры[0].

Почему задание вручную работает, а по расписанию падает?

Чаще всего причины две: метод объявлен с параметрами, которые планировщик не может заполнить, или задание по расписанию выполняется под другим пользователем без нужных прав. Сравните контекст запуска и посмотрите текст ошибки в журнале регистрации.

Как передать параметр из формы обработки в регламентное задание?

Из формы вызывайте не регламентное, а фоновое задание: ФоновыеЗадания.Выполнить с именем метода и массивом параметров. Если нужен именно запуск по расписанию с пользовательским значением — сохраните значение в регистр настроек, а задание прочитает его при очередном запуске.

Можно ли использовать один метод для нескольких заданий с разной логикой?

Да. Создайте несколько регламентных заданий с одним методом, но разными ключами. Внутри метода получите текущее фоновое задание и по его ключу выберите ветку логики или набор настроек из базы.

Где посмотреть, с каким параметром отработало задание?

Штатного хранилища параметров запуска нет. Добавьте в метод запись в журнал регистрации с полученными значениями или ведите собственный регистр протокола запусков — это стандартная практика для отладки и аудита регламентных операций.

Итог

Что важно запомнить

Метод регламентного задания всегда без параметров. Реальные значения передают через ФоновыеЗадания.Выполнить с массивом сериализуемых параметров, через настройки в регистре сведений или константах, либо через разные ключи заданий. Обязательно обрабатывайте отсутствие настройки, проверяйте права пользователя задания и тестируйте на копии перед запуском в рабочей базе.