Разработка и поддержка внешних печатных форм (ВПФ) — это ежедневная задача программиста 1С. Однако специфика их работы такова, что код формы не хранится в основной конфигурации, а при запуске система часто создает временный файл на сервере со случайным именем. Это делает невозможным простую установку точки останова в конфигураторе. В этой статье мы подробно разберем, как преодолеть эти трудности и эффективно отлаживать ВПФ в различных режимах работы платформы.
Проанализируем самый надежный метод, который подходит как для обычных, так и для управляемых форм. Суть заключается в том, чтобы превратить внешнюю печатную форму в полноценную обработку, которую можно открыть через меню Файл — Открыть. Рассмотрим пошагово, как это реализовать.
Во-первых, откроем нашу обработку в Конфигураторе. Нам необходимо добавить в нее основную форму. На этой форме разместим реквизит СсылкаНаОбъект. Тип этого реквизита должен соответствовать документу, для которого предназначена печатная форма (например, ДокументСсылка.РеализацияТоваровУслуг). Если форма универсальная, можно выбрать тип ЛюбаяСсылка.
Во-вторых, на форме создадим кнопку "Печать" или "Выполнить". В обработчике нажатия этой кнопки нам нужно вызвать экспортную процедуру или функцию Печать, которая находится в модуле объекта обработки.
Для обычного приложения (8.1, 8.2) код в модуле формы будет выглядеть так:
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вызываем процедуру печати из модуля объекта этой же обработки
Печать();
КонецПроцедуры
Для управляемого приложения (8.3) реализация несколько сложнее:
&НаСервере
Функция ПечатьНаСервере()
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
// Преобразуем данные формы в объект обработки для доступа к методам модуля объекта
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// Если печатная форма соответствует стандартам БСП
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ВашИдентификатор");
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьПараметрыВыводаПоУмолчанию();
// Вызываем экспортную функцию Печать из модуля объекта
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Возвращаем сформированный табличный документ из коллекции
Возврат КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецФункции
&НаКлиенте
Процедура КнопкаВыполнитьНажатие(Кнопка)
ТабДок = ПечатьНаСервере();
ТабДок.Показать("Результат отладки");
КонецПроцедуры
После такой подготовки мы можем просто открывать .epf файл, выбирать нужный документ в поле СсылкаНаОбъект и спокойно ставить точки останова в модуле объекта. Конфигуратор будет "ловить" их, так как файл открыт интерактивно.
Выясним, как можно попасть в модуль обработки, не внося в нее никаких изменений. Этот способ удобен, если у вас уже есть работающая система с подключенными ВПФ в режиме обычного приложения (например, УПП 1.3 или БП 2.0).
Разберем алгоритм действий. Система при печати внешней формы вызывает определенные общие модули. Нам нужно найти место, где происходит создание объекта внешней обработки. В старых конфигурациях это часто общий модуль УниверсальныеМеханизмы или ДополнительныеОтчетыИОбработки.
Обработка.Печать().Печать модуля объекта.Важный нюанс: Помните, что любые правки, внесенные во временный файл, который открыл конфигуратор, будут утеряны. Чтобы сохранить изменения, вам придется найти исходный .epf на диске, внести правки туда и заново загрузить его в справочник "Внешние обработки".
Рассмотрим вариант для тех, кто ценит свое время и не хочет каждый раз городить формы для отладки. Сообщество 1С давно разработало универсальные обработки для тестирования ВПФ.
Такие инструменты позволяют выбрать файл обработки с диска, выбрать тип документа и конкретный экземпляр объекта, а затем программно вызвать метод печати так, как это сделала бы сама БСП (Библиотека Стандартных Подсистем). Это "правильный" инструмент, который эмулирует среду выполнения печатной формы, передавая ей все необходимые параметры: МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати и ПараметрыВывода.
Проанализируем ситуацию, когда точка останова не срабатывает, хотя вы всё сделали правильно. В современных версиях платформы 8.3 выполнение кода печатных форм происходит на стороне сервера. Чтобы отладка заработала, необходимо проверить следующие настройки:
-debug. Без этого конфигуратор не сможет подключиться к серверному сеансу.Посмотрим на хитрость, которую можно использовать, если нужно быстро глянуть значения переменных в середине сложного алгоритма. В начало процедуры Печать можно добавить заведомо ошибочный код внутри блока попытки или просто вызвать исключение:
// Вставляем временный код для вызова отладчика
Попытка
А = 1 / 0; // Деление на ноль вызовет ошибку
Исключение
// Включаем в конфигураторе "Отладка - Остановка на ошибке"
КонецПопытки;
Если в конфигураторе включена опция "Останавливаться по ошибке", система сама откроет модуль обработки в месте возникновения исключения. Это позволит вам исследовать контекст выполнения, не создавая лишних форм.
Выясним причину, по которой код в управляемом приложении часто "не ловится". Помимо серверного режима, печать в БСП часто уходит в фоновое задание. Чтобы отладчик сработал, нужно либо временно отключить фоновую печать в настройках программы, либо успеть подключиться к фоновому заданию через окно подключений конфигуратора.
Также, если вы используете метод с РеквизитФормыВЗначение, не забывайте, что это "тяжелая" операция. Для отладки она незаменима, но в рабочем коде самой печатной формы старайтесь работать напрямую с объектами, которые передает вам система БСП в параметрах функции Печать.
Подводя итог, можно сказать: для быстрой правки "на лету" лучше использовать метод F11 во временном файле, а для серьезной разработки новой формы — создание встроенной формы с реквизитом СсылкаНаОбъект. Это обеспечит вам полный контроль над процессом и удобство работы с кодом.