Почему во внешней печатной форме 1С отображаются пустые параметры вместо данных?

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При разработке внешних печатных форм (ВПФ) программисты часто сталкиваются с ситуацией, когда при тестировании через «Файл — Открыть» всё работает идеально, но после регистрации обработки в базе данных вместо реальных значений (номер, дата, контрагент) выводятся пустые поля или пробелы. Особенно это характерно для конфигураций, построенных на классической архитектуре «1С:Предприятие 8.2», таких как «Управление мебельной фабрикой» (УМФ) или «Управление производственным предприятием» (УПП). Проанализируем причины этой проблемы и разберем по шагам, как правильно настроить передачу данных.

Различие механизмов запуска обработки

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

  1. Запуск через «Файл — Открыть»: В этом случае вы открываете форму обработки, вручную выбираете документ в реквизит на форме и нажимаете кнопку «Печать». Код обращается к реквизиту формы, который вы сами заполнили, и данные успешно выводятся.
  2. Запуск из интерфейса документа (подключенная ВПФ): Когда форма запускается через меню «Печать» в документе, система сама создает экземпляр объекта обработки, записывает ссылку на текущий документ в специальный реквизит объекта и вызывает экспортную функцию печати. Форма обработки при этом не создается и не открывается.

Если код формирования макета опирается на данные из формы или если реквизит объекта настроен неверно, данные не будут переданы, и вы получите пустую печатную форму.

Шаг 1. Настройка реквизитов обработки

Выясним причину отсутствия данных. Для систем, не использующих БСП (Библиотека Стандартных Подсистем), критически важно наличие реквизита в метаданных самой обработки. Рассмотрим требования к нему:

Шаг 2. Реализация функции СведенияОбОбработке

Для регистрации ВПФ в справочнике внешних обработок необходимо описать ее параметры. В старых редакциях используется функция СведенияОбОбработке, которая располагается в Модуле объекта. Разберем пример реализации:


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

Шаг 3. Создание функции Печать в модуле объекта

Рассмотрим подробнее основной механизм формирования документа. Весь код должен находиться в модуле объекта, а функция Печать должна быть объявлена как Экспорт. Важно обращаться именно к реквизиту объекта СсылкаНаОбъект, а не к элементам формы.

Проанализируем правильный код формирования табличного документа:


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

Почему использование БСП-кода может вызывать ошибки?

Часто программисты пытаются использовать современные стандарты (функцию СведенияОВнешнейОбработке и процедуру Печать с массивом объектов), но в старых конфигурациях вроде УМФ это приводит к ошибкам. Если система выдает сообщение об ошибке Переменная не определена (УниверсальныеМеханизмы), это явный признак того, что конфигурация работает по старой схеме.

В этом случае необходимо строго придерживаться правил:

  1. Функция Печать() в модуле объекта не должна иметь входящих параметров.
  2. Вся информация о печатаемом объекте берется из реквизита СсылкаНаОбъект.
  3. Для тестирования через «Файл — Открыть» рекомендуется создать простую форму с одной кнопкой, код которой будет выглядеть так:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вызываем функцию печати из модуля объекта
    ПечатнаяФорма = Печать();
    ПечатнаяФорма.Показать();
КонецПроцедуры

Методы отладки «пробелов»

Если параметры всё равно не выводятся, проанализируем ситуацию с помощью простых методов диагностики:

Таким образом, решение проблемы пустых полей всегда кроется в правильной передаче ссылки из метаданных документа в метаданные внешней обработки через строго именованный реквизит объекта.

← На главную