Как сохранить прозрачность картинок при печати из 1С 7.7 в PDF на Windows Server 2012?

Программист IT и автоматизация бизнеса
← На главную

Проблема потери прозрачности изображений при печати из 1С:Предприятие 7.7 является классической для системных администраторов и программистов, работающих с устаревшим стеком технологий в современных серверных операционных системах. Типичная ситуация: на локальной машине бухгалтера печать и подпись на печатной форме выглядят идеально, но при переносе базы на Windows Server 2012 и использовании виртуальных принтеров (Foxit, Adobe, PDF24) прозрачный фон внезапно превращается в белый или черный прямоугольник. Особенно остро это проявляется, когда изображения внедряются в табличный документ как OLE объект через Microsoft Word.

В этой статье мы подробно разберем причины такого поведения системы и рассмотрим несколько эффективных способов решения задачи — от тонкой настройки принтеров до использования мощных внешних компонент.

Выясняем причину: почему пропадает прозрачность?

Для начала проанализируем ситуацию с технической точки зрения. Основная причина кроется в особенностях обработки графического интерфейса GDI/GDI+ в сессиях удаленного рабочего стола (RDP) на Windows Server 2012. Когда мы печатаем документ через перенаправленный (redirected) принтер, часть процесса рендеринга происходит на стороне клиента, где локальные графические библиотеки успешно справляются с прозрачностью метафайлов (WMF/EMF), которые Word использует для контейнеризации картинок. Однако, когда печать инициируется непосредственно на сервере через локально установленный виртуальный принтер, система рендеринга в изолированной сессии может игнорировать альфа-канал, «схлопывая» слои графики в один непрозрачный слой.

Ситуация осложняется использованием OLE. Объект Word внутри 1С — это «черный ящик», передача данных из которого в поток печати сильно зависит от версии Office и настроек аппаратного ускорения графики. Разберем пошагово, как это исправить.

Решение 1: Использование специализированных OCX-компонент

Одним из самых надежных способов решения проблемы является отказ от тяжеловесных объектов OLE в пользу специализированных библиотек. Рассмотрим использование OCX от разработчика Z1. Этот метод позволяет внедрять изображения напрямую в табличный документ, обеспечивая корректную обработку прозрачности без привлечения ресурсов Microsoft Word.

Преимущества этого подхода:

  1. Существенное уменьшение размера результирующего файла (moxel).
  2. Стабильная работа с прозрачными BMP и PNG.
  3. Отсутствие зависимости от установленного пакета Microsoft Office на сервере.

При использовании внешних компонент работа с объектом на печатной форме выглядит примерно так:


// Пример инициализации объекта для печати
Попытка
    КартинкаПечати = СоздатьОбъект("Z1.PictureOCX");
    КартинкаПечати.Загрузить(ПутьКФайлу);
    КартинкаПечати.Прозрачность = 1;
Исключение
    Сообщить("Компонента Z1 не зарегистрирована");
КонецПопытки;

Решение 2: Переход на Yoksel (Йоксель)

Проанализируем возможности компоненты Yoksel. Для опытных разработчиков 1С 7.7 это стандарт де-факто при работе с печатными формами. Yoksel заменяет стандартный движок табличных документов 1С на более современный, который умеет экспортировать данные в PDF напрямую, минуя драйвер принтера.

Алгоритм действий при внедрении Yoksel:

  1. Подключаем библиотеку yoksel.dll.
  2. Вместо штатной команды Таб.Напечатать() используем методы объекта Конвертер.
  3. Настраиваем параметры сохранения, где прозрачность объектов сохраняется автоматически, так как конвертация идет на уровне графических примитивов, а не растрового отпечатка принтера.

Решение 3: Библиотека v7Moxel и EPPlus

Если формат вывода строго ограничен PDF, стоит рассмотреть современные наработки, такие как v7Moxel. Это расширение позволяет сохранять табличный документ в PDF без использования виртуальных принтеров вообще. Особенность метода в том, что он автоматически делает белый фон прозрачным при обработке изображений, что идеально подходит для печатей и подписей.

Рассмотрим пример логики сохранения:


// Использование v7Moxel для прямого вывода
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ПечатнаяФорма");
// ... заполнение таблицы ...
Мексель = СоздатьОбъект("v7Moxel.ТабличныйДокумент");
Мексель.ЗагрузитьИзТаблицы(Таб);
Мексель.ЭкспортВPDF(ИмяФайлаРезультата);

Этот метод исключает промежуточное звено в виде драйвера принтера, что полностью снимает проблему настройки серверов печати.

Решение 4: Тонкая настройка Microsoft Word 2016 на сервере

Если переделывать множество печатных форм слишком трудозатратно, попробуем изменить поведение самого OLE-контейнера. В Microsoft Office 2016 по умолчанию включено аппаратное ускорение графики, которое в серверных ОС часто работает некорректно.

Выполним следующие шаги:

  1. Запустите Word на сервере под учетной записью, от которой работает 1С (или настройте через реестр для всех).
  2. Перейдите в Файл -> Параметры -> Дополнительно.
  3. В разделе Экран установите флажок «Отключить аппаратное ускорение графики».
  4. Дополнительно в свойствах самого изображения внутри шаблона Word проверьте, чтобы оно было вставлено в режиме «Перед текстом» или «За текстом», а не «В тексте». Это меняет способ рендеринга объекта при передаче в GDI.

Решение 5: Использование формата WMF вместо растра

Выясним причину, почему штатный объект 1С Картинка не всегда справляется с прозрачностью. 1С 7.7 лучше всего работает с векторным форматом WMF (Windows Metafile). Если вы сконвертируете скан печати из PNG в WMF с прозрачным фоном, вы сможете вставить его в печатную форму как обычную картинку, а не через OLE.

Важный момент: При печати векторного WMF прозрачность сохраняется гораздо чаще, так как принтер получает инструкции по отрисовке линий и заливок, а не массив пикселей.

Решение 6: Альтернативные PDF-принтеры и Ghostscript

Если doPDF и Foxit не помогают, попробуйте классический PDFCreator (желательно версий 1.7.x) или Bullzip PDF Printer. В настройках Bullzip есть возможность форсировать использование Ghostscript для рендеринга. Ghostscript является гораздо более мощным интерпретатором PostScript, чем стандартные средства Windows, и позволяет корректно обрабатывать сложные слои прозрачности.

В файле настроек принтера (обычно settings.ini) можно попробовать изменить параметр обработки изображений:

  1. Установите ImageCompression=no.
  2. Выставите режим совместимости PDF/A-1b или наоборот, отключите стандарты архивирования для использования полной модели прозрачности Adobe PDF.

Резюме

Для решения проблемы на Windows Server 2012 мы рекомендуем следующий порядок действий: сначала попробуйте отключить аппаратное ускорение в Word. Если это не поможет, наиболее надежным и «профессиональным» путем будет внедрение компоненты Yoksel или v7Moxel. Это не только решит проблему с прозрачностью, но и ускорит формирование отчетов, а также избавит вас от проблем с «подвисшими» процессами Word в памяти сервера.

← На главную