Как программно вывести печать и подпись с прозрачным фоном в 1С и избежать перекрытия текста?

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

При автоматизации документооборота в 1С часто возникает задача вывода факсимиле (печатей организации и подписей ответственных лиц) непосредственно в печатные формы. На первый взгляд задача кажется простой, однако разработчики регулярно сталкиваются с сопутствующими техническими сложностями. Среди них — появление белого или черного непрозрачного фона у картинки, возникновение рамок вокруг изображения при печати или сохранении, а также перекрытие важного текста печатной формы линиями выводимого рисунка.

В этой статье мы подробно разберем, как программно вывести печать и подпись с абсолютно прозрачным фоном, настроить свойства графического объекта в табличном документе и обойти ограничения платформы 1С, связанные с порядком наложения слоев (Z-Order).

Шаг 1. Подготовка графического файла факсимиле

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

  1. Используйте строго формат PNG (или GIF). Популярный формат JPEG принципиально не поддерживает альфа-канал (прозрачность). Если сохранить печать в JPEG, вокруг нее неизбежно останется белый или серый прямоугольник, который перекроет текст документа.
  2. Правильно обрабатывайте изображение в графическом редакторе. Для создания прозрачного фона воспользуйтесь любым доступным редактором (например, Photoshop, GIMP или Paint.NET). Инструментом "Волшебная палочка" или "Цветовой диапазон" выделите белый фон вокруг печати/подписи и удалите его, оставив только цветные линии.
  3. Настройте полупрозрачность линий (рекомендуется). Чтобы синие чернила печати или синяя ручка подписи выглядели естественно на печатной форме и не перекрывали намертво буквы под ними, при обработке изображения задайте прозрачность самих линий на уровне 80–90%. При сохранении в формате PNG-24 (с поддержкой альфа-канала) платформа 1С корректно отобразит эту полупрозрачность.

Шаг 2. Базовый программный вывод картинки в табличный документ

Рассмотрим классический пример программного создания рисунка и добавления его в область макета. Чтобы картинка действительно была прозрачной, недостаточно просто использовать файл PNG. В коде 1С необходимо явно переопределить свойства заливки графического объекта.

Для этого используется свойство Узор объекта РисунокТабличногоДокумента. Ему необходимо присвоить значение ТипУзораТабличногоДокумента.БезУзора. Также крайне важно отключить границы рисунка, чтобы вокруг факсимиле не выводилась тонкая черная рамка.

Проанализируем пример кода, реализующий этот алгоритм:


// Предположим, что у нас уже есть сформированный ТабличныйДокумент и ОбластьМакета
Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

// Задаем координаты и размеры рисунка в миллиметрах
Рисунок.Верх = -15; // Смещение вверх для наложения на текст предыдущих строк
Рисунок.Высота = 45;
Рисунок.Ширина = 45;
Рисунок.Лево = 10;

// Отключаем отображение рамки (границ) рисунка
Рисунок.ГраницаСверху = Ложь;
Рисунок.ГраницаСлева = Ложь;
Рисунок.ГраницаСправа = Ложь;
Рисунок.ГраницаСнизу = Ложь;

// Альтернативный и более надежный способ убрать рамку
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);

// Загружаем подготовленную картинку в формате PNG
Рисунок.Картинка = Новый Картинка("C:\Signatures\Seal_Company.png");

// Задаем пропорциональный режим отображения картинки
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;

// КЛЮЧЕВОЙ МОМЕНТ: отключаем фоновый узор рисунка для обеспечения прозрачности
Рисунок.Узор = ТипУзораТабличногоДокумента.БезУзора;

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

Установка свойства Узор = ТипУзораТабличногоДокумента.БезУзора сообщает платформе 1С, что подложка рисунка не должна заполняться белым цветом по умолчанию. Благодаря этому прозрачные области PNG-файла станут действительно прозрачными в результирующем документе.

Шаг 3. Решение проблемы перекрытия текста (Z-Order)

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

Выясним причину этого поведения платформы. В 1С:Предприятии отсутствует прямой программный метод для изменения порядка наложения слоев (нет аналогов команд "На передний план" / "На задний план" для динамически созданных рисунков). Любой графический объект, добавленный через метод Рисунки.Добавить(), всегда помещается на самый верхний слой, перекрывая собой текст обычных ячеек табличного документа.

Рассмотрим три эффективных способа обойти это ограничение платформы.

Способ А. Использование предопределенного рисунка в макете (Рекомендуемый)

Вместо того чтобы создавать объект Рисунок полностью с нуля с помощью программного кода, гораздо эффективнее спроектировать его структуру заранее в Конфигураторе:

  1. Откройте макет вашей печатной формы в конфигураторе 1С.
  2. Вставьте пустой рисунок (меню Таблица -> Рисунки -> Картинка). Поместите его в ту область, где предполагается вывод факсимиле.
  3. Кликните по рисунку правой кнопкой мыши и выберите пункт Порядок -> На задний план. Это гарантирует, что текст ячеек макета всегда будет отображаться поверх линий этого рисунка.
  4. В свойствах рисунка задайте понятное имя (например, ФаксимилеПечать), укажите узор БезУзора и отключите линии границы.
  5. В программном коде откажитесь от создания нового объекта. Вместо этого просто подставляйте нужный файл картинки в уже существующий в макете объект:

// Обращаемся к уже существующему на заднем плане рисунку в макете
Если ОбластьМакета.Рисунки.Найти("ФаксимилеПечать") <> Неопределено Тогда
    ОбластьМакета.Рисунки.ФаксимилеПечать.Картинка = Новый Картинка("C:\Signatures\Seal_Company.png");
КонецЕсли;

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

Этот способ является наиболее производительным и стабильным, так как все настройки позиционирования, размеров и слоев хранятся непосредственно в метаданных макета.

Способ Б. Программный вывод текстовых надписей поверх картинки

Если печатная форма генерируется полностью динамически или по каким-то причинам предопределенный макет использовать нельзя, можно пойти от обратного. Так как каждый новый рисунок ложится поверх предыдущих, мы можем сначала программно вывести картинку печати, а затем поверх нее программно вывести текстовое поле с должностью и ФИО.

Для создания надписи поверх картинки используется тип рисунка ТипРисункаТабличногоДокумента.Текст. Посмотрим на практический пример:


// 1. Сначала выводим картинку печати в область макета
РисунокПечати = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокПечати.Верх = 5;
РисунокПечати.Лево = 5;
РисунокПечати.Ширина = 40;
РисунокПечати.Высота = 40;
РисунокПечати.Картинка = Новый Картинка("C:\Signatures\Seal_Company.png");
РисунокПечати.Узор = ТипУзораТабличногоДокумента.БезУзора;
РисунокПечати.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);

// 2. После этого поверх выводим текстовую надпись (ФИО подписанта)
РисунокТекст = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
// Координаты текстового поля должны пересекаться с картинкой печати
РисунокТекст.Верх = 15;
РисунокТекст.Лево = 10;
РисунокТекст.Ширина = 50;
РисунокТекст.Высота = 10;

// Задаем текст, шрифт и выравнивание
РисунокТекст.Текст = "Иванов И.И.";
РисунокТекст.Шрифт = Новый Шрифт("Arial", 10, Истина); // Жирный шрифт
РисунокТекст.Узор = ТипУзораТабличногоДокумента.БезУзора; // Обязательно прозрачный фон текста
РисунокТекст.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);

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

При таком подходе надпись "Иванов И.И." гарантированно окажется на переднем плане и не будет перекрыта элементами оттиска печати.

Способ В. Настройка полупрозрачности в графическом файле

Если вам критически важно, чтобы печать ложилась естественным образом поверх текста (как настоящая), но текст при этом оставался читаемым, воспользуйтесь возможностями альфа-канала PNG.

Откройте файл в графическом редакторе и установите прозрачность (opacity) слоя с печатью на уровне 70% - 80%. Линии станут слегка блеклыми. Когда 1С выведет эту картинку поверх ячеек табличного документа, черный шрифт текста под ними будет просвечивать сквозь синие линии штампа. Это создаст максимальный визуальный эффект оригинального физического документа.

Особенности экспорта документов в Excel и PDF

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

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

← На главную