Многие разработчики сталкиваются с неприятной ситуацией при разработке печатных форм, особенно в расширениях конфигурации. Представим сценарий: мы создали красивую печатную форму, взяв за основу корректный пример внешней печатной формы на БСП 3.1.10, добавили туда логотип, факсимиле подписи и печати. В режиме предварительного просмотра в 1С всё выглядит идеально. Сохраняем в Excel (XLSX) — тоже всё отлично. Но как только пользователь нажимает «Сохранить как...» и выбирает формат PDF, открытый файл встречает нас красными или черными перечеркнутыми квадратами (крестами) вместо изображений.
В этой статье мы подробно разберем, почему возникает эта проблема, как она связана с форматами файлов, механизмами платформы 1С и драйверами, и, самое главное, рассмотрим пошаговые методы решения этой задачи.
Появление креста (placeholder) вместо изображения — это не ошибка отсутствия файла. Это сигнал о том, что внутренний механизм конвертации 1С «видит» объект картинки, но не может корректно декодировать его бинарные данные для встраивания в структуру PDF-файла. Это часто случается, когда выполняется генерация QR и штрихкодов для печатных форм или вставка сложных логотипов. В отличие от Excel, где картинка просто вставляется как объект, PDF требует более строгой обработки графических потоков.
Давайте проанализируем основные причины, по которым это происходит, опираясь на практику и особенности платформы.
В исходной ситуации упоминается использование формата PNG и достаточно большого размера файла (1.41 МБ для подписи). Это одна из самых частых причин сбоя.
1. Проблема с PNG и прозрачностью
Встроенный PDF-конвертер платформы 1С (особенно в версиях 8.3.14 – 8.3.18) чувствителен к структуре PNG-файлов. Если картинка сохранена с использованием интерлейсинга (Interlacing/Чересстрочная развертка) или имеет сложный альфа-канал, конвертер может не справиться с рендерингом. Для подготовки "чистых" изображений может потребоваться автоматизация обработки фотографий и графики через GraphicsMagick, что позволит убрать лишние параметры из файлов.
2. Проблема размера и DPI
Файл подписи размером 1.41 МБ — это критически много для макета. Когда 1С формирует печатную форму, она часто разжимает изображение в памяти. Картинка с высоким разрешением, сжатая визуально до маленького прямоугольника на макете, требует огромных ресурсов GDI при конвертации. Внутреннему буферу может просто не хватить памяти для обработки.
Решение: Оптимизация графики
Существует два основных способа разместить картинку в табличном документе. Часто проблема возникает, когда картинка добавлена как «Рисунок» (плавающий объект), особенно если этот рисунок хранится в метаданных Расширения. В процессе тестирования макета вам может пригодиться универсальная форма отладки внешней печатной формы, которая поможет увидеть, как объект ведет себя в разных условиях.
При сохранении в PDF на сервере платформа иногда теряет контекст расширения и не может извлечь бинарные данные картинки из макета, если она вставлена как объект поверх ячеек.
Решение: Использование картинки в ячейке или программный вывод
Давайте рассмотрим альтернативный способ размещения — «Картинка в ячейке». Этот метод более надежен для табличных документов.
Картинка.РазмещениеКартинки в значение Пропорционально или Растянуть.Если статический вывод не помогает, наиболее надежным способом является программный вывод картинки в момент формирования печатной формы. Вместо того чтобы хранить картинку нарисованной в макете, мы будем вставлять её кодом.
Рассмотрим пример кода, как это сделать:
// Получаем область макета, где должна быть картинка
ОбластьМакета = Макет.ПолучитьОбласть("Подвал");
// Если картинка хранится в макете как двоичные данные или в библиотеке картинок
// Создаем объект Картинка
МояКартинка = БиблиотекаКартинок.ПодписьГенеральногоДиректора; // Или из хранилища
// Создаем рисунок в табличном документе программно
Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = МояКартинка;
Рисунок.Верх = 5; // Координаты в пунктах
Рисунок.Лево = 10;
Рисунок.Ширина = 40;
Рисунок.Высота = 20;
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
// Выводим область
ТабличныйДокумент.Вывести(ОбластьМакета);
Также существует рекомендация очищать клиентский кэш 1С, так как старые версии картинок могут «застревать» во временных файлах.
Мы выяснили, что версия платформы 8.3.18 имеет подтвержденные проблемы (баги) с подсистемой печати и генерации PDF, связанные с переходом на новые библиотеки рендеринга. Если оптимизация картинок не помогает, проблема может быть в самом движке платформы. В таких случаях разработчики часто используют методы работы с PDF без внешних компонентов, чтобы самостоятельно управлять процессом сохранения и масштабирования.
Решение: Обновление и проверка окружения
Важно понимать разницу между двумя действиями, которые приводят к созданию PDF-файла. Это знание поможет вам найти временное решение (workaround), если исправить код прямо сейчас невозможно.
Если при использовании метода «Печать на PDF-принтер» кресты исчезают и картинки отображаются корректно, это на 100% подтверждает, что проблема кроется во внутреннем алгоритме конвертации 1С.
Подводя итог, если вы столкнулись с «крестами» в PDF, действуйте в следующем порядке: