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