Как отладить внешнюю печатную форму в 1С:Предприятие 8.3?

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

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

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

Почему отладчик не попадает в модуль подключенной ВПФ

Проанализируем внутренний механизм работы подсистемы «Дополнительные отчеты и обработки» БСП:

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

Способ 1. Отладка через временное расширение конфигурации

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

Разберем алгоритм по шагам:

  1. Создадим временное расширение конфигурации со свойством Безопасный режим = Ложь.
  2. Добавим в расширение общий модуль ДополнительныеОтчетыИОбработки.
  3. Переопределим функцию подключения обработки с помощью аннотации &Вместо, подменив загрузку из временного хранилища на создание объекта из физического файла на диске:

&Вместо("ПодключитьВнешнююОбработку")
Функция Расш_ПодключитьВнешнююОбработку(Ссылка)
    // Указываем прямой путь к разрабатываемому файлу на диске
    ПутьКФайлу = "C:\Dev\ПечатнаяФорма.epf";
    
    // Подключаем напрямую из файла без безопасного режима
    Возврат ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
КонецФункции

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

Способ 2. Эмуляция вызова БСП через форму обработки

Если нет возможности вносить изменения в базу или добавлять расширения, отладить печать можно открытием файла через стандартное меню Файл → Открыть. Для этого внутрь внешней обработки добавляется основная форма с реквизитом СсылкаНаОбъект и кнопкой вызова стандартной экспортной процедуры Печать.

Посмотрим на пример кода серверной процедуры формы, которая эмулирует окружение БСП:


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

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

Способ 3. Прямая модификация общего модуля (для тестовых баз)

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

Рассмотрим пример внесения изменений в функцию подключения:


Функция ПодключитьВнешнююОбработку(Ссылка) Экспорт
    // Вместо стандартного подключения из временного хранилища:
    // ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , БезопасныйРежим);
    
    // Используем прямое создание объекта из файла:
    Возврат ВнешниеОбработки.Создать("C:\Dev\ПечатнаяФорма.epf", Ложь);
КонецФункции

После завершения отладки и исправления ошибок закомментированный типовой код необходимо вернуть в исходное состояние.

← На главную