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