При разработке внешних печатных форм (ВПФ) для систем на платформе 1С:Предприятие 8 (особенно в конфигурациях на «обычных формах», таких как УПП 1.3 или УТ 10.3) программисты часто сталкиваются с ситуацией, когда вместо ожидаемого документа открывается абсолютно чистый лист. Кажется, что код скопирован верно, макет присутствует, но данных нет. Проанализируем ситуацию и разберем по шагам, почему это происходит и как заставить форму работать корректно.
Первое, на что стоит обратить внимание — это механизм, по которому система взаимодействует с внешней обработкой. Когда пользователь нажимает кнопку «Печать» в документе, конфигурация подключает внешнюю обработку и ищет в её модуле объекта экспортную функцию Печать. Именно она является «точкой входа».
Рассмотрим ошибку, которую часто совершают на начальном этапе. Программист создает функцию Печать, инициализирует в ней новый табличный документ, но забывает наполнить его данными или вызвать вспомогательные функции. Посмотрим на пример некорректного кода:
Функция Печать() Экспорт
ТабДокумент = Новый ТабличныйДокумент;
Возврат ТабДокумент;
КонецФункции
В этом случае программа честно выполняет код: создает «белый лист» (объект ТабличныйДокумент) и возвращает его системе. Система отображает этот пустой объект пользователю. Чтобы исправить это, нам необходимо вызвать основную логику формирования печатной формы внутри этой функции.
Часто основная логика печати копируется из модуля типового документа. В типовых решениях функция печати часто имеет параметры, например, Тип документа (счет или заказ). Если мы просто напишем в функции Печать вызов основной функции без аргументов, система выдаст ошибку выполнения.
Проанализируем ситуацию: в типовом коде функция может выглядеть так: ПечатьСчетаЗаказа(Тип). При вызове из нашей точки входа мы обязаны передать этот Тип. Рассмотрим правильную реализацию функции Печать во внешней обработке:
Функция Печать() Экспорт
// Определяем тип печати, который ожидает вложенная функция
Тип = "ЗаказПоставщику";
// Вызываем основную логику и получаем заполненный табличный документ
ТабДокумент = ПечатьСчетаЗаказа(Тип);
Возврат ТабДокумент;
КонецФункции
Теперь рассмотрим подробнее, как должна быть устроена сама функция ПечатьСчетаЗаказа. Основная задача здесь — получить данные из базы данных с помощью запроса, получить области из макета и последовательно вывести их в итоговый табличный документ.
Важный момент: во внешних печатных формах для обращения к документу-основанию используется реквизит СсылкаНаОбъект. Убедитесь, что этот реквизит добавлен в вашу внешнюю обработку и имеет тип соответствующего документа (в нашем примере — ДокументСсылка.ЗаказПоставщику).
Разберем основные этапы формирования документа:
ПолучитьМакет("ИмяВашегоМакета"). Убедитесь, что имя в коде совпадает с именем макета в структуре обработки.&ТекущийДокумент, в который мы передадим СсылкаНаОбъект.ПолучитьОбласть, заполняем параметры и выводим в документ методом Вывести.Посмотрим на пример реализации вывода строк товаров, где учитываются разные типы номенклатуры:
// Вывести табличную часть
Для каждого ВыборкаСтрокТовары Из ЗапросТовары Цикл
Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
Продолжить; // Пропускаем пустые строки
КонецЕсли;
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
ОбластьСтроки.Параметры.Заполнить(ВыборкаСтрокТовары);
// Дополнительная логика формирования представления товара
ОбластьСтроки.Параметры.Товар = СокрЛП(ВыборкаСтрокТовары.Товар);
ТабДокумент.Вывести(ОбластьСтроки);
Сумма = Сумма + ВыборкаСтрокТовары.Сумма;
КонецЦикла;
Даже если функция Печать вызывает формирование документа, результат все равно может быть пустым. Рассмотрим подробнее, почему так происходит:
СсылкаНаОбъект не записан в базу или в запросе установлены слишком жесткие условия (например, фильтр по удаленным строкам), выборка будет пустой. Цикл Для каждого не выполнится ни разу, и области макета не будут выведены.Макет.ПолучитьОбласть("Шапка"), а в макете область называется «Заголовок», возникнет ошибка, которая может быть подавлена системой (в зависимости от настроек), и вывод прервется.Область.Параметры.Номенклатура = ... не выдаст ошибку, но и данные в печатную форму не попадут. Нужно установить значение «Параметр».Для того чтобы быстро найти место «обрыва» логики, рекомендуем использовать следующие приемы:
Если ЗапросТовары.Пустой() Тогда Сообщить("Нет данных для печати!"); КонецЕсли;.Печать().Показать(). Это позволит увидеть ошибки в реальном времени без постоянной переустановки ВПФ в справочник внешних обработок.Подведем итог: Чтобы внешняя печатная форма не выводила пустой макет, необходимо убедиться, что экспортная функция Печать вызывает рабочую логику, передает все необходимые параметры и получает на выходе заполненный объект ТабличныйДокумент. Тщательно проверяйте связь между параметрами запроса и именами полей в макете — именно здесь кроется большинство ошибок разработчиков.