Как программно наложить печать на сертификат в 1С: пакетная обработка изображений

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

В процессе автоматизации документооборота часто возникает задача "заверения" электронных документов. Например, когда у нас есть сотни или тысячи файлов сертификатов в формате JPG, на которые необходимо наложить изображение печати. Делать это вручную в графических редакторах невозможно из-за трудоемкости. В рамках данной статьи мы разберем, как реализовать пакетное наложение картинок средствами 1С, используя как возможности самой платформы, так и мощные внешние инструменты.

Способ 1. Использование внешней утилиты ImageMagick (Composite)

Проанализируем наиболее эффективный способ для массовой обработки файлов, который был предложен в ходе обсуждения. Он заключается в использовании консольной утилиты composite.exe, входящей в состав бесплатного пакета ImageMagick. Этот метод хорош тем, что он крайне производителен и позволяет работать с файлами напрямую, минуя сложные манипуляции с объектами 1С.

Рассмотрим по шагам, как настроить этот процесс:

  1. Установите пакет ImageMagick на сервер или компьютер, где будет выполняться обработка.
  2. Подготовьте файл печати. Важно использовать формат PNG или GIF с прозрачным фоном, чтобы печать не перекрывала текст сертификата белым прямоугольником.
  3. Напишите код вызова утилиты из 1С.

Посмотрим на пример кода, который автоматизирует этот процесс:


// Путь к исполняемому файлу ImageMagick
ИмяПрограммы = "C:\Program Files\ImageMagick-7.1.0-Q16\composite.exe";

// Определяем, в какой угол документа наложить печать
// Варианты: NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
РасположениеШтампа = "SouthEast"; 

// Пути к файлам (рекомендуется использовать кавычки для путей с пробелами)
ФайлШтампа = """C:\Work\Stamp.png""";
ИсходныйФайл = """C:\Work\Certificates\Cert_001.jpg""";
РезультатФайл = """C:\Work\Ready\Cert_001_Signed.jpg""";

// Формируем строку запуска для командной системы
// Параметр -gravity определяет позиционирование
КомандаЗапуска = ИмяПрограммы + " -gravity " + РасположениеШтампа + " " + ФайлШтампа + " " + ИсходныйФайл + " " + РезультатФайл;

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

Разберем ситуацию подробнее: использование КомандаСистемы позволяет 1С делегировать тяжелую работу специализированному софту. Это особенно актуально, если сертификатов много. Обратите внимание на параметр -gravity — он позволяет не высчитывать координаты в пикселях, а просто указать, например, "правый нижний угол" (SouthEast).

Способ 2. Использование Табличного документа 1С

Выясним, можно ли решить задачу исключительно встроенными средствами 1С, не прибегая к стороннему ПО. Этот метод часто используется в типовых конфигурациях (например, "Бухгалтерия предприятия 3.0" или "ERP") для формирования счетов с печатью и подписью.

Логика работы здесь следующая: мы создаем объект ТабличныйДокумент, помещаем в него основной рисунок (сертификат), а поверх него — рисунок печати. Благодаря поддержке прозрачности в объекте РисунокТабличногоДокумента, мы получим нужный эффект.

Рассмотрим алгоритм реализации:

  1. Создаем новый ТабличныйДокумент.
  2. Добавляем в него первый рисунок (фон-сертификат).
  3. Добавляем второй рисунок (печать) и устанавливаем его положение поверх фона.
  4. Для печати обязательно указываем свойство Узор = ТипУзораТабличногоДокумента.БезУзора (чтобы обеспечить прозрачность, если файл это поддерживает).
  5. Сохраняем результат.

Однако здесь есть важный технический нюанс: метод Записать() у табличного документа отлично работает с форматами PDF или MXL, но напрямую сохранить область в качественный JPG бывает затруднительно. Часто для этого используют промежуточное сохранение в PDF с последующей конвертацией или используют сторонние компоненты.

Способ 3. Использование системных библиотек Windows (WIA и GDI+)

Если вы не хотите устанавливать ImageMagick, но вам нужна программная обработка "на лету", проанализируем возможность использования COM-объектов Windows. Библиотека WIA (Windows Image Acquisition) доступна практически на любой системе Windows.

С помощью фильтра "Stamp" в WIA можно наложить одну картинку на другую. Посмотрим на примерную логику работы с этим объектом:


// Создаем основные объекты WIA
ImageFab = Новый COMОбъект("WIA.ImageFile");
ImageStamp = Новый COMОбъект("WIA.ImageFile");
Process = Новый COMОбъект("WIA.ImageProcess");

// Загружаем исходники
ImageFab.LoadFile("C:\Cert.jpg");
ImageStamp.LoadFile("C:\Stamp.png");

// Настраиваем фильтр наложения (Stamp)
Process.Filters.Add(Process.FilterInfos("Stamp").FilterID);
Process.Filters(1).Properties("ImageFile").Value = ImageStamp;
Process.Filters(1).Properties("Left").Value = 500; // Координата X
Process.Filters(1).Properties("Top").Value = 800;  // Координата Y

// Применяем фильтр и сохраняем
NewImage = Process.Apply(ImageFab);
NewImage.SaveFile("C:\Result.jpg");

Этот метод работает быстрее, чем манипуляции с макетами 1С, и не требует визуального отображения форм. Основная сложность здесь — точный расчет координат Left и Top, так как они зависят от разрешения (DPI) исходного изображения.

Важные нюансы работы с графикой

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

1. Форматы файлов и прозрачность. Несмотря на то, что в старых системах часто использовался GIF, мы рекомендуем использовать PNG-24 с полноценным альфа-каналом. GIF поддерживает только бинарную прозрачность (пиксель либо прозрачный, либо нет), из-за чего края у круглой печати будут выглядеть "рваными" или "зубчатыми". PNG позволяет сделать плавные полупрозрачные переходы, что выглядит гораздо реалистичнее.

2. Разрешение (DPI) и масштабирование. Выясним причину, по которой печать на разных файлах может выглядеть по-разному. Если один сертификат отсканирован с разрешением 150 DPI, а другой — 300 DPI, то картинка печати фиксированного размера (например, 200x200 пикселей) на первом документе будет в два раза больше, чем на втором. Перед наложением рекомендуется программно приводить все сертификаты к единому DPI или вычислять координаты и размер печати в процентах от ширины листа.

3. Порядок наложения (Z-order). В случае использования табличного документа 1С, крайне важно следить за тем, какой рисунок был добавлен последним. Последний добавленный рисунок оказывается "выше" по слоям. Если вы сначала добавите печать, а потом сертификат, печать окажется под ним и не будет видна.

4. Права доступа. При работе на сервере 1С (особенно в клиент-серверном варианте) убедитесь, что у пользователя, под которым запущен экземпляр сервера 1С, есть права на чтение/запись в каталоги с картинками и права на запуск внешних программ (если используете composite.exe).

Как реализовать пакетную обработку?

Для обработки "кучи файлов", как просил автор темы, лучше всего использовать цикл по массиву файлов. Мы можем получить список файлов в каталоге с помощью функции НайтиФайлы() и в цикле вызывать процедуру наложения.

Пример структуры цикла:


СписокФайлов = НайтиФайлы("C:\InCert\", "*.jpg");
Для Каждого Файл Из СписокФайлов Цикл
    // Вызываем выбранный метод наложения
    ОбработатьОдинСертификат(Файл.ПолноеИмя, ПутьКПечати);
    Сообщить("Обработан файл: " + Файл.Имя);
КонецЦикла;

В завершение отметим, что для высоконагруженных систем или облачных решений (где доступ к файловой системе ограничен) можно рассмотреть вариант выноса этой задачи на отдельный микросервис. 1С будет передавать двоичные данные картинок по HTTP-протоколу, а сервис (например, на языке Python с библиотекой Pillow) будет возвращать уже готовый "подписанный" файл.

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

← На главную