Как исправить ошибку «Not enough actual parameters for a background job method» в регламентном задании обмена?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При настройке автоматического обмена данными в программах «1С:Предприятие» (в частности, в «1С:Бухгалтерии предприятия» редакции 2.0 и других типовых конфигурациях на платформе 8.2/8.3) администраторы и программисты нередко сталкиваются с системной ошибкой при старте фонового задания: «Not enough actual parameters for a background job method» (в русскоязычной локализации — «Недостаточно фактических параметров метода фонового задания»). При этом интерактивный обмен по кнопке или ручной вызов процедуры из внешней обработки отрабатывает без нареканий, а фоновое задание прерывается еще до входа в тело программного кода. Разберем детально, почему возникает эта ошибка и какими способами ее можно устранить.

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

Причина возникновения ошибки на уровне платформы

Выясним причину такого поведения платформы. Сообщение об ошибке генерируется механизмом управления фоновыми заданиями еще до передачи управления в тело назначенного метода. Механика работы следующая:

  1. В метаданных конфигурации для регламентного задания указывается имя метода (процедуры общего модуля), который должен выполняться в фоновом режиме. В типовых конфигурациях для обмена данными часто используется процедура вида ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными(КодНастройки).
  2. Обратите внимание на сигнатуру процедуры: параметр КодНастройки является строго обязательным и не имеет значения по умолчанию.
  3. При срабатывании планировщика платформа формирует фоновое задание и проверяет соответствие количества параметров вызываемого метода количеству элементов в свойстве Параметры самого регламентного задания. Свойство Параметры представляет собой объект типа Массив.
  4. Если регламентное задание было создано вручную через консоль регламентных заданий, скопировано или создано как предопределенное на уровне метаданных, массив Параметры остается пустым.
  5. Платформа обнаруживает несоответствие (процедура ожидает как минимум один аргумент, а передано ноль) и сразу же аварийно завершает запуск фонового задания системной ошибкой «Not enough actual parameters for a background job method».

Ограничения предопределенных заданий и типовая логика обмена

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

В типовых конфигурациях связь строится динамически:

  1. Каждому элементу справочника настроек обмена соответствует свое отдельное (непредопределенное) регламентное задание.
  2. Уникальный идентификатор созданного регламентного задания записывается в реквизиты элемента настройки обмена данными.
  3. В свойство Параметры регламентного задания помещается массив, содержащий строку с кодом соответствующей настройки обмена.

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

Решение 1. Штатное пересоздание регламентного задания через интерфейс

Самый простой, правильный и рекомендуемый способ решения проблемы в конфигурации «1С:Бухгалтерия предприятия» — использовать стандартный интерфейс прикладного решения, который берет на себя заполнение параметров и привязку GUID задания к настройке.

Разберем по шагам, как пересоздать задание:

  1. Откроем консоль регламентных заданий (или список регламентных заданий в базе) и удалим сбойное регламентное задание, которое вызывает ошибку.
  2. Перейдем в раздел настроек автоматического обмена данными (меню «Сервис» — «Прочие обмены данными» — «Настройка выполнения обмена»).
  3. Откроем нужную карточку настройки обмена, в которой ранее возникал сбой.
  4. Перейдем на вкладку или в диалоговое окно дополнительных настроек (по кнопке «Дополнительные настройки» или аналогичной сервисной кнопке управления расписанием).
  5. Установим признак использования обмена по расписанию и настроим требуемое время запуска.
  6. Нажмем кнопку сохранения или подтверждения настройки. В этот момент конфигурация программно создаст новое регламентное задание, автоматически передаст в массив его параметров код текущей настройки и свяжет его с элементом справочника.

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

Решение 2. Программная инициализация параметров существующего задания

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

Посмотрим на пример кода, который выполняет поиск регламентного задания по его идентификатору и передает в него код настройки обмена:


ИдентификаторЗадания = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); // Укажите реальный GUID задания
Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);

Если Задание <> Неопределено Тогда
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(СокрЛП(КодНастройкиОбмена)); // Код настройки из справочника
    
    Задание.Параметры = МассивПараметров;
    Задание.Записать();
    
    Сообщить("Параметры регламентного задания успешно обновлены!");
Иначе
    Сообщить("Регламентное задание с указанным идентификатором не найдено.");
КонецЕсли;

После выполнения данного скрипта свойство Задание.Параметры перестанет быть пустым. При следующем запуске планировщик фоновых заданий корректно передаст код настройки в процедуру ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными, и ошибка параметров исчезнет.

Решение 3. Изменение сигнатуры процедуры в общем модуле (для нетиповых конфигураций)

Если конфигурация снята с поддержки или находится на доработке, можно устранить первопричину жесткого требования к параметру непосредственно в программном коде. Рассмотрим, как модернизировать процедуру обработки обмена.

В типовом варианте заголовок процедуры выглядит следующим образом:


Процедура ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными(КодНастройки) Экспорт

Добавим для входящего параметра значение по умолчанию и предусмотрим резервный механизм поиска настройки (например, по наименованию самого фонового задания):


Процедура ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными(КодНастройки = "") Экспорт
    
    Если ПустаяСтрока(КодНастройки) Тогда
        // Попытаемся определить настройку по наименованию текущего фонового задания
        ТекущееЗадание = ФоновыеЗадания.ТекущееФоновоеЗадание();
        Если ТекущееЗадание <> Неопределено Тогда
            НаименованиеЗадания = ТекущееЗадание.Наименование;
            НастройкаОбъекта = Справочники.НастройкиВыполненияОбмена.НайтиПоНаименованию(НаименованиеЗадания);
            Если ЗначениеЗаполнено(НастройкаОбъекта) Тогда
                КодНастройки = НастройкаОбъекта.Код;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
    Если ПустаяСтрока(КодНастройки) Тогда
        ВызватьИсключение "Не удалось определить код настройки для выполнения автоматического обмена.";
    КонецЕсли;
    
    // Основной код выполнения обмена
    // ...
КонецПроцедуры

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

← На главную