Почему перестал работать ImageMagick через COM-объект на новых платформах 1С (8.3.14+) и как это исправить?

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

Рассмотрим ситуацию, с которой часто сталкиваются разработчики при обновлении платформы 1С. В более старых версиях (например, 8.3.13) внешние обработки для работы с изображениями успешно использовали COM++ библиотеку ImageMagickObject.MagickImage.1. Однако при переходе на версии 8.3.14, 8.3.16 или 8.3.18 старый код внезапно перестает работать. При попытке вызова метода Convert система выдает целый каскад ошибок:

convert: 435: UnableToOpenBlob 'xc:white': No such file or directory @ error/blob.c/OpenBlob/3537

convert: 410: ImageSequenceRequired `-composite' @ error/mogrify.c/MogrifyImageList/8098

Давайте подробно разберем, почему возникает эта проблема и как правильно модифицировать код, чтобы восстановить функциональность обработки изображений.

Выясним причину конфликта библиотек

Начиная с версии 8.3.14, фирма «1С» серьезно переработала внутренние механизмы платформы и внедрила собственные средства для работы с графикой. Из-за этого при инициализации COM-объекта ImageMagickObject.MagickImage.1 внутри адресного пространства 1С возникает жесткий конфликт библиотек (DLL) и переменных окружения.

Проанализируем суть ошибок. Когда мы передаем параметр xc:white, ImageMagick должен сгенерировать пустой белый холст, обратившись к своему внутреннему кодеру. Но из-за перехвата путей платформой 1С библиотека теряет связь со своими конфигурационными файлами (такими как delegates.xml) и пытается найти на диске реальный файл с именем xc:white. Естественно, она его не находит и падает с ошибкой UnableToOpenBlob. Вслед за этим ломается команда -composite, так как для наложения требуется как минимум два слоя, а холст создан не был (ошибка ImageSequenceRequired).

Переход на изолированный запуск через командную строку

Поскольку исправить конфликт внутри адресного пространства 1С не представляется возможным, рассмотрим самое надежное решение — изоляцию процесса. Вместо использования COM-объекта мы будем вызывать исполняемые файлы ImageMagick (magick.exe или convert.exe) напрямую через командную строку Windows.

Для этого в 1С можно использовать объект WScript.Shell или встроенный метод ЗапуститьПриложение. Этот подход создает в операционной системе абсолютно независимый процесс, на который внутренние библиотеки 1С никак не влияют.

Посмотрим на пример старого неработающего кода:


ОбработчикИзображений.Convert(ФайлИзображения, "-quality", КачествоКартинки, "-resize", РазмерСПолями, "-size", РазмерСПолями, "xc:white", "+swap", "-gravity", "center", "-composite", ФайлИзображения);

Перепишем его на использование WScript.Shell:


Попытка
    WshShell = Новый COMОбъект("WScript.Shell");
Исключение
    Предупреждение("Невозможно подключить модуль выполнения скриптов WScript.Shell");
    Возврат;
КонецПопытки;

// Формируем команду с учетом необходимых параметров
СтрокаКоманды = "magick """ + ИмяФайла + """ -resize " + РазмерСПолями + " -size " + РазмерСПолями + " -quality " + КачествоКартинки + " xc:white +swap -gravity center -composite """ + ИмяФайла + """";

// Выполняем команду. Параметр 0 скрывает окно консоли, 1 - ожидаем завершения.
WshShell.Run(СтрокаКоманды, 0, Истина);

Если вы хотите избежать использования COM-объекта WScript.Shell, то аналогичного результата можно добиться с помощью метода 1С ЗапуститьПриложение. Главное — правильно сформировать строку запуска.

Важные нюансы при работе через консоль

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

  1. Экранирование путей: Обязательно заключайте пути к файлам в двойные кавычки (в коде 1С это пишется как """" + ИмяФайла + """"). Если путь содержит пробелы (например, папка Program Files), без кавычек утилита воспримет часть пути как отдельную команду и завершится с ошибкой.
  2. Проблема кириллицы: Консольные утилиты ImageMagick плохо переносят русскоязычные символы в путях. Настоятельно рекомендуем перед обработкой копировать картинку во временный каталог, используя только латиницу в имени файла и папки (например, D:\TempImagick\), а после завершения операции перемещать готовый файл обратно.
  3. Права на временные файлы: При выполнении операций объединения или наложения слоев (команда -composite) ImageMagick активно использует временные файлы. Убедитесь, что у пользователя, под которым запускается сервер 1С (обычно это USR1CV8), есть полные права на запись в системную папку %TEMP%.
  4. Политики безопасности: В новых версиях ImageMagick по умолчанию могут быть запрещены некоторые операции из-за соображений безопасности. Если утилита отказывается работать с определенными форматами (например, PDF), найдите файл policy.xml в папке установки ImageMagick и настройте соответствующие права (например, измените rights="none" на rights="read|write").
  5. Пакетная обработка: Если вам нужно изменить размер всех фотографий в определенной папке, рассмотрите использование утилиты mogrify.exe вместо convert.exe. Она специально разработана для перезаписи изображений и в пакетном режиме работает быстрее и стабильнее.

Подводя итог, можно сказать, что отказ от COM-библиотеки в пользу вызовов командной строки является единственным правильным решением при интеграции ImageMagick с современными версиями платформы 1С. Это избавляет от конфликтов в оперативной памяти и обеспечивает предсказуемую работу графического конвертера.

← На главную