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

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

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

Причины проблем при отладке и формировании печатной формы

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

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

Способ 1. Создание тестовой формы для прямой отладки (Файл — Открыть)

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

Проанализируем модуль созданной формы отладки:


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

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

Теперь открываем файл обработки через меню Файл — Открыть в режиме предприятия, выбираем нужный документ и нажимаем кнопку. Все точки останова в модуле формы и модуле объекта будут гарантированно отрабатывать.

Способ 2. Исправление кода формирования печатной формы в модуле объекта

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


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

Важные правила проверки соответствия идентификаторов:

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

Способ 3. Отладка через шаги в типовой конфигурации (F11)

Если печатная форма уже зарегистрирована в справочнике Дополнительные отчеты и обработки и требуется проверить ее работу в реальном интерфейсе:

  1. Открываем в конфигураторе общий модуль ДополнительныеОтчетыИОбработки.
  2. Находим место выполнения серверной команды печати (вызов метода ВнешняяОбработкаОбъект.Печать(...)) и устанавливаем точку останова.
  3. В режиме «1С:Предприятие» запускаем печать документа.
  4. После остановки выполнения в общем модуле нажимаем клавишу F11 («Шагнуть в»), чтобы перейти внутрь процедуры Печать модуля объекта внешней обработки.

Обратите внимание на настройки отладки: если база работает в клиент-серверном режиме, служба ragent сервера 1С должна быть запущена с ключом -debug, а в конфигураторе в меню Отладка — Подключение — Настройка должны быть активны флаги автоматического подключения к серверным процессам и фоновым заданиям.

← На главную