Как вывести картинку с динамическим текстом (печать) в табличный документ 1С?

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

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

Метод 1: Использование графических объектов в макете

Самый простой способ, который обсуждался на форуме, — это разделение визуальных элементов. Мы не пытаемся изменить саму картинку, а комбинируем объекты. В 1С табличный документ позволяет размещать поверх сетки ячеек специальные объекты — рисунки. Рассмотрим, как это работает:

  1. В макете через меню Таблица — Рисунки можно добавить два типа объектов: непосредственно Картинка и объект Текст.
  2. Объект Картинка выступает в роли подложки (самой синей или красной печати).
  3. Объект Текст располагается слоем выше и содержит параметры, которые будут заполняться программно.

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

Метод 2: Программное управление коллекцией Рисунки

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

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


// Создаем новый объект Рисунок для картинки
Печать = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Печать.Картинка = БиблиотекаКартинок.МояПечать; // Или загруженная из файла
Печать.ГраницаСверху = Ложь;
Печать.ГраницаСлева = Ложь;
Печать.ГраницаСправа = Ложь;
Печать.ГраницаСнизу = Ложь;

// Указываем область расположения (строка1, колонка1, строка2, колонка2)
ОбластьДляПечати = ТабДок.Область(10, 2, 15, 4);
Печать.Расположить(ОбластьДляПечати);

// Теперь добавим динамический текст
Надпись = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
Надпись.Текст = "Дата: " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Надпись.ЦветТекста = ЦветаСтиля.ЦветТекстаПечати; // Например, темно-синий
Надпись.Узор = ТипУзораТабличногоДокумента.БезУзора; // Делаем фон прозрачным
Надпись.Расположить(ОбластьДляПечати);

В этом примере мы использовали метод Расположить(), который «привязывает» графический объект к конкретным координатам ячеек. Это гарантирует, что при изменении масштаба или печати объекта он останется в нужном месте относительно данных таблицы.

Позиционирование и привязка объектов

Выясним причину, по которой рисунки иногда «съезжают» при редактировании колонок. У каждого объекта в коллекции Рисунки есть свойство, отвечающее за вариант привязки к сетке. Чтобы печать сохраняла свои пропорции и положение, мы рекомендуем устанавливать свойство ВариантПривязки в значение «Абсолютный» или «К ячейке без изменения размеров».

Также важно помнить про свойство Печать. Если вы добавили объект программно, обязательно проверьте, что установлено значение Истина, иначе объект будет виден на экране, но не выведется на принтер:


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

Метод 3: Вывод на каждую страницу при импорте из Excel

Рассмотрим подробнее сценарий, когда мы загружаем готовый документ из Excel и нам нужно проставить печати на каждой странице. Поскольку объем данных заранее неизвестен, мы не можем жестко прописать номера строк для вывода печати.

В этом случае проанализируем алгоритм с использованием метода ПроверитьВывод(). Мы будем обходить строки документа и определять, где происходит разрыв страницы:

  1. Создаем временный массив строк для проверки.
  2. Вызываем ТабДок.ПроверитьВывод(МассивСтрок).
  3. Если метод возвращает Ложь, значит, текущая порция данных начнет новую страницу.
  4. В этот момент мы вставляем объект печати в конец «предыдущей» страницы.
  5. Принудительно вставляем разделитель методом ВывестиГоризонтальныйРазделительСтраниц().

Визуальные эффекты: Вращение текста

Для придания документу большей достоверности, динамический текст внутри печати (например, ФИО менеджера) можно немного наклонить. В 1С это реализуется через свойство ОриентацияТекста у объекта рисунка типа Текст. Угол наклона задается в градусах.


ТекстПечати = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
ТекстПечати.Текст = "Иванов И.И.";
ТекстПечати.ОриентацияТекста = 15; // Поворот на 15 градусов для реалистичности

Важный нюанс: при использовании прозрачности и наложении объектов друг на друга (Z-порядок) помните, что новые добавленные рисунки всегда оказываются выше по слою, чем предыдущие. Если вы сначала добавите текст, а потом картинку без прозрачности, картинка полностью перекроет текст.

Использование фоновых картинок (Watermark)

Существует также альтернативный подход — свойство ФоноваяКартинка самого объекта ТабличныйДокумент. Этот метод позволяет задать изображение, которое будет отображаться за всеми ячейками. Однако он плохо подходит для точного позиционирования печати внизу страницы, так как фоновая картинка обычно растягивается на весь лист или замостит его. Для реализации именно «печати в месте подписи» использование коллекции Рисунки является предпочтительным и более гибким инструментом.

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

← На главную