Как сконвертировать изображение PNG в JPG или BMP для вывода на печать в 1С 7.7?

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

При работе в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с аппаратными и программными ограничениями этой системы. Одной из таких проблем является отсутствие штатной поддержки формата PNG при выводе графических объектов на печатные формы (в макеты табличных документов) или на формы диалогов. Платформа 1С 7.7 «из коробки» умеет работать только с форматами BMP и JPEG (JPG).

Если в вашей бизнес-логике (например, при загрузке картинок номенклатуры с сайта или из внешнего веб-сервиса) используются современные изображения в формате PNG, вам неизбежно придется предварительно конвертировать их в совместимый формат JPG или BMP. Проанализируем самые эффективные, надежные и современные способы автоматизации этого процесса непосредственно из кода 1С 7.7.

Решение 1: Использование встроенного системного компонента Windows — WIA

Рассмотрим наиболее изящный способ конвертации, который не требует скачивания и установки никаких сторонних программ, утилит или библиотек. В составе современных операционных систем Windows (начиная с Windows XP и заканчивая Windows 11) поставляется встроенная библиотека работы с изображениями WIA (Windows Image Acquisition). Она доступна через стандартные COM-объекты.

Для реализации конвертации мы будем использовать два системных класса: WIA.ImageFile (для загрузки исходного файла) и WIA.ImageProcess (для наложения фильтра конвертации в нужный формат).

Разберем по шагам готовый пример функции на языке 1С 7.7 для преобразования файла PNG в JPG:


Функция СконвертироватьPNGвJPG_WIA(ИмяФайлаИсточник, ИмяФайлаПриемник)
    
    // Пытаемся создать COM-объекты для работы с изображениями
    Попытка
        Изображение = СоздатьОбъект("WIA.ImageFile");
        Процессор = СоздатьОбъект("WIA.ImageProcess");
    Исключение
        Предупреждение("Не удалось запустить библиотеку WIA. Возможно, в системе не зарегистрирована wiaaut.dll");
        Возврат 0;
    КонецПопытки;
    
    Попытка
        // Загружаем исходный файл PNG
        Изображение.LoadFile(ИмяФайлаИсточник);
        
        // Настраиваем фильтр конвертации
        Процессор.Filters.Add(Процессор.FilterInfos("Convert").FilterID);
        
        // Указываем уникальный идентификатор формата (GUID для JPEG)
        // Для JPG: {B96B3CAE-0728-11D3-9D7B-0000F81EF32E}
        // Для BMP: {B96B3CAB-0728-11D3-9D7B-0000F81EF32E}
        Процессор.Filters(1).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
        
        // Также можно настроить качество сжатия JPEG (от 1 до 100)
        Процессор.Filters(1).Properties("Quality").Value = 85;
        
        // Применяем фильтр к картинке
        ИзображениеРезультат = Процессор.Apply(Изображение);
        
        // Если файл с таким именем уже существует, его нужно удалить перед записью
        Если ФС.СуществуетФайл(ИмяФайлаПриемник) = 1 Тогда
            ФС.УдалитьФайл(ИмяФайлаПриемник);
        КонецЕсли;
        
        // Сохраняем итоговый JPEG-файл на диск
        ИзображениеРезультат.SaveFile(ИмяФайлаПриемник);
        Возврат 1;
        
    Исключение
        Предупреждение("Ошибка в процессе конвертации файла: " + ОписаниеОшибки());
        Возврат 0;
    КонецПопытки;
    
КонецФункции

Этот метод работает незаметно для пользователя (в «тихом» фоновом режиме), выполняется очень быстро и не создает лишних консольных окон.

Решение 2: Использование PowerShell и возможностей .NET Framework

Еще один мощный бесконпонентный метод заключается в вызове интерпретатора командной строки PowerShell, который по умолчанию присутствует во всех современных версиях Windows. PowerShell имеет прямой доступ к классам платформы .NET Framework, включая графическую библиотеку System.Drawing.

Мы можем сформировать и запустить системную команду из 1С 7.7, которая выполнит загрузку PNG и его сохранение в JPG буквально в одну строку.

Рассмотрим пример реализации этого подхода:


Процедура СконвертироватьЧерезPowerShell(ПутьКФайлуPNG, ПутьКФайлуJPG)
    
    // Формируем команду PowerShell, экранируя кавычки внутри строки
    ШаблонКоманды = "powershell -NoProfile -ExecutionPolicy Bypass -Command """ +
                     "Add-Type -AssemblyName System.Drawing; " +
                     "[System.Drawing.Image]::FromFile('%1').Save('%2', [System.Drawing.Imaging.ImageFormat]::Jpeg)" +
                     """";
    
    // Подставляем реальные пути к файлам
    КомандаВыполнения = ШаблонКоманды;
    КомандаВыполнения = СтрЗаменить(КомандаВыполнения, "%1", ПутьКФайлуPNG);
    КомандаВыполнения = СтрЗаменить(КомандаВыполнения, "%2", ПутьКФайлуJPG);
    
    // Запускаем выполнение команды в операционной системе
    // Для скрытия черного окна консоли лучше использовать WshShell.Run
    Попытка
        Шелл = СоздатьОбъект("Wscript.Shell");
        // Параметр 0 скрывает окно консоли, а значение Истина заставляет 1С ждать завершения процесса
        Шелл.Run(КомандаВыполнения, 0, 1);
    Исключение
        // Если WshShell недоступен, выполняем через стандартную команду системы
        КомандаСистемы(КомандаВыполнения);
    КонецПопытки;
    
КонецПроцедуры

Важное преимущество данного метода: библиотека System.Drawing прекрасно оптимизирована под Windows и корректно обрабатывает даже сложные файлы PNG (например, с альфа-каналами прозрачности, которые при конвертации будут корректно перенесены на белый или черный фон в зависимости от настроек).

Решение 3: Использование внешней ActiveX-компоненты GFLax

Если вам требуется осуществлять глубокую профессиональную обработку графики в 1С 7.7 (изменять размеры изображений, накладывать водяные знаки, обрезать края, регулировать палитру), то отличным выбором станет специализированная графическая библиотека GFLax (компонента от создателей популярного просмотрщика картинок XnView).

Для работы этого метода вам потребуется скачать библиотеку GFLax.dll и зарегистрировать её в системе с помощью команды regsvr32 GFLax.dll.

Рассмотрим пример кода конвертации с использованием GFLax:


Функция СконвертироватьЧерезGFLax(ПутьPNG, ПутьJPG)
    
    Попытка
        gfl = СоздатьОбъект("GFLax.gflAx");
    Исключение
        Предупреждение("Компонента GFLax не зарегистрирована на этом компьютере!");
        Возврат 0;
    КонецПопытки;
    
    Попытка
        // Загружаем PNG в память компоненты
        gfl.LoadBitmap(ПутьPNG);
        
        // Устанавливаем формат сохранения (1 - это JPEG, 3 - BMP)
        gfl.SaveFormat = 1; 
        
        // Задаем качество сжатия
        gfl.SaveJPEGQuality = 90;
        
        // Записываем результат на диск
        gfl.SaveBitmap(ПутьJPG);
        Возврат 1;
    Исключение
        Предупреждение("Ошибка GFLax: " + ОписаниеОшибки());
        Возврат 0;
    КонецПопытки;
    
КонецФункции

Решение 4: Консольные утилиты командной строки (IrfanView, ImageMagick)

Если на сервере или на рабочих станциях пользователей уже установлены популярные просмотрщики или пакетные обработчики графики, такие как IrfanView или ImageMagick, их консольный интерфейс можно легко использовать для автоматической конвертации.

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

Пример интеграции с IrfanView в коде 1С 7.7:


Процедура СконвертироватьЧерезIrfanView(ПутьPNG, ПутьJPG)
    
    // Путь к исполняемому файлу IrfanView на компьютере
    ПутьКПрограмме = """C:\Program Files\IrfanView\i_view64.exe""";
    
    // Формируем параметры запуска: открыть файл PNG и тихо сохранить его как JPG
    ПараметрыЗапуска = ПутьКПрограмме + " " + """ + ПутьPNG + """ + " /convert=" + """ + ПутьJPG + """;
    
    Попытка
        Шелл = СоздатьОбъект("Wscript.Shell");
        // Запуск в скрытом режиме (0) с ожиданием окончания конвертации (Истина)
        Шелл.Run(ПараметрыЗапуска, 0, 1);
    Исключение
        КомандаСистемы(ПараметрыЗапуска);
    КонецПопытки;
    
КонецПроцедуры

Аналогичным образом настраивается работа с утилитой convert.exe из пакета ImageMagick. Достаточно вызвать команду вида: magick convert input.png output.jpg.

Рекомендации по выбору метода для 1С 7.7

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

  1. WIA (Windows Image Acquisition) — Рекомендуемый метод для большинства типовых задач. Он работает абсолютно на всех современных ОС Windows «из коробки», не требует прав администратора для установки стороннего софта и показывает отличную скорость работы.
  2. PowerShell + .NET — Превосходная альтернатива WIA. Позволяет тонко управлять качеством сжатия и другими параметрами .NET-класса System.Drawing. Не требует установки дополнительных DLL.
  3. GFLax — Идеально подходит, если помимо конвертации вам необходимо выполнять сложные манипуляции с картинками внутри сессии 1С (масштабирование под размеры ячеек макета, наложение водяных знаков и логотипов).
  4. IrfanView / ImageMagick — Стоит использовать только в том случае, если эти программные продукты уже внедрены в инфраструктуру вашего предприятия и развернуты на всех рабочих местах пользователей.

После успешной конвертации файла в формат JPG или BMP, вы сможете стандартным образом вывести его на печать в макет вашей печатной формы, используя стандартный элемент «Рисунок» табличного документа 1С 7.7.

← На главную