Разработка и отладка внешних печатных форм (ВПФ) в современных конфигурациях 1С (таких как Бухгалтерия предприятия 3.0, ERP 2.5, Управление торговлей 11) часто вызывает трудности у разработчиков. Типичный сценарий: при попытке запустить отладку ВПФ с помощью старых тестовых обработок возникает критическая ошибка:
{ВнешняяОбработка.ТестированиеВнешнихПечатныхФорм.Форма.ОсновнаяФорма.Форма(309)}: Недостаточно фактических параметров ВнешняяОбработка.Печать(ИдентификаторКомандыОбработки, ОбъектыНазначенияМассив);
В этой статье мы подробно разберем, почему возникает эта ошибка, как исправить логику работы тестовых обработок, а также рассмотрим самые современные, удобные и быстрые способы отладки внешних печатных форм без использования стороннего софта.
---
Для начала проанализируем причину конфликта. Ошибка указывает на несоответствие сигнатуры (количества параметров) процедуры Печать в модуле объекта вашей внешней печатной формы и того вызова, который делает тестовая обработка.
В устаревших версиях Библиотеки стандартных подсистем (БСП) или при определенных типах команд (например, «ВызовСерверногоМетода») процедура Печать принимала всего два параметра: идентификатор команды и массив объектов назначения. Код вызова выглядел так:
ВнешняяОбработка.Печать(ИдентификаторКоманды, ОбъектыНазначения);
Однако современный стандарт БСП для печатных форм формата MXL (табличный документ) жестко регламентирует, что экспортная процедура Печать в модуле объекта ВПФ должна принимать строго 4 параметра:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Когда старая тестовая обработка пытается вызвать процедуру с двумя параметрами, платформа 1С блокирует выполнение, так как ожидается четыре параметра. Выяснив причину, рассмотрим способы решения этой проблемы. В качестве корректной основы для разработки можно использовать готовый шаблон внешней печатной формы по стандартам БСП, содержащий правильную структуру процедур.
---
Если вы хотите продолжать использовать внешнюю обработку для тестирования (например, «Тестирование внешних печатных форм 1.7.epf»), вам необходимо доработать ее код. Проанализируем, какие изменения нужно внести:
Печать (обычно она располагается в модуле управляемой формы обработки тестирования).
// 1. Инициализируем массив объектов назначения
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ВыбранныйДокументСсылка);
// 2. Подготавливаем коллекцию печатных форм с помощью БСП
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИдентификаторКоманды);
// 3. Создаем структуру параметров вывода и список объектов печати
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// 4. Вызываем процедуру Печать внешней обработки с 4 параметрами
ВнешняяОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Важное замечание: как справедливо отмечено на форуме, в некоторых версиях БСП функция УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм перестала быть экспортной. Чтобы обойти это ограничение, скопируйте код этой функции из общего модуля БСП напрямую в модуль формы вашей тестовой обработки и вызывайте локальную версию.
---
Это самый чистый, профессиональный и универсальный метод отладки. Вам не понадобятся никакие сторонние обработки. Мы просто добавим временную управляемую форму внутрь самой разрабатываемой ВПФ.
Разберем этот процесс по шагам:
В Конфигураторе откройте вашу ВПФ. Добавьте в нее новую форму и сделайте ее Основной формой обработки. При регистрации в справочнике «Дополнительные отчеты и обработки» БСП проигнорирует эту форму, но она позволит нам запускать ВПФ напрямую через меню Файл -> Открыть.
Добавьте на форму реквизит СсылкаНаОбъект с типом ссылки на тот документ, для которого предназначена печатная форма (например, ДокументСсылка.РеализацияТоваровУслуг). Вынесите этот реквизит на форму и добавьте кнопку «Отладить печать».
В модуле созданной формы напишем обработчик нажатия кнопки. Он будет эмулировать стандартный вызов БСП на сервере:
&НаКлиенте
Процедура ОтладитьПечать(Команда)
Если Не ЗначениеЗаполнено(Объект.СсылкаНаОбъект) Тогда
ПоказатьПредупреждение(, "Выберите документ для отладки печати!");
Возврат;
КонецЕсли;
ВыполнитьПечатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьПечатьНаСервере()
// Получаем объект внешней обработки из реквизита формы
ВПФОбъект = РеквизитФормыВЗначение("Объект");
// Формируем параметры в соответствии со стандартом БСП
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("УПДСтатус1_981Внешний");
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Непосредственный вызов процедуры Печать в модуле объекта
ВПФОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Выведем полученный табличный документ на экран для визуального контроля
СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти("УПДСтатус1_981Внешний", "ИмяМакета");
Если СтрокаПечатнойФормы <> Неопределено Тогда
// Передаем табличный документ в реквизит формы для отображения (если на форму добавлен элемент ПолеТабличногоДокумента)
// Или просто записываем на диск для проверки:
СтрокаПечатнойФормы.ТабличныйДокумент.Записать("D:\temp_invoice.mxl");
КонецЕсли;
КонецПроцедуры
Теперь для отладки вам достаточно открыть ВПФ через Файл -> Открыть в режиме Предприятия, выбрать документ и нажать кнопку. Точки останова в модуле объекта ВПФ будут срабатывать мгновенно и без ошибок параметров!
---
Если вам нужно срочно посмотреть значения переменных «прямо сейчас», и у вас нет времени создавать формы или дорабатывать тестовые обработки, воспользуйтесь системной возможностью платформы 1С:
Печать принудительно вызовите ошибку времени выполнения, написав простую строку:а = 1 / 0; // Намеренное деление на ноль
---
Как указано в сообщении 10 темы обсуждения, критически важно проверять возвращаемые данные в функции СведенияОВнешнейОбработке(). Если вы указали неправильный тип команды, БСП начнет вызывать обработку некорректно.
Убедитесь, что для печатных форм табличного документа (MXL) у вас правильно заполнены параметры команды:
НоваяСтрока = ТаблицаКоманд.Добавить();
НоваяСтрока.Представление = "Универсальный передаточный документ (внешний)";
НоваяСтрока.Идентификатор = "УПДСтатус1_981Внешний";
// Используйте правильный модификатор для MXL-форм:
НоваяСтрока.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыПечатьMXL();
НоваяСтрока.ПоказыватьОповещение = Истина;
НоваяСтрока.Модификатор = "ПечатьMXL";
Если в поле Использование указано значение ВызовСерверногоМетода, система будет ожидать от вашей обработки совершенно другую структуру вызова, что неизбежно приведет к ошибкам количества переданных параметров.
Применяя предложенные методики, вы навсегда избавитесь от проблем несовместимости параметров при разработке печатных форм и сможете быстро и комфортно вести отладку кода любой сложности. Для более глубокой кастомизации без переписывания исходных запросов также подойдёт метод постобработки печатных форм БСП с применением расширения.