Как исправить ошибку «Недостаточно фактических параметров» во внешней печатной форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка внешних печатных форм (ВПФ) — это повседневная задача для разработчика 1С, однако она таит в себе неочевидные нюансы, связанные с работой Библиотеки стандартных подсистем (БСП). Часто программисты, следуя логике типовых конфигураций, копируют код из модуля менеджера документа и сталкиваются с ошибками при попытке запустить обработку через справочник Дополнительные отчеты и обработки. В этой статье мы подробно разберем, почему возникает ошибка «Недостаточно фактических параметров» и как правильно структурировать код внешней печатной формы, чтобы она работала стабильно.

Выясним причину несоответствия параметров

Рассмотрим ситуацию: вы создали внешнюю обработку, добавили макет и написали процедуру Печать в модуле объекта. В качестве образца вы взяли аналогичную процедуру из модуля менеджера типового документа (например, «Списание товаров» или «Реализация товаров»). В типовом модуле менеджер 1С процедура печати обычно выглядит следующим образом:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Код формирования макета
КонецПроцедуры

Проанализируем этот код: здесь мы видим 5 параметров. Однако при регистрации внешней печатной формы в системе БСП использует общий модуль ДополнительныеОтчетыИОбработки, который вызывает метод Печать объекта внешней обработки. Если мы заглянем в код этого общего модуля (как это сделал автор темы в сообщении №4), то увидим следующий вызов:


ВнешняяОбработкаОбъект.Печать(
    ПараметрыИсточника.ОбъектыНазначения,
    КоллекцияПечатныхФорм,
    ОбъектыПечати,
    ПараметрыВывода);

Здесь передается всего 4 параметра. Именно в этом кроется причина ошибки Недостаточно фактических параметров. Параметр ПараметрыПечати (который обычно содержит настройки заголовков, количества копий и прочее для встроенных форм) во внешних печатных формах БСП по умолчанию не передается в основной метод. Система ожидает, что ваша внешняя обработка примет именно 4 аргумента.

Исправляем сигнатуру процедуры Печать

Рассмотрим, как должна выглядеть корректная процедура в модуле объекта вашей внешней обработки. Нам необходимо просто исключить лишний параметр из описания процедуры. Выполним следующие действия в модуле объекта:


// ПРАВИЛЬНЫЙ ВАРИАНТ ДЛЯ ВНЕШНЕЙ ПЕЧАТНОЙ ФОРМЫ
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Если вам все же нужны параметры печати, их можно инициализировать внутри
    ПараметрыПечати = Новый Структура();
    
    // Установка флага комплектности, если это необходимо
    ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
    
    // Проверка, нужно ли печатать конкретный макет
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ИдентификаторВашейКоманды") Тогда
        
        // Вызов функции формирования табличного документа
        ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
        
        // Вывод результата в коллекцию
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм, 
            "ИдентификаторВашейКоманды", 
            "Заголовок печатной формы", 
            ТабличныйДокумент);
            
    КонецЕсли;

КонецПроцедуры

Важный момент: идентификатор команды (второй параметр в функции НужноПечататьМакет) должен в точности совпадать с тем идентификатором, который вы указали в функции СведенияОВнешнейОбработке в таблице команд.

Разберем вторую ошибку: «В обработчике печати не был сформирован табличный документ»

Как только мы исправляем количество параметров, может возникнуть следующая проблема: система сообщает, что табличный документ не сформирован. Проанализируем ситуацию, описанную в сообщении №7. Это происходит по одной из двух причин:

  1. Несовпадение идентификаторов: Если в СведенияОВнешнейОбработке вы назвали команду "АктСписания", а в процедуре Печать проверяете НужноПечататьМакет(КоллекцияПечатныхФорм, "СписаниеТоваровВнешняя"), условие вернет Ложь. В результате в КоллекцияПечатныхФорм не будет добавлен сформированный ТабличныйДокумент, и БСП выдаст исключение.
  2. Регистр и ошибки в именах: 1С чувствительна к написанию идентификаторов внутри коллекций. Убедитесь, что строка идентификатора совпадает символ в символ.

Для диагностики этой ошибки рекомендуется поставить точку останова в начале процедуры Печать и посмотреть содержимое таблицы КоллекцияПечатныхФорм. Там вы увидите колонку ИмяМакета — именно это значение нужно использовать в коде.

Работа с макетами и именами объектов

Посмотрим на пример из сообщения №6. Автор пытается использовать имя макета в формате "Документ.ОприходованиеТоваров.ПФ_MXL_Накладная". Это работает для встроенных форм, потому что система знает, где искать макет в дереве конфигурации. Для внешней печатной формы ситуация иная.

Когда мы используем метод УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию, параметры макета оформления стоит указывать осторожно. Если ваш макет находится внутри внешней обработки, не нужно указывать путь через Документ.ИмяДокумента.... Рассмотрим пример правильного вызова:


УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
    КоллекцияПечатныхФорм, 
    "СписаниеТоваровВнешняя", 
    NStr("ru='Акт списания товаров'"), 
    ПечатьСписаниеТоваров(МассивОбъектов, ОбъектыПечати, ПараметрыВывода), 
    , // Путь к макету оформления можно оставить пустым для ВПФ
    "ПФ_MXL_Накладная"); // Имя макета внутри обработки

Если же вы хотите использовать типовой макет из конфигурации, вам придется либо получить его через УправлениеПечатью.МакетДанныхОбъекта("Документ.СписаниеТоваров.ПФ_MXL_Накладная"), либо скопировать макет в саму внешнюю обработку, что является более надежным способом для обеспечения автономности ВПФ.

Рекомендации по отладке внешних печатных форм

Проанализировав опыт участников обсуждения, мы можем составить алгоритм действий при возникновении ошибок в ВПФ:

  1. Проверьте количество параметров в Процедура Печать(...). Их должно быть 4.
  2. Убедитесь, что процедура помечена словом Экспорт.
  3. Сравните идентификатор команды в функции СведенияОВнешнейОбработке() и в процедуре Печать().
  4. Если используете ПараметрыВывода, помните, что это структура, и вы можете изменять её свойства (например, ДоступнаПечатьПоКомплектно), но не должны переопределять её целиком.
  5. При формировании печатной формы внутри функции (например, ПечатьСписаниеТоваров), всегда возвращайте объект типа ТабличныйДокумент, даже если он пустой, чтобы избежать системных ошибок БСП.

Использование внешних печатных форм позволяет вносить изменения в печатные формы документов, не снимая конфигурацию с поддержки. Соблюдение правил оформления кода согласно стандартам БСП гарантирует, что ваши разработки будут корректно интегрироваться в любую современную систему на платформе 1С:Предприятие 8.3.

← На главную