При разработке печатных форм в системе «1С:Предприятие 8» программисты часто сталкиваются с неприятным визуальным артефактом: фоновое изображение, которое корректно отображается на экране и отлично выводится на физический принтер, при штатном сохранении в формат PDF превращается в сплошной черный квадрат. Эта проблема особенно актуальна для версий платформы 8.3 и связана с особенностями работы внутреннего конвертера 1С, который отвечает за формирование PDF-файлов. В этой статье мы подробно разберем причины возникновения этой ошибки и проанализируем несколько надежных способов ее решения. Для базовой настройки макетов печатных документов в пользовательском режиме пригодится инструкция по редактированию печатных форм в 1С.
Прежде чем переходить к коду, давайте выясним причину такого поведения системы. Проанализируем ситуацию: внутренний механизм 1С по сохранению в PDF является «закрытым» компонентом платформы. Он обрабатывает графику иначе, чем стандартная подсистема печати Windows (GDI+). Основными триггерами ошибки выступают:
ФоноваяКартинка: Данное свойство табличного документа предназначено скорее для визуального оформления подложки в самом интерфейсе программы, а при экспорте в PDF оно может обрабатываться по упрощенному алгоритму.Первое, что мы должны сделать — это подготовить само исходное изображение. Даже если файл имеет расширение .jpg, он мог быть сконвертирован из .png с сохранением «пустых» слоев. Рассмотрим алгоритм правильной подготовки графики:
Откроем изображение в простейшем редакторе (например, MS Paint) и сохраним его как «Изображение в формате JPEG». При этом важно убедиться, что выбрано 24-битное цветовое пространство (RGB). Это гарантированно удалит все метаданные о прозрачности и альфа-каналы, которые сбивают с толку конвертер 1С. Также рекомендуется снизить разрешение картинки до 150–300 DPI. Слишком высокая плотность пикселей (600 DPI и выше) может привести к нехватке памяти при рендеринге PDF, что также провоцирует появление черных областей.
Если простая замена формата файла не помогла, разберем более продвинутый и надежный метод. Вместо использования свойства ТабДок.ФоноваяКартинка, мы поместим изображение на задний план как отдельный графический объект. Этот метод считается «золотым стандартом» среди разработчиков 1С, так как он гораздо стабильнее отрабатывает при экспорте.
Проанализируем пример кода, который реализует этот подход:
// Предположим, у нас есть сформированный ТабличныйДокумент
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МойМакет");
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
// Вместо ТабДок.ФоноваяКартинка используем коллекцию Рисунки
КартинкаФона = Макет.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
КартинкаФона.Картинка = БиблиотекаКартинок.ЛоготипКомпании; // Или из макета
// Устанавливаем координаты (в мм или привязываем к ячейкам)
КартинкаФона.Верх = 0;
КартинкаФона.Лево = 0;
КартинкаФона.Ширина = 210; // Размер листа A4
КартинкаФона.Высота = 297;
// Ключевые свойства для создания эффекта фона
КартинкаФона.ВыводитьНаПечать = Истина;
КартинкаФона.РазмерКартинки = РазмерКартинки.Растянуть;
КартинкаФона.ГраницаСверху = Ложь;
КартинкаФона.ГраницаСнизу = Ложь;
КартинкаФона.ГраницаСлева = Ложь;
КартинкаФона.ГраницаСправа = Ложь;
// Помещаем картинку за текст
ТабДок.Рисунки.ПоместитьНаЗаднийПлан(КартинкаФона);
Важный момент: При использовании метода ПоместитьНаЗаднийПлан(), убедитесь, что у ячеек табличного документа, которые находятся «над» картинкой, свойство ЦветФона установлено в значение Авто (прозрачный). Если у ячеек будет жестко задан белый фон, картинку не будет видно.
Начиная с современных релизов платформы 8.3, 1С поддерживает векторный формат SVG. Если ваше фоновое изображение представляет собой логотип или геометрические узоры, перевод в вектор может полностью решить проблему с черным квадратом. Векторная графика описывается математическими формулами, и PDF-движок 1С интерпретирует ее гораздо точнее, чем растровые пиксели с прозрачностью. Попробуйте сохранить ваш фон как SVG и загрузить его в макет.
Если генерация PDF происходит на стороне сервера под управлением ОС Linux (например, в фоновом задании), черные квадраты могут появляться из-за отсутствия необходимых графических библиотек в системе. Выясним причину: 1С на Linux использует внешние пакеты для рендеринга шрифтов и изображений. Проверьте наличие установленного пакета libgs (Ghostscript) и шрифтов Microsoft (ttf-mscorefonts-installer). Без них процесс конвертации может завершаться некорректно, подменяя сложные объекты черными заглушками.
Рассмотрим ситуацию, когда ни один из программных методов не дает результата (например, из-за жестких ограничений старой версии платформы). Как мы заметили в обсуждении на форуме, печать через PDF-принтер работает корректно. Это происходит потому, что виртуальный принтер использует системный драйвер печати, который гораздо совершеннее внутреннего конвертера 1С.
В этом случае вместо метода ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF), можно использовать программную печать на установленный в системе PDF-принтер (например, PDFCreator или Bullzip). Это требует настройки прав доступа на сервере, но гарантирует стопроцентное соответствие экранной формы и итогового документа.
Подводя итоги, наиболее эффективным и «чистым» решением является сочетание двух факторов: правильной подготовки изображения (формат JPEG RGB без прозрачности) и использования объекта РисунокТабличногоДокумента с методом ПоместитьНаЗаднийПлан(). Это позволяет обойти ограничения свойства ФоноваяКартинка и добиться стабильного результата во всех современных версиях 1С.