Как вывести водяной знак или фоновую картинку на печатную форму в 1С 7.7

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

В платформе 1С:Предприятие 7.7 (в среде разработчиков известной как «клюшки») стандартный механизм работы с графикой в табличных документах весьма ограничен. Разработчики часто сталкиваются со следующей проблемой: при попытке наложить фоновое изображение (например, логотип, надпись «Оплачено», «Копия» или «мокрую» печать) на документ, картинка либо перекрывает текст, либо отображается с непрозрачным «грязным» фоном, либо разрывается при циклическом выводе секций таблицы. Настройка параметров принтера по умолчанию также не всегда подходит, поскольку водяной знак требуется выводить избирательно — только для определенных документов (например, для счетов на оплату) и только при определенных условиях.

В этой статье мы подробно рассмотрим и разберем по шагам несколько проверенных практических способов обхода этих ограничений. Мы проанализируем как простые системные методы настройки печати, так и продвинутые программные решения с использованием внешних компонент и ActiveX.

Способ 1. Создание дублирующего принтера в операционной системе Windows

Этот метод не требует изменения кода конфигурации или программирования графических объектов в самой 1С. Мы используем встроенные возможности операционной системы Windows по управлению очередями печати.

Суть метода заключается в том, что для одного и того же физического печатающего устройства в системе создаются два логических принтера:

  1. Основной принтер (например, HP_LaserJet_Enterprise) — используется для обычной печати документов без каких-либо подложек.
  2. Принтер с водяным знаком (например, HP_LaserJet_Enterprise_Watermark) — ссылается на тот же физический порт подключения, но в его системных свойствах («Настройки печати» -> вкладка «Эффекты» или «Оформление») принудительно включен вывод водяного знака с нужным текстом или графическим файлом.

Разберем, как использовать эту схему в программном коде 1С 7.7. Для автоматического переключения принтеров перед выводом на печать мы можем использовать управление параметрами страницы табличного документа.

Рассмотрим пример кода:


// Создаем объект таблицы печатной формы
Таб = СоздатьОбъект("Таблица");
// Заполняем и выводим секции документа
Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("Строка");
Таб.ВывестиСекцию("Подвал");

// Если требуется напечатать документ с водяным знаком
Если НужноПечататьВодянойЗнак = 1 Тогда
    // Задаем параметры страницы и имя специального принтера
    Таб.ПараметрыСтраницы(,,,,,,,,, "HP_LaserJet_Enterprise_Watermark");
Иначе
    // Печатаем на стандартный принтер
    Таб.ПараметрыСтраницы(,,,,,,,,, "HP_LaserJet_Enterprise");
КонецЕсли;

// Отправляем документ на принтер без вывода диалога выбора
Таб.Напечатать(0);

Этот способ максимально надежен, поскольку всю тяжелую работу по отрисовке графики берет на себя драйвер принтера, а размер формируемого файла таблицы .mxl остается минимальным.

Способ 2. Использование внешнего PDF-принтера с постобработкой утилитами

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

Мы можем настроить печать из 1С 7.7 на виртуальный принтер (например, PDFCreator или Bullzip PDF Printer), который автоматически сохраняет документ в файл. После этого мы программно запускаем консольную утилиту, которая «накладывает» водяной знак (файл-подложку) поверх созданного документа.

Для объединения двух PDF-файлов (документа и файла водяного знака) отлично подходит бесплатная консольная утилита pdftk или пакет Ghostscript.

Рассмотрим, как реализовать этот алгоритм программно:


// Предположим, что документ уже сохранен в PDF-файл программно
ПутьКДокументу = "C:\Invoices\Invoice_123.pdf";
ПутьКПодложке = "C:\Templates\Watermark_Draft.pdf";
ПутьКРезультату = "C:\Invoices\Invoice_123_Watermarked.pdf";

// Формируем команду для консольной утилиты pdftk
// Параметр background накладывает подложку под текст основного документа
КомандаСкрипта = "pdftk """ + ПутьКДокументу + """ background """ + ПутьКПодложке + """ output """ + ПутьКРезультату + """";

// Выполняем системную команду скрыто
КомандаСистемы(КомандаСкрипта);

Этот метод гарантирует стопроцентное сохранение качества векторного текста исходного документа и идеальную прозрачность водяного знака на любых современных операционных системах.

Способ 3. Внедрение OLE-объекта (Word/Excel) с прозрачным фоном

Стандартный механизм вставки картинок в платформе 1С 7.7 часто работает некорректно с прозрачным слоем в форматах PNG или GIF. Вместо прозрачности на печать может выводиться серый, черный или белый непрозрачный прямоугольник, который полностью закрывает текст таблицы. Чтобы обойти это ограничение, мы можем использовать технологию OLE.

Проанализируем пошагово процесс внедрения объекта:

  1. Подготовим изображение водяного знака в графическом редакторе с прозрачным фоном и сохраним его в формате PNG.
  2. Откроем пустой лист Microsoft Excel или документ Microsoft Word. Вставим туда нашу картинку.
  3. В свойствах разметки изображения внутри Word или Excel установим режим обтекания «За текстом» и отрегулируем уровень прозрачности рисунка.
  4. Выделим и скопируем этот OLE-объект в буфер обмена.
  5. Откроем шаблон нашей печатной формы в конфигураторе 1С 7.7. Перейдем в меню и выполним команду вставки скопированного OLE-объекта в нужное место таблицы.
  6. Дважды щелкнем по вставленному объекту в 1С и в открывшемся диалоге свойств перейдем на вкладку оформления. Установим параметры: Узор -> Фон -> Авто, а для стиля линий рамки укажем значение «Нет».

При выводе таблицы на печать текст 1С будет отображаться поверх этого OLE-объекта. Главный минус данного подхода — существенное увеличение размера результирующего файла .mxl и возможные задержки при формировании печатной формы на медленных компьютерах из-за инициализации OLE-сервера.

Способ 4. Использование внешней компоненты «Йоксель» (Yoksel)

Для профессионального решения задач со сложным форматированием печатных форм в сообществе разработчиков 1С 7.7 принято использовать библиотеку «Йоксель» (компонента SpreadSheet.dll). Она позволяет перехватывать сформированный табличный документ 1С непосредственно в оперативной памяти и программно манипулировать его графическими объектами.

Главное преимущество «Йокселя» заключается в том, что он решает проблему циклического вывода строк. Когда документ формируется построчно (секциями), стандартный рисунок 1С дублируется или разрывается. «Йоксель» позволяет наложить одну большую фоновую картинку на уже готовый, полностью сформированный лист.

Рассмотрим пример программной обработки документа с помощью «Йокселя»:


// Загружаем внешнюю компоненту Йоксель
Если ЗагрузитьВнешнююКомпоненту("SpreadSheet.dll") = 0 Тогда
    Предупреждение("Не удалось загрузить компоненту Йоксель!");
    Возврат;
КонецЕсли;

// Создаем и заполняем стандартную таблицу 1С
Таб = СоздатьОбъект("Таблица");
Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("Строка");
Таб.ВывестиСекцию("Подвал");

// Создаем объект Йокселя для управления табличным документом
ЙоксТаб = СоздатьОбъект("ТабличныйДокумент");
ЙоксТаб.ЗагрузитьИзТаблицы(Таб);

// Программно добавляем рисунок на задний план документа
Рисунки = ЙоксТаб.Рисунки;
НовыйРисунок = Рисунки.Добавить();
НовыйРисунок.Тип = 1; // Тип рисунка: Изображение
НовыйРисунок.Лево = 50; // Координаты позиционирования в пикселях
НовыйРисунок.Верх = 150;
НовыйРисунок.Ширина = 400;
НовыйРисунок.Высота = 300;
НовыйРисунок.Картинка = "C:\Templates\Watermark.png";
НовыйРисунок.ВыводитьНаПечать = 1;
НовыйРисунок.ZПорядок = 0; // Помещаем на самый задний план, под текст

// Выводим обработанный документ на печать или сохраняем в PDF/Excel
ЙоксТаб.Показать();

Компонента обеспечивает высокую скорость работы, корректную поддержку альфа-канала (настоящей прозрачности PNG) и стабильный экспорт документов в форматы PDF или XLS без искажения пропорций.

Способ 5. Вставка прозрачного GIF напрямую через конфигуратор (без OLE)

Выясним причину, почему разработчики редко используют прямую вставку прозрачных картинок, и как обойти это ограничение стандартными средствами платформы. По умолчанию диалоговое окно выбора файлов изображений в конфигураторе 1С 7.7 отфильтровано и не показывает файлы с расширением .gif. Однако сам графический движок платформы умеет корректно работать с этим форматом и его прозрачностью.

Применим следующий практический трюк:

  1. Подготовим изображение водяного знака и сохраним его в формате GIF с включенной прозрачностью фона (в режиме 1-битной прозрачности).
  2. В конфигураторе 1С 7.7 откроем нужную печатную форму и выберем пункт меню Таблица -> Вставить рисунок -> Картинка.
  3. В открывшемся диалоговом окне выбора файлов в поле «Имя файла» вручную пропишем полный путь к нашему файлу, включая расширение (например, C:\Templates\watermark.gif), и нажмем кнопку открытия. Платформа успешно импортирует этот файл.
  4. Откроем свойства вставленного рисунка и на вкладке оформления установим параметры: Узор -> Фон -> Авто. Стиль рамки установим в положение «Нет».

Данный метод чрезвычайно прост в реализации, не требует регистрации сторонних библиотек на компьютерах пользователей и отлично подходит для простых водяных знаков и логотипов, где не требуется полупрозрачность (градиентное размытие краев).

← На главную