В процессе автоматизации документооборота часто возникает задача "заверения" электронных документов. Например, когда у нас есть сотни или тысячи файлов сертификатов в формате JPG, на которые необходимо наложить изображение печати. Делать это вручную в графических редакторах невозможно из-за трудоемкости. В рамках данной статьи мы разберем, как реализовать пакетное наложение картинок средствами 1С, используя как возможности самой платформы, так и мощные внешние инструменты.
Проанализируем наиболее эффективный способ для массовой обработки файлов, который был предложен в ходе обсуждения. Он заключается в использовании консольной утилиты composite.exe, входящей в состав бесплатного пакета ImageMagick. Этот метод хорош тем, что он крайне производителен и позволяет работать с файлами напрямую, минуя сложные манипуляции с объектами 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).
Выясним, можно ли решить задачу исключительно встроенными средствами 1С, не прибегая к стороннему ПО. Этот метод часто используется в типовых конфигурациях (например, "Бухгалтерия предприятия 3.0" или "ERP") для формирования счетов с печатью и подписью.
Логика работы здесь следующая: мы создаем объект ТабличныйДокумент, помещаем в него основной рисунок (сертификат), а поверх него — рисунок печати. Благодаря поддержке прозрачности в объекте РисунокТабличногоДокумента, мы получим нужный эффект.
Рассмотрим алгоритм реализации:
ТабличныйДокумент.Узор = ТипУзораТабличногоДокумента.БезУзора (чтобы обеспечить прозрачность, если файл это поддерживает).Однако здесь есть важный технический нюанс: метод Записать() у табличного документа отлично работает с форматами PDF или MXL, но напрямую сохранить область в качественный JPG бывает затруднительно. Часто для этого используют промежуточное сохранение в PDF с последующей конвертацией или используют сторонние компоненты.
Если вы не хотите устанавливать 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. Каждый из них имеет свои преимущества в зависимости от требований к качеству и производительности.