Почему внешняя печатная форма в 1С выводит пустой лист и как это исправить

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке внешних печатных форм (ВПФ) для систем на платформе 1С:Предприятие 8 (особенно в конфигурациях на «обычных формах», таких как УПП 1.3 или УТ 10.3) программисты часто сталкиваются с ситуацией, когда вместо ожидаемого документа открывается абсолютно чистый лист. Кажется, что код скопирован верно, макет присутствует, но данных нет. Проанализируем ситуацию и разберем по шагам, почему это происходит и как заставить форму работать корректно.

Выясняем причину пустого макета: точка входа Печать

Первое, на что стоит обратить внимание — это механизм, по которому система взаимодействует с внешней обработкой. Когда пользователь нажимает кнопку «Печать» в документе, конфигурация подключает внешнюю обработку и ищет в её модуле объекта экспортную функцию Печать. Именно она является «точкой входа».

Рассмотрим ошибку, которую часто совершают на начальном этапе. Программист создает функцию Печать, инициализирует в ней новый табличный документ, но забывает наполнить его данными или вызвать вспомогательные функции. Посмотрим на пример некорректного кода:


Функция Печать() Экспорт
    ТабДокумент = Новый ТабличныйДокумент;
    Возврат ТабДокумент;
КонецФункции

В этом случае программа честно выполняет код: создает «белый лист» (объект ТабличныйДокумент) и возвращает его системе. Система отображает этот пустой объект пользователю. Чтобы исправить это, нам необходимо вызвать основную логику формирования печатной формы внутри этой функции.

Разбор ошибки «Недостаточно фактических параметров»

Часто основная логика печати копируется из модуля типового документа. В типовых решениях функция печати часто имеет параметры, например, Тип документа (счет или заказ). Если мы просто напишем в функции Печать вызов основной функции без аргументов, система выдаст ошибку выполнения.

Проанализируем ситуацию: в типовом коде функция может выглядеть так: ПечатьСчетаЗаказа(Тип). При вызове из нашей точки входа мы обязаны передать этот Тип. Рассмотрим правильную реализацию функции Печать во внешней обработке:


Функция Печать() Экспорт
    // Определяем тип печати, который ожидает вложенная функция
    Тип = "ЗаказПоставщику"; 
    
    // Вызываем основную логику и получаем заполненный табличный документ
    ТабДокумент = ПечатьСчетаЗаказа(Тип);
    
    Возврат ТабДокумент;
КонецФункции

Процесс формирования макета и заполнения данными

Теперь рассмотрим подробнее, как должна быть устроена сама функция ПечатьСчетаЗаказа. Основная задача здесь — получить данные из базы данных с помощью запроса, получить области из макета и последовательно вывести их в итоговый табличный документ.

Важный момент: во внешних печатных формах для обращения к документу-основанию используется реквизит СсылкаНаОбъект. Убедитесь, что этот реквизит добавлен в вашу внешнюю обработку и имеет тип соответствующего документа (в нашем примере — ДокументСсылка.ЗаказПоставщику).

Разберем основные этапы формирования документа:

  1. Получение макета: Используем метод ПолучитьМакет("ИмяВашегоМакета"). Убедитесь, что имя в коде совпадает с именем макета в структуре обработки.
  2. Выполнение запроса: Нам нужно извлечь данные шапки и табличных частей. Важно использовать параметр &ТекущийДокумент, в который мы передадим СсылкаНаОбъект.
  3. Заполнение областей: Каждая часть документа (Заголовок, Поставщик, Строка таблицы) — это отдельная область макета. Мы получаем их методом ПолучитьОбласть, заполняем параметры и выводим в документ методом Вывести.

Посмотрим на пример реализации вывода строк товаров, где учитываются разные типы номенклатуры:


// Вывести табличную часть
Для каждого ВыборкаСтрокТовары Из ЗапросТовары Цикл
    Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
        Продолжить; // Пропускаем пустые строки
    КонецЕсли;

    ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
    ОбластьСтроки.Параметры.Заполнить(ВыборкаСтрокТовары);
    
    // Дополнительная логика формирования представления товара
    ОбластьСтроки.Параметры.Товар = СокрЛП(ВыборкаСтрокТовары.Товар);
    
    ТабДокумент.Вывести(ОбластьСтроки);
    
    Сумма = Сумма + ВыборкаСтрокТовары.Сумма;
КонецЦикла;

Типичные ошибки, приводящие к пустому листу

Даже если функция Печать вызывает формирование документа, результат все равно может быть пустым. Рассмотрим подробнее, почему так происходит:

Практические советы по отладке внешней формы

Для того чтобы быстро найти место «обрыва» логики, рекомендуем использовать следующие приемы:

  1. Проверка на пустой запрос: Сразу после выполнения запроса добавьте условие Если ЗапросТовары.Пустой() Тогда Сообщить("Нет данных для печати!"); КонецЕсли;.
  2. Ручной вызов: Добавьте на форму обработки кнопку и поле ввода документа. В обработчике кнопки вызывайте свою функцию Печать().Показать(). Это позволит увидеть ошибки в реальном времени без постоянной переустановки ВПФ в справочник внешних обработок.
  3. Использование ОбщегоНазначения: В типовых конфигурациях многие функции (например, склонение имен или формирование адресов) вынесены в общие модули. Убедитесь, что ваша внешняя форма имеет к ним доступ.

Подведем итог: Чтобы внешняя печатная форма не выводила пустой макет, необходимо убедиться, что экспортная функция Печать вызывает рабочую логику, передает все необходимые параметры и получает на выходе заполненный объект ТабличныйДокумент. Тщательно проверяйте связь между параметрами запроса и именами полей в макете — именно здесь кроется большинство ошибок разработчиков.

← На главную