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