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