При разработке внешних печатных форм (ВПФ) на базе Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с проблемой: внешняя печатная форма, сохраненная и зарегистрированная в справочнике ДополнительныеОтчетыИОбработки, выполняется из документа, но отладчик в Конфигураторе не останавливается на точках останова или при возникновении исключений внутри модуля обработки. При попытке перехватить ошибку стек вызовов выбрасывает в типовой общий модуль на строке вызова метода Печать.
Разберем детально, почему возникает такое поведение платформы, а также рассмотрим несколько практических способов полноценной отладки модуля внешней печатной формы.
Проанализируем внутренний механизм работы подсистемы «Дополнительные отчеты и обработки» БСП:
ВнешниеОбработки.Подключить() платформа компилирует модуль обработки напрямую из потока в памяти сервера, не создавая физический файл на диске. Так как у скомпилированного контекста отсутствует путь к файлу на жестком диске, Конфигуратор не может сопоставить исполняемый байт-код с файлом .epf, открытым у разработчика.УстановитьПривилегированныйРежим(Истина), что нередко приводит к скрытым ошибкам ограничения прав (RLS) при выборке данных табличных частей документов.Это наиболее удобный и современный способ, который позволяет отлаживать внешнюю печатную форму непосредственно в момент ее штатного вызова из документа, не снимая конфигурацию с поддержки.
Разберем алгоритм по шагам:
ДополнительныеОтчетыИОбработки.&Вместо, подменив загрузку из временного хранилища на создание объекта из физического файла на диске:
&Вместо("ПодключитьВнешнююОбработку")
Функция Расш_ПодключитьВнешнююОбработку(Ссылка)
// Указываем прямой путь к разрабатываемому файлу на диске
ПутьКФайлу = "C:\Dev\ПечатнаяФорма.epf";
// Подключаем напрямую из файла без безопасного режима
Возврат ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
КонецФункции
Пока файл .epf по указанному пути открыт в Конфигураторе, платформа сможет точно связать исполняемый код с исходником, и точки останова внутри модуля объекта будут штатно срабатывать при нажатии кнопки печати в документе.
Если нет возможности вносить изменения в базу или добавлять расширения, отладить печать можно открытием файла через стандартное меню Файл → Открыть. Для этого внутрь внешней обработки добавляется основная форма с реквизитом СсылкаНаОбъект и кнопкой вызова стандартной экспортной процедуры Печать.
Посмотрим на пример кода серверной процедуры формы, которая эмулирует окружение БСП:
&НаСервере
Процедура ВыполнитьПечатьНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
// Формируем массив объектов для печати
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаОбъект);
// Инициализируем коллекцию печатных форм БСП
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВРЕГ", Новый ОписаниеТипов("Строка"));
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяШаблона", Новый ОписаниеТипов("Строка"));
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент", Новый ОписаниеТипов("ТабличныйДокумент"));
КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета", Новый ОписаниеТипов("Строка"));
СтрокаФормы = КоллекцияПечатныхФорм.Добавить();
СтрокаФормы.ИмяВРЕГ = ВРег("НашаПечатнаяФорма");
СтрокаФормы.ИмяШаблона = "НашаПечатнаяФорма";
СтрокаФормы.ТабличныйДокумент = Новый ТабличныйДокумент;
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Вызываем стандартную экспортную процедуру модуля объекта
ОбъектОбработки.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Выводим полученный табличный документ на форму или открываем
СтрокаФормы.ТабличныйДокумент.Показать();
КонецПроцедуры
В этом случае обработка полностью выполняется из открытого файла, контекст отладчика сохраняется, и доступны любые точки останова внутри процедур формирования макета.
В тестовых базах, где конфигурация уже снята с поддержки, можно временно переопределить функции загрузки в модуле ДополнительныеОтчетыИОбработки.
Рассмотрим пример внесения изменений в функцию подключения:
Функция ПодключитьВнешнююОбработку(Ссылка) Экспорт
// Вместо стандартного подключения из временного хранилища:
// ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , БезопасныйРежим);
// Используем прямое создание объекта из файла:
Возврат ВнешниеОбработки.Создать("C:\Dev\ПечатнаяФорма.epf", Ложь);
КонецФункции
После завершения отладки и исправления ошибок закомментированный типовой код необходимо вернуть в исходное состояние.