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

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

Разработка и отладка внешних печатных форм (ВПФ) в современных конфигурациях 1С (таких как Бухгалтерия предприятия 3.0, ERP 2.5, Управление торговлей 11) часто вызывает трудности у разработчиков. Типичный сценарий: при попытке запустить отладку ВПФ с помощью старых тестовых обработок возникает критическая ошибка:

{ВнешняяОбработка.ТестированиеВнешнихПечатныхФорм.Форма.ОсновнаяФорма.Форма(309)}: Недостаточно фактических параметров ВнешняяОбработка.Печать(ИдентификаторКомандыОбработки, ОбъектыНазначенияМассив);

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

---

Почему возникает ошибка «Недостаточно фактических параметров»?

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

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

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

Однако современный стандарт БСП для печатных форм формата MXL (табличный документ) жестко регламентирует, что экспортная процедура Печать в модуле объекта ВПФ должна принимать строго 4 параметра:


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

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

---

Способ 1. Адаптация тестовой обработки под стандарты БСП

Если вы хотите продолжать использовать внешнюю обработку для тестирования (например, «Тестирование внешних печатных форм 1.7.epf»), вам необходимо доработать ее код. Проанализируем, какие изменения нужно внести:

  1. Откройте тестовую обработку в Конфигураторе.
  2. Найдите строку вызова метода Печать (обычно она располагается в модуле управляемой формы обработки тестирования).
  3. Перепишите участок вызова так, чтобы он имитировал стандартное поведение БСП. Для этого необходимо предварительно подготовить коллекции параметров:

// 1. Инициализируем массив объектов назначения
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ВыбранныйДокументСсылка);

// 2. Подготавливаем коллекцию печатных форм с помощью БСП
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИдентификаторКоманды);

// 3. Создаем структуру параметров вывода и список объектов печати
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();

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

Важное замечание: как справедливо отмечено на форуме, в некоторых версиях БСП функция УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм перестала быть экспортной. Чтобы обойти это ограничение, скопируйте код этой функции из общего модуля БСП напрямую в модуль формы вашей тестовой обработки и вызывайте локальную версию.

---

Способ 2. Рекомендуемый стандарт отладки (Добавление тестовой формы в саму ВПФ)

Это самый чистый, профессиональный и универсальный метод отладки. Вам не понадобятся никакие сторонние обработки. Мы просто добавим временную управляемую форму внутрь самой разрабатываемой ВПФ.

Разберем этот процесс по шагам:

Шаг 1. Создание отладочной формы

В Конфигураторе откройте вашу ВПФ. Добавьте в нее новую форму и сделайте ее Основной формой обработки. При регистрации в справочнике «Дополнительные отчеты и обработки» БСП проигнорирует эту форму, но она позволит нам запускать ВПФ напрямую через меню Файл -> Открыть.

Шаг 2. Размещение реквизитов на форме

Добавьте на форму реквизит СсылкаНаОбъект с типом ссылки на тот документ, для которого предназначена печатная форма (например, ДокументСсылка.РеализацияТоваровУслуг). Вынесите этот реквизит на форму и добавьте кнопку «Отладить печать».

Шаг 3. Написание кода вызова

В модуле созданной формы напишем обработчик нажатия кнопки. Он будет эмулировать стандартный вызов БСП на сервере:


&НаКлиенте
Процедура ОтладитьПечать(Команда)
    Если Не ЗначениеЗаполнено(Объект.СсылкаНаОбъект) Тогда
        ПоказатьПредупреждение(, "Выберите документ для отладки печати!");
        Возврат;
    КонецЕсли;
    
    ВыполнитьПечатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПечатьНаСервере()
    // Получаем объект внешней обработки из реквизита формы
    ВПФОбъект = РеквизитФормыВЗначение("Объект");
    
    // Формируем параметры в соответствии со стандартом БСП
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
    
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("УПДСтатус1_981Внешний");
    ОбъектыПечати = Новый СписокЗначений;
    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
    
    // Непосредственный вызов процедуры Печать в модуле объекта
    ВПФОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
    
    // Выведем полученный табличный документ на экран для визуального контроля
    СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти("УПДСтатус1_981Внешний", "ИмяМакета");
    Если СтрокаПечатнойФормы <> Неопределено Тогда
        // Передаем табличный документ в реквизит формы для отображения (если на форму добавлен элемент ПолеТабличногоДокумента)
        // Или просто записываем на диск для проверки:
        СтрокаПечатнойФормы.ТабличныйДокумент.Записать("D:\temp_invoice.mxl");
    КонецЕсли;
КонецПроцедуры

Теперь для отладки вам достаточно открыть ВПФ через Файл -> Открыть в режиме Предприятия, выбрать документ и нажать кнопку. Точки останова в модуле объекта ВПФ будут срабатывать мгновенно и без ошибок параметров!

---

Способ 3. Быстрая отладка через режим «Остановка по ошибке» (Лайфхак)

Если вам нужно срочно посмотреть значения переменных «прямо сейчас», и у вас нет времени создавать формы или дорабатывать тестовые обработки, воспользуйтесь системной возможностью платформы 1С:

  1. Откройте модуль объекта вашей внешней печатной формы в Конфигураторе.
  2. В самом начале процедуры Печать принудительно вызовите ошибку времени выполнения, написав простую строку:
  3. а = 1 / 0; // Намеренное деление на ноль

  4. Сохраните файл обработки и зарегистрируйте его в базе данных (или обновите уже существующую ВПФ в справочнике дополнительных обработок).
  5. В Конфигураторе перейдите в меню Отладка -> Настройка отладки -> Остановка по ошибке. Установите флаг «Останавливаться по ошибке».
  6. Запустите печать документа обычным способом из интерфейса 1С:Предприятия.
  7. Платформа начнет процесс печати, споткнется о деление на ноль во временном файле кэша и автоматически откроет Конфигуратор на этой строке.
  8. Важно: вы окажетесь во временном файле модуля печатной формы. Теперь вы можете закомментировать строку с делением на ноль прямо в процессе отладки, расставить реальные точки останова ниже по коду и продолжить выполнение клавишей F5.

---

Способ 4. Проверка сведений о внешней обработке

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

Убедитесь, что для печатных форм табличного документа (MXL) у вас правильно заполнены параметры команды:


НоваяСтрока = ТаблицаКоманд.Добавить();
НоваяСтрока.Представление = "Универсальный передаточный документ (внешний)";
НоваяСтрока.Идентификатор = "УПДСтатус1_981Внешний";
// Используйте правильный модификатор для MXL-форм:
НоваяСтрока.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыПечатьMXL(); 
НоваяСтрока.ПоказыватьОповещение = Истина;
НоваяСтрока.Модификатор = "ПечатьMXL";

Если в поле Использование указано значение ВызовСерверногоМетода, система будет ожидать от вашей обработки совершенно другую структуру вызова, что неизбежно приведет к ошибкам количества переданных параметров.

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

← На главную