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