Почему при сохранении печатной формы в PDF или Word картинки и подписи меняются местами или дублируются?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разберем распространенную, но крайне неприятную техническую проблему, с которой часто сталкиваются разработчики при внедрении внешних печатных форм (ВПФ) в 1С. Представим ситуацию: вы создали красивую форму, в макете которой жестко зафиксирован логотип компании, а печати и подписи (факсимиле) ответственных лиц выводятся программно при выполнении определенных условий. На экране в режиме предварительного просмотра и при прямой отправке на физический принтер все выглядит идеально. Но как только пользователь решает сохранить документ на диск через меню «Файл — Сохранить как...» или с помощью горячих клавиш Ctrl + S в форматы PDF, Word (DOCX) или Excel (XLSX), верстка графики «разлетается»: картинки меняются местами, подпись руководителя дублирует печать, а логотип и вовсе исчезает.

В этой статье мы подробно проанализируем причины такого поведения платформы «1С:Предприятие» и разберем по шагам практические способы решения этой проблемы.

Причина 1. Ошибки встроенного конвертера платформы 1С

Встроенный в платформу 1С механизм конвертации табличных документов в сторонние форматы (особенно в PDF и DOCX) исторически имеет ряд задокументированных багов. В релизах платформы ветки 8.3 (особенно часто в версиях до 8.3.16) наблюдался критический баг при экспорте графических объектов.

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

Причина 2. Отсутствие уникальных имен у рисунков в коллекции табличного документа

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


НовыйРисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка = ПолучитьКартинкуПечати();
НовыйРисунок.Расположить(ОбластьМакета.Область("R10C2:R12C5"));

В данном примере мы упускаем важнейшую деталь — свойство Имя создаваемого объекта рисунка. Если имя не задано явно, платформа присваивает ему системное имя по умолчанию, основанное на внутреннем индексе. При сохранении документа в PDF структура XML-данных табличного документа перестраивается. Без уникальных имен конвертер теряет жесткую адресацию объектов в памяти, из-за чего вместо одной картинки выводится другая, а факсимиле начинает задваиваться.

Причина 3. Динамическая высота ячеек и привязка объектов (якорные свойства)

Каждая картинка в табличном документе позиционируется относительно ячеек сетки. Если в макете под картинками или рядом с ними находятся ячейки с включенным свойством «Автовысота строки» (например, для динамического вывода длинных наименований номенклатуры или адресов), то при сохранении в PDF или Excel физические границы ячеек пересчитываются заново. Из-за этого координаты рисунков «плывут», они накладываются друг на друга, вытесняют соседние графические элементы или меняются слоями.

---

Решение проблемы по шагам

Для того чтобы гарантировать корректное сохранение печатной формы со всеми графическими элементами в любые форматы, выполним следующие действия.

Шаг 1. Обновление технологической платформы 1С

Поскольку проблема в большинстве случаев вызвана внутренними багами конвертера платформы, самым простым и надежным решением является обновление платформы 1С:Предприятие 8.3 до актуального стабильного релиза (рекомендуется версия 8.3.18 и выше). В свежих релизах ошибки работы с объектом ПакетОтображаемыхДокументов и дублирования картинок при экспорте в PDF были полностью устранены разработчиками фирмы 1С.

Шаг 2. Присвоение уникальных имен программно добавляемым рисункам

Если обновить платформу прямо сейчас нет возможности, мы можем скорректировать программный код вывода картинок. Нам необходимо принудительно задавать уникальное свойство Имя каждому добавляемому рисунку. Это позволит конвертеру четко идентифицировать объекты при экспорте.

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


// Создаем область для вывода подвала с подписями
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

// Выводим факсимиле руководителя
РисунокПодписьДиректора = ОбластьПодвал.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокПодписьДиректора.Картинка = Справочники.Организации.ПолучитьФаксимилеПрезидента();
// Присваиваем уникальное имя во избежание коллизий при конвертации
РисунокПодписьДиректора.Имя = "Факсимиле_Руководителя_" + Строка(Новый УникальныйИдентификатор());
РисунокПодписьДиректора.РазмерКартинки = РазмерКартинки.АвтоРазмер;
РисунокПодписьДиректора.Расположить(ОбластьПодвал.Область("R5C3:R7C6"));

// Выводим печать организации
РисунокПечать = ОбластьПодвал.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокПечать.Картинка = Справочники.Организации.ПолучитьПечать();
// Задаем уникальное имя для печати
РисунокПечать.Имя = "Печать_Организации_" + Строка(Новый УникальныйИдентификатор());
РисунокПечать.РазмерКартинки = РазмерКартинки.АвтоРазмер;
РисунокПечать.Расположить(ОбластьПодвал.Область("R4C5:R8C9"));

ТабличныйДокумент.Вывести(ОбластьПодвал);

Использование функции Новый УникальныйИдентификатор() гарантирует, что даже при выводе нескольких аналогичных документов в один пакет (например, при групповой печати) имена картинок не будут пересекаться, и подмена изображений при экспорте станет невозможной.

Шаг 3. Настройка свойств привязки и размеров картинок

Чтобы избежать смещения картинок из-за изменения масштаба или пересчета высоты строк, настроим свойства позиционирования объектов:

  1. Помещайте динамические картинки (печать, подписи) только на те области макета, где у ячеек отключено свойство «Автовысота строки». Высота строк под картинками должна быть строго фиксированной.
  2. В свойствах каждого рисунка в конфигураторе (или программно) проверьте значение свойства РазмерКартинки. Рекомендуется использовать значения РазмерКартинки.АвтоРазмер или РазмерКартинки.Пропорционально. Избегайте значения РазмерКартинки.РеальныйРазмер, так как при конвертации физическое разрешение экрана (DPI) и параметры PDF-документа могут сильно отличаться, вызывая искажение пропорций.
  3. Настройте тип привязки рисунка к ячейкам. Используйте свойство рисунка Линия со значением пустой линии, чтобы скрыть границы рамки вокруг факсимиле.

Шаг 4. Проверка параметров страницы печатной формы

Иногда искажения при экспорте возникают из-за некорректно сохраненных индивидуальных настроек печати у конкретного пользователя 1С. Конвертер PDF ориентируется на настройки принтера по умолчанию.

Выясним причину через интерактивную настройку. Откройте предварительный просмотр проблемной печатной формы в режиме «1С:Предприятие». Перейдите в меню «Файл — Параметры страницы». Убедитесь, что:

После этого сохраните документ заново. Если это помогло, для исправления поведения у всех пользователей можно программно очищать настройки печати перед выводом документа с помощью метода ТабличныйДокумент.ИмяПараметровПечати = "".

Шаг 5. Альтернативный обходной путь (Виртуальный принтер)

Если вы столкнулись с жестким ограничением прав и не можете обновить платформу 1С или оперативно переписать код внешней печатной формы, используйте альтернативный способ сохранения. Вместо использования меню «Сохранить как» (Ctrl + S), отправьте документ на обычную печать (Ctrl + P) и выберите в качестве целевого устройства виртуальный принтер, например, Microsoft Print to PDF или любой другой PDF-редактор.

В этом случае рендерингом и позиционированием графических слоев занимается подсистема печати операционной системы Windows, которая корректно обрабатывает наложение картинок с прозрачным фоном и гарантирует 100% совпадение печатного листа с его PDF-копией.

← На главную