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