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

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

При разработке или обновлении внешних печатных форм в современных конфигурациях 1С:Предприятие 8, построенных на базе Библиотеки стандартных подсистем (БСП), разработчики часто сталкиваются с досадной ошибкой: {ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(223)}: Недостаточно фактических параметров. Эта ошибка возникает в момент нажатия на кнопку печати и полностью блокирует формирование документа.

В этой статье мы подробно разберем, почему возникает это несоответствие, проанализируем структуру вызовов в общем модуле и выясним, как правильно объявить процедуру Печать в модуле объекта внешней обработки, чтобы она соответствовала стандартам современных конфигураций.

Выясняем причину ошибки

Проанализируем ситуацию. Ошибка «Недостаточно фактических параметров» означает, что система пытается вызвать процедуру с одним количеством аргументов, а в самой процедуре описано другое количество. В контексте БСП это происходит в общем модуле ДополнительныеОтчетыИОбработки. Если мы заглянем в код этого модуля (как указано в сообщении форума, в районе строки 223), то увидим жестко заданный вызов:


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

Как мы видим, система передает ровно четыре параметра. Если в вашей внешней обработке процедура Печать ожидает пять параметров (например, вы добавили ИдентификаторКоманды пятым аргументом) или, наоборот, меньше четырех, платформа 1С выдаст исключение и прекратит работу.

Рассмотрим, почему в коде обработки может оказаться 5 параметров. Чаще всего это происходит при копировании старого кода или при попытке реализовать логику из других подсистем, где требовался идентификатор команды для определения того, какую именно форму нужно печатать. Однако в актуальных версиях БСП этот подход изменен.

Стандартная сигнатура процедуры Печать

Для того чтобы внешняя печатная форма работала корректно, нам необходимо привести заголовок процедуры в модуле объекта к «золотому стандарту» БСП. Рассмотрим правильный вариант объявления:


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

Разберем назначение каждого параметра, чтобы понимать, как с ними работать внутри кода:

  1. МассивОбъектовНазначения — содержит массив ссылок на документы или элементы справочников, для которых вызвана печать.
  2. КоллекцияПечатныхФорм — таблица значений, в которой описаны все печатные формы, которые должна сформировать обработка. Именно здесь теперь хранится информация о том, какую команду выбрал пользователь.
  3. ОбъектыПечати — список значений, куда мы будем записывать соответствие между сформированными табличными документами и объектами метаданных (нужно для корректной работы механизмов БСП).
  4. ПараметрыВывода — структура, содержащая дополнительные настройки, например, параметры колонтитулов или принтера.

Решение проблемы: Способ 1. Приведение к стандарту

Если вы обнаружили, что у вас в коде 5 параметров, и вы боитесь, что код «не сработает» после удаления лишнего, давайте разберем, как поступить правильно. Чаще всего лишним параметром является ИдентификаторКоманды.

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


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

Таким образом, мы убираем лишний параметр из описания процедуры, сохраняя при этом возможность определять, какую именно форму нужно печатать, через перебор коллекции.

Решение проблемы: Способ 2. Использование значений по умолчанию

Если по каким-то причинам вы не хотите переписывать внутреннюю логику и вам критически важно оставить пятый параметр (например, если этот же код вызывается из другого места, где передается 5 аргументов), можно воспользоваться механизмом необязательных параметров 1С.

Рассмотрим, как это выглядит в коде:


Процедура Печать(Параметр1, Параметр2, Параметр3, Параметр4, Параметр5 = Неопределено) Экспорт
    // Теперь, даже если БСП передаст 4 параметра, ошибки не будет.
    // Параметр5 просто примет значение Неопределено.
КонецПроцедуры

Важно: Этот способ является «костылем» и не рекомендуется для постоянного использования. Правильнее следовать стандартам разработки БСП.

Связь с функцией СведенияОВнешнейОбработке

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

Если в описании команд вы указываете Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(), то БСП ожидает именно процедуру Печать в модуле объекта с 4-мя параметрами. Если же вы используете ОткрытиеФормы, то логика печати должна находиться в модуле формы, и процедура в модуле объекта вызываться не будет.

Проанализируем типичный пример регистрации команды:


НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Печать акта";
НоваяКоманда.Идентификатор = "АктПриемки";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";

При такой настройке система всегда будет искать процедуру Печать(4 параметра).

Типичные ошибки при миграции кода

Часто программисты копируют код из модуля менеджера обычного документа (например, «Реализация товаров и услуг»). В модулях менеджера встроенных документов процедура Печать может иметь 3, 5 или более параметров в зависимости от релиза конфигурации.

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

Итоги

Подведем итог нашему разбору. Ошибка решается простым приведением сигнатуры процедуры к требуемому виду. Выполним следующие шаги:

  1. Откроем модуль объекта внешней обработки.
  2. Найдем строку Процедура Печать(...) Экспорт.
  3. Убедимся, что параметров ровно 4.
  4. Если параметров 5, удалим лишний (обычно последний) или сделаем его необязательным через = Неопределено.
  5. Внутри процедуры перепишем логику определения команды, используя данные из КоллекцияПечатныхФорм.

Соблюдение этих несложных правил позволит вашим внешним обработкам работать стабильно и без ошибок на любых современных конфигурациях 1С.

← На главную