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