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