При настройке автоматического обмена данными в программах «1С:Предприятие» (в частности, в «1С:Бухгалтерии предприятия» редакции 2.0 и других типовых конфигурациях на платформе 8.2/8.3) администраторы и программисты нередко сталкиваются с системной ошибкой при старте фонового задания: «Not enough actual parameters for a background job method» (в русскоязычной локализации — «Недостаточно фактических параметров метода фонового задания»). При этом интерактивный обмен по кнопке или ручной вызов процедуры из внешней обработки отрабатывает без нареканий, а фоновое задание прерывается еще до входа в тело программного кода. Разберем детально, почему возникает эта ошибка и какими способами ее можно устранить.
Проанализируем техническую природу ошибки, рассмотрим архитектуру регламентных заданий обмена и разберем по шагам варианты восстановления работоспособности механизма.
Выясним причину такого поведения платформы. Сообщение об ошибке генерируется механизмом управления фоновыми заданиями еще до передачи управления в тело назначенного метода. Механика работы следующая:
ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными(КодНастройки).КодНастройки является строго обязательным и не имеет значения по умолчанию.Параметры самого регламентного задания. Свойство Параметры представляет собой объект типа Массив.Параметры остается пустым.Рассмотрим важную особенность: предопределенные регламентные задания (созданные непосредственно в дереве метаданных в конфигураторе) в платформе 1С не позволяют заранее прописать значения параметров через свойства конфигуратора. Поэтому привязать конкретную настройку обмена к предопределенному заданию «из коробки» невозможно.
В типовых конфигурациях связь строится динамически:
Параметры регламентного задания помещается массив, содержащий строку с кодом соответствующей настройки обмена.Если создать задание вручную, задублировать его или сбросить идентификаторы при некорректной выгрузке/загрузке базы данных, связь разрывается, параметры очищаются, и обмен перестает выполняться по расписанию.
Самый простой, правильный и рекомендуемый способ решения проблемы в конфигурации «1С:Бухгалтерия предприятия» — использовать стандартный интерфейс прикладного решения, который берет на себя заполнение параметров и привязку GUID задания к настройке.
Разберем по шагам, как пересоздать задание:
После этой процедуры задание начнет успешно запускаться по расписанию, так как платформа передаст обязательный параметр в процедуру-обработчик.
Бывают ситуации, когда удалять регламентное задание нежелательно (например, на него завязаны внешние системы мониторинга, либо не хочется повторно настраивать сложное расписание). В таком случае мы можем программно заполнить коллекцию параметров регламентного задания с помощью внешней обработки.
Посмотрим на пример кода, который выполняет поиск регламентного задания по его идентификатору и передает в него код настройки обмена:
ИдентификаторЗадания = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); // Укажите реальный GUID задания
Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание <> Неопределено Тогда
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(СокрЛП(КодНастройкиОбмена)); // Код настройки из справочника
Задание.Параметры = МассивПараметров;
Задание.Записать();
Сообщить("Параметры регламентного задания успешно обновлены!");
Иначе
Сообщить("Регламентное задание с указанным идентификатором не найдено.");
КонецЕсли;
После выполнения данного скрипта свойство Задание.Параметры перестанет быть пустым. При следующем запуске планировщик фоновых заданий корректно передаст код настройки в процедуру ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными, и ошибка параметров исчезнет.
Если конфигурация снята с поддержки или находится на доработке, можно устранить первопричину жесткого требования к параметру непосредственно в программном коде. Рассмотрим, как модернизировать процедуру обработки обмена.
В типовом варианте заголовок процедуры выглядит следующим образом:
Процедура ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными(КодНастройки) Экспорт
Добавим для входящего параметра значение по умолчанию и предусмотрим резервный механизм поиска настройки (например, по наименованию самого фонового задания):
Процедура ВыполнитьОбменДаннымиДляНастройкиАвтоматическогоОбменаДанными(КодНастройки = "") Экспорт
Если ПустаяСтрока(КодНастройки) Тогда
// Попытаемся определить настройку по наименованию текущего фонового задания
ТекущееЗадание = ФоновыеЗадания.ТекущееФоновоеЗадание();
Если ТекущееЗадание <> Неопределено Тогда
НаименованиеЗадания = ТекущееЗадание.Наименование;
НастройкаОбъекта = Справочники.НастройкиВыполненияОбмена.НайтиПоНаименованию(НаименованиеЗадания);
Если ЗначениеЗаполнено(НастройкаОбъекта) Тогда
КодНастройки = НастройкаОбъекта.Код;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ПустаяСтрока(КодНастройки) Тогда
ВызватьИсключение "Не удалось определить код настройки для выполнения автоматического обмена.";
КонецЕсли;
// Основной код выполнения обмена
// ...
КонецПроцедуры
Такой подход защитит систему от падения на уровне платформы даже в том случае, если регламентное задание будет случайно создано через стандартную консоль заданий без передачи массива параметров.