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