Как правильно изменить размер изображения с помощью ImageMagick из 1С и исправить ошибку загрузки библиотек?

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

При интеграции 1С с внешними утилитами для обработки графики разработчики часто выбирают популярный пакет ImageMagick. Однако при попытке вызвать команду изменения размера файлов (resize) через встроенные методы платформы можно столкнуться с неприятной ситуацией: из стандартной командной строки Windows или bat-файла утилита отрабатывает штатно, а при запуске из кода 1С возвращает ошибку загрузки модулей (например, unable to load module IM_MOD_RL_JPEG.dll - не найден указанный модуль) либо завершается без какого-либо видимого результата.

В этой статье мы подробно разберем, почему возникает данная ошибка, как операционная система взаимодействует с процессами 1С и какими способами можно стабильно выполнять сжатие и изменение масштаба изображений.

Выясним причину: почему возникает ошибка «не найден указанный модуль»?

Когда вы видите сообщение вида unable to load module IM_MOD_RL_JPEG.dll, физически файл библиотеки может находиться в папке с программой. Ошибка Windows 126 (ERROR_MOD_NOT_FOUND) означает не только отсутствие самого целевого файла, но и невозможность загрузчика Windows найти зависимости, от которых зависит данный модуль.

Кодеры форматов ImageMagick (в частности, кодер JPEG) динамически связаны с основными библиотеками ядра (CORE_RL_*.dll) и системными библиотеками Microsoft Visual C++ Redistributable. Поиск этих библиотек операционная система выполняет по строго определенному алгоритму: сначала в каталоге исполняемого файла, затем в текущем рабочем каталоге процесса, а далее — в каталогах, перечисленных в системной переменной PATH.

Здесь кроются две ключевые проблемы взаимодействия с платформой 1С:

  1. Кэширование переменных окружения: каждый запущенный процесс Windows (включая толстый/тонкий клиент 1cv8.exe или службу сервера ragent.exe) получает снимок системных и пользовательских переменных среды на момент своего старта. Если вы установили ImageMagick или прописали пути в системный PATH, когда сеанс 1С уже был открыт, процесс 1С ничего не знает о новых путях. В то же время вновь открытая консоль CMD сразу получает актуальный PATH, из-за чего в консоли команда работает, а в 1С — падает.
  2. Неопределенный рабочий каталог: при вызове команд через КомандаСистемы() рабочий каталог дочернего процесса часто указывает на каталог платформы (например, bin) или временные папки, где зависимых DLL ImageMagick попросту нет.
  3. Ограничения контекста выполнения: метод КомандаСистемы() доступен исключительно на стороне клиента. Если код выполняется на сервере, в фоновом задании или в общем модуле без клиентского контекста, данный метод вызовет исключение. На сервере требуется использовать метод ЗапуститьПриложение().

Способ 1. Перезапуск процесса и явное указание рабочего каталога

Самое быстрое действие при возникновении ошибки загрузки DLL сразу после установки сторонней утилиты — полный перезапуск сеанса 1С (или перезапуск службы сервера 1С:Предприятия, если код выполняется на сервере). Это обновит снимок переменных окружения процесса.

Однако полагаться только на системный PATH ненадежно. Чтобы гарантировать корректный поиск библиотек ImageMagick вне зависимости от настроек окружения конкретного пользователя, следует использовать метод ЗапуститьПриложение() с явной передачей рабочего каталога утилиты в качестве второго параметра:


КомандаЗапуска = "C:\ImageMagick\magick.exe mogrify -resize 50% ""E:\tmp\tmpfile.jpg""";
РабочийКаталог = "C:\ImageMagick";
КодВозврата = 0;

ЗапуститьПриложение(КомандаЗапуска, РабочийКаталог, Истина, КодВозврата);

Если КодВозврата <> 0 Тогда
    ВызватьИсключение "Ошибка выполнения команды ImageMagick. Код возврата: " + Строка(КодВозврата);
КонецЕсли;

Разберем параметры этого вызова подробнее:

  1. КомандаЗапуска: в современных версиях ImageMagick 7.x основной исполняемый файл — это magick.exe, а утилиты mogrify или convert передаются как первый аргумент. Пути к обрабатываемым файлам обязательно оборачиваем в двойные кавычки для защиты от пробелов в именах папок.
  2. РабочийКаталог: указав папку C:\ImageMagick, мы гарантируем, что загрузчик Windows будет искать все модули ядра прямо рядом с исполняемым файлом.
  3. ОжидатьЗавершения (Истина): платформа приостанавливает выполнение кода 1С до полного завершения операции сжатия, что позволяет сразу же продолжить работу с уже измененным файлом.
  4. КодВозврата: переменная для получения кода завершения процесса (значение 0 свидетельствует об успешном выполнении).

Способ 2. Использование статической (Static/Portable) сборки

Чтобы навсегда исключить проблемы с отсутствующими динамическими библиотеками IM_MOD_RL_*.dll, рекомендуется использовать портативную статическую версию ImageMagick (в названии дистрибутива присутствует слово portable или static).

В статических сборках все алгоритмы декодирования графических форматов (JPEG, PNG, WEBP, TIFF) вкомпилированы непосредственно внутрь одного монолитного исполняемого файла magick.exe. Такой файл не требует установки в систему, не зависит от наличия внешних DLL в папке и может быть просто скопирован в рабочий каталог базы данных или во временную папку на сервере.

Способ 3. Вызов через COM-объект ImageMagickObject

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


Попытка
    ОболочкаIM = Новый COMОбъект("ImageMagickObject.MagickImage.1");
    // Преобразование с сохранением пропорций
    ОболочкаIM.Convert("E:\tmp\tmpfile.jpg", "-resize", "50%", "E:\tmp\tmpfile.jpg");
Исключение
    ЗаписьЖурналаРегистрации("МасштабированиеИзображения", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    ВызватьИсключение "Не удалось инициализировать объект ImageMagick: " + ОписаниеОшибки();
КонецПопытки;

Важное ограничение: разрядность зарегистрированного в Windows COM-сервера должна строго совпадать с разрядностью исполняемого процесса 1С. Если вы используете 64-разрядный клиент или сервер 1С, COM-объект также обязан быть 64-битным.

Способ 4. Изменение размера стандартными средствами Windows (без стороннего ПО)

Если установка ImageMagick на рабочие места пользователей или сервер затруднена политиками безопасности, можно воспользоваться встроенным в Windows компонентом Windows Image Acquisition (WIA). Он доступен «из коробки» на любой современной клиентской и серверной ОС Windows:


ФайлКартинки = Новый COMОбъект("WIA.ImageFile");
ФайлКартинки.LoadFile("E:\tmp\tmpfile.jpg");

Процессор = Новый COMОбъект("WIA.ImageProcess");
ФильтрМасштабирования = Процессор.FilterInfos("Scale").FilterID;
Процессор.Filters.Add(ФильтрМасштабирования);

// Задаем максимальные границы и сохраняем пропорции
Процессор.Filters.Item(1).Properties.Item("MaximumWidth").Value = 800;
Процессор.Filters.Item(1).Properties.Item("MaximumHeight").Value = 600;
Процессор.Filters.Item(1).Properties.Item("PreserveAspectRatio").Value = Истина;

ФайлКартинки = Процессор.Apply(ФайлКартинки);

// Перезаписываем исходный файл
УдалитьФайлы("E:\tmp\tmpfile.jpg");
ФайлКартинки.SaveFile("E:\tmp\tmpfile.jpg");

Этот подход избавляет от необходимости распространять сторонние утилиты и bat-скрипты, полностью решая задачу масштабирования средствами штатных механизмов операционной системы.

← На главную