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