При разработке и сопровождении подключаемых внешних печатных форм (ВПФ) и обработок разработчики часто сталкиваются с ситуацией, когда стандартные точки останова не срабатывают, а вызовы логирования не выводят данные. Внешняя печатная форма хранится в базе данных (в справочнике дополнительных отчетов и обработок) и запускается в серверном контексте, нередко внутри фонового задания. Разберем по шагам, почему привычные методы отладки могут не давать результата, и подробно рассмотрим проверенные способы быстрой и надежной отладки кода таких объектов.
Попытка использовать метод ЗаписьЖурналаРегистрации для отслеживания хода выполнения модуля ВПФ часто оказывается безрезультатной. Проанализируем возможные причины такого поведения:
СведенияОВнешнейОбработке. Если в структуре допущена синтаксическая ошибка или не заполнены обязательные параметры команды, выполнение прерывается до передачи управления на печать.Самый распространенный и универсальный способ отладки внешней печатной формы — создание внутри файла .epf собственной управляемой формы. Это позволяет запускать обработку непосредственно через меню «Файл» — «Открыть» в режиме предприятия и выполнять отладку в обычном клиент-серверном взаимодействии без необходимости каждый раз перезагружать файл в справочник базы.
Разберем по шагам, как настроить такую форму:
СсылкаНаОбъект (тип — ссылка на документ или справочник, для которого предназначена данная печатная форма).Посмотрим на пример клиент-серверного кода формы для вызова процедуры печати:
&НаСервере
Процедура СформироватьПечатнуюФормуНаСервере()
// Создаем коллекцию печатных форм по стандарту БСП
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета", Новый ОписаниеТипов("Строка"));
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент", Новый ОписаниеТипов("ТабличныйДокумент"));
КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета", Новый ОписаниеТипов("Строка"));
НоваяСтрока = КоллекцияПечатныхФорм.Добавить();
НоваяСтрока.ИмяМакета = "ПФ_MXL_ИмяМакета";
НоваяСтрока.ТабличныйДокумент = Новый ТабличныйДокумент;
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаОбъект);
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Получаем объект текущей обработки и вызываем процедуру формирования
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Отображаем сформированный результат
РеквизитТабличныйДокумент = НоваяСтрока.ТабличныйДокумент;
КонецПроцедуры
&НаКлиенте
Процедура КомандаПечать(Команда)
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Предупреждение("Выберите документ для отладки печати!");
Возврат;
КонецЕсли;
СформироватьПечатнуюФормуНаСервере();
КонецПроцедуры
В таком варианте точка останова, установленная в модуле объекта обработки в процедуре Печать, гарантированно сработает сразу после нажатия кнопки на форме.
Если требуется отладить внешнюю печатную форму непосредственно при ее вызове из типового интерфейса конфигурации, необходимо убедиться, что отладчик настроен для перехвата серверных и фоновых вызовов.
Проанализируем необходимые настройки:
-debug при протоколе TCP или с включенной отладкой по HTTP). Если отладка на сервере отключена, точки останова в серверных модулях работать не будут..epf в конфигураторе через «Файл» — «Открыть» и установим точку останова в нужной строке. Однако следует помнить: если БСП выгружает обработку из базы данных во временный каталог на сервере, путь к файлу может не совпасть с локальным файлом, и отладчик не свяжет исполняемый модуль с открытым в конфигураторе. В таком случае точку останова следует ставить в общем модуле БСП.Чтобы отследить выполнение обработки без изменения ее внутренней структуры, поставим точку останова в коде конфигурации, который отвечает за запуск внешних обработок.
ДополнительныеОтчетыИОбработки или УправлениеПечатью).ВнешниеОбработки.Создать(...) и последующий вызов метода Печать.Если логика формирования печатной формы сложная и требует длительной отладки со сбором стека вызовов, замером производительности и частым изменением кода, целесообразно перенести ее во временное расширение конфигурации.
.epf) и обновим его в справочнике базы.Если база данных находится на удаленном сервере, где отсутствует возможность подключить отладчик, а журнал регистрации не фиксирует события, воспользуемся явной записью во внешний текстовый файл на стороне сервера.
Посмотрим на пример служебной процедуры записи в файл:
Процедура ЗаписатьЛогСервер(ТекстЛога)
ПутьКЛогу = "C:\Logs\debug_print.txt";
ЗаписьТекста = Новый ЗаписьТекста(ПутьКЛогу, КодировкаТекста.UTF8, , Истина);
ЗаписьТекста.ЗаписатьСтроку(Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd HH:mm:ss") + " | " + ТекстЛога);
ЗаписьТекста.Закрыть();
КонецПроцедуры
Важно: каталог, в который выполняется запись, должен быть доступен для пользователя операционной системы, от имени которого запущена служба сервера 1С (обычно USR1CV8).