Как подключить ImageMagick к 1С:Предприятию и обрабатывать картинки на сервере

· 10 мин

Содержание

Чтобы установить ImageMagick для 1С, поставьте дистрибутив на тот компьютер, где реально выполняется серверный код: на сервер 1С в клиент-серверном варианте или на каждое рабочее место в файловом. Дальше есть два пути настройки: вызывать magick.exe через ЗапуститьПриложение() или зарегистрировать COM-объект ImageMagickObject и создавать его через Новый COMОбъект.

Командная строка проще и работает на Windows и Linux. COM удобен в старых обработках, но привязан к Windows, к разрядности и к ветке ImageMagick 6. Для новых обработок берите командную строку.

Где ставить ImageMagick и какую сборку выбрать

Первая ошибка случается ещё до скачивания: программу ставят «себе», а код выполняется на другой машине. Определите место выполнения по режиму работы базы.

Режим работы базыГде выполняется код &НаСервереКуда ставить ImageMagick
Файловая базаВ процессе клиента 1cv8.exe на компьютере пользователяНа каждое рабочее место (или на терминальный сервер)
Клиент-серверная базаВ рабочем процессе rphost на сервере 1СНа каждый рабочий сервер кластера
Веб-клиент, тонкий клиент через веб-серверНа сервере 1СТолько на сервер 1С

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

Варианты дистрибутива для Windows

На официальном сайте ImageMagick в разделе загрузок для Windows лежит несколько сборок. Они различаются тремя признаками.

  • 🔢 Разрядность: x64 или x86. Для командной строки разрядность не важна. Для COM-объекта она должна совпадать с разрядностью процесса 1С: 64-битный сервер 1С не увидит 32-битную DLL.
  • 🎨 Глубина цвета: Q8 или Q16. Q16 хранит 16 бит на канал и расходует примерно вдвое больше памяти на картинку. Для сканов, фото товаров и превью в документах хватает Q8. HDRI-сборки нужны для профессиональной фотообработки, в учётной системе они не дают выигрыша.
  • 📦 DLL или static. Сборка с DLL нужна, если планируете COM-объект или подключение библиотек. Для вызова из командной строки подойдут обе.

Для PDF и EPS ImageMagick использует Ghostscript. Если собираетесь делать превью из PDF-сканов, ставьте Ghostscript той же разрядности до ImageMagick.

Установка ImageMagick на сервер 1С: Windows и Linux

Windows

  1. Скачайте установщик нужной сборки с официального сайта imagemagick.org.
  2. Запустите его от имени администратора.
  3. Оставьте путь установки по умолчанию, например C:\Program Files\ImageMagick-7.1.1-Q16-HDRI. Запишите его: этот путь понадобится в коде.
  4. На шаге выбора компонентов отметьте Add application directory to your system path.
  5. Если в старом коде используется команда convert, отметьте Install legacy utilities (e.g. convert).
  6. Для ветки 6.x и COM-варианта отметьте пункт установки ImageMagickObject OLE Control.
  7. Завершите установку и откройте новое окно командной строки.
  8. Проверьте: magick -version. Для ветки 6 — convert -version.

После изменения PATH служба сервера 1С не видит новый путь, пока её не перезапустить. Перезапуск службы обрывает все сеансы пользователей, поэтому делайте его вне рабочего времени. Надёжнее вообще не полагаться на PATH и писать в коде полный путь к magick.exe.

В Windows есть системная утилита C:\Windows\System32\convert.exe — она конвертирует файловую систему диска из FAT в NTFS. Если вызвать convert без полного пути и PATH настроен не так, запустится она, а не ImageMagick. Поэтому в ветке 7 используйте magick, а в ветке 6 — полный путь к convert.exe ImageMagick.

Linux

На серверах 1С под Ubuntu или Debian пакет ставится из штатного репозитория:

sudo apt update
sudo apt install imagemagick ghostscript
convert -version

В репозиториях многих дистрибутивов до сих пор лежит ветка 6, где основная команда — convert, а файл политики находится в /etc/ImageMagick-6/policy.xml. Если стоит ветка 7, команда — magick, путь к политике — /etc/ImageMagick-7/policy.xml. Посмотрите номер версии в выводе -version и подставляйте нужное.

Сервер 1С на Linux работает от пользователя usr1cv8. Проверьте, что программа доступна именно ему:

sudo -u usr1cv8 convert -version

Регистрация COM-объекта ImageMagickObject и проверка доступа

COM-объект нужен только если вы поддерживаете обработку, написанную под него. Для новых задач берите командную строку. COM-вариант работает только в Windows и только с DLL нужной разрядности.

Пункт с COM-объектом есть в установщиках ветки 6.x. В актуальных сборках ветки 7 его, как правило, нет: если галочки на шаге компонентов не видно, используйте вызов через командную строку.

Как зарегистрировать DLL вручную

Если при установке галочку не поставили или COM-объект «отвалился» после переноса папки, зарегистрируйте его заново из командной строки администратора:

cd /d "C:\Program Files\ImageMagick-6.9.13-Q16"
regsvr32 ImageMagickObject.dll

Номер версии в пути замените на свой. Успешная регистрация заканчивается окном с сообщением об успехе. Для 32-битной DLL на 64-битной Windows используйте C:\Windows\SysWOW64\regsvr32.exe.

Проверка без 1С

Сначала убедитесь, что объект создаётся вообще, без участия платформы. Сохраните файл test.vbs:

Set img = CreateObject("ImageMagickObject.MagickImage.1")
res = img.Convert("C:\Temp\in.jpg", "-resize", "50%", "C:\Temp\out.jpg")
WScript.Echo "Готово"

Запустите его 64-битным интерпретатором: C:\Windows\System32\cscript.exe test.vbs. Если появился out.jpg — регистрация в порядке. Если скрипт падает, проблема в установке, а не в 1С.

Проверка из 1С

В консоли кода или в обработке выполните на сервере:

&НаСервереБезКонтекста
Процедура ПроверитьImageMagickНаСервере()
	Попытка
		Magick = Новый COMОбъект("ImageMagickObject.MagickImage.1");
		Сообщить("COM-объект создан");
	Исключение
		Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры

Тест в VBS прошёл, а в 1С ошибка «Недопустимая строка с указанием класса» — почти всегда несовпадение разрядности или запуск под другим пользователем без прав на каталог.

Код вызова ImageMagick из 1С:Предприятия

Основной сценарий: в 1С приходят двоичные данные картинки (из присоединённого файла, из обмена, с сайта), их нужно уменьшить, повернуть по EXIF и убрать метаданные. Схема одна для обоих способов: записать во временный файл → обработать → прочитать результат → удалить временные файлы .

Через командную строку (рекомендуемый способ)

// Уменьшает картинку до заданной длинной стороны, возвращает JPEG.
Функция УменьшитьИзображение(ИсходныеДанные, МаксСторона = 1600) Экспорт

	ПутьКMagick = "C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\magick.exe";

	ВходнойФайл  = ПолучитьИмяВременногоФайла("img");
	ВыходнойФайл = ПолучитьИмяВременногоФайла("jpg");
	ИсходныеДанные.Записать(ВходнойФайл);

	Размер = Формат(МаксСторона, "ЧГ=0");
	Команда = СтрШаблон("""%1"" ""%2"" -auto-orient -resize ""%3x%3>"" -strip -quality 85 ""%4""",
		ПутьКMagick, ВходнойФайл, Размер, ВыходнойФайл);

	КодВозврата = Неопределено;
	ЗапуститьПриложение(Команда, , Истина, КодВозврата);

	Результат = Неопределено;
	Файл = Новый Файл(ВыходнойФайл);
	Если КодВозврата = 0 И Файл.Существует() Тогда
		Результат = Новый ДвоичныеДанные(ВыходнойФайл);
	КонецЕсли;

	УдалитьФайлы(ВходнойФайл);
	Если Файл.Существует() Тогда
		УдалитьФайлы(ВыходнойФайл);
	КонецЕсли;

	Если Результат = Неопределено Тогда
		ВызватьИсключение СтрШаблон("ImageMagick вернул код %1", КодВозврата);
	КонецЕсли;

	Возврат Результат;

КонецФункции

Что делают ключи:

  • 📐 -resize "1600x1600>" — уменьшает, только если сторона больше 1600 пикселей. Знак > не даёт растягивать маленькие картинки.
  • 🔄 -auto-orient — поворачивает фото с телефона по EXIF, иначе в печатной форме оно ляжет набок.
  • 🧹 -strip — убирает EXIF, GPS-координаты и цветовые профили. Файл становится легче на десятки килобайт.
  • 🎚 -quality 85 — разумный баланс размера и качества JPEG.

Третий параметр ЗапуститьПриложение равен Истина: 1С ждёт завершения процесса и получает код возврата. Без ожидания вы прочитаете ещё не записанный файл.

На Linux замените путь на /usr/bin/convert (ветка 6) или /usr/bin/magick (ветка 7). Остальной код не меняется.

Через COM-объект

Если в базе уже есть обработка под COM, вызов выглядит так:

Magick = Новый COMОбъект("ImageMagickObject.MagickImage.1");
Magick.Convert(ВходнойФайл, "-auto-orient", "-resize", "800x800>", "-strip", ВыходнойФайл);

Каждый ключ и каждое значение передаются отдельным параметром. При ошибке метод вызывает исключение COM, поэтому оборачивайте вызов в Попытка.

Полезные команды для учётных задач

ЗадачаАргументы после magick
Превью первой страницы PDF-density 150 "скан.pdf[0]" -background white -flatten "превью.png"
Квадратная миниатюра 300×300"фото.jpg" -thumbnail 300x300^ -gravity center -extent 300x300 "мини.jpg"
PNG с прозрачностью в JPEG"логотип.png" -background white -flatten "логотип.jpg"
Узнать размерыidentify -format "%wx%h" "фото.jpg"
Несколько картинок в один PDF"стр1.jpg" "стр2.jpg" "итог.pdf"

Для ветки 6 вместо magick пишите convert, для размеров — отдельную утилиту identify.

Права, безопасный режим и политика ImageMagick

Код из консоли администратора работает, а у пользователей падает — значит, мешают права или настройки безопасности.

Права пользователя службы

Рабочий процесс сервера 1С запускается от пользователя службы, обычно USR1CV8. Ему нужны:

  1. Чтение и выполнение для каталога ImageMagick.
  2. Чтение и запись в каталог временных файлов, который возвращает ПолучитьИмяВременногоФайла().
  3. Для COM-варианта — права на запуск объекта. Если DLL регистрировали под администратором, а каталог потом сузили по правам, объект не создастся.

Проверить, от кого работает служба, можно в оснастке «Службы» Windows на вкладке входа в систему у службы агента сервера 1С.

Безопасный режим и профили безопасности

В безопасном режиме платформа запрещает запуск внешних приложений и создание COM-объектов. Под ограничения попадают внешние обработки, подключённые с флагом безопасного режима, и расширения, у которых включён безопасный режим.

Если в кластере включены профили безопасности, разрешение на запуск magick.exe или создание COM-объекта нужно выдать в профиле той базы. Иначе вызов завершится ошибкой о нарушении прав доступа, хотя сама программа установлена правильно.

Файл policy.xml

ImageMagick сам ограничивает, что ему можно делать. Политика хранится в policy.xml (на Windows — в каталоге установки, на Linux — в /etc/ImageMagick-6/ или /etc/ImageMagick-7/).

В пакетах многих дистрибутивов Linux чтение PDF по умолчанию запрещено строкой вида:

<policy domain="coder" rights="none" pattern="PDF" />

Отсюда ошибка not authorized при попытке сделать превью скана. Поменяйте rights="none" на rights="read|write" только для PDF и только если файлы приходят из доверенного источника.

Запрет в policy.xml появился не случайно. В 2016 году нашли уязвимость ImageTragick: специально подготовленная «картинка» выполняла команды на сервере. Не открывайте форматы MVG, MSL и URL, держите ImageMagick обновлённым и не обрабатывайте файлы из интернета без проверки расширения и размера.

В том же файле задаются лимиты ресурсов. Для сервера 1С, где рядом работают rphost, разумно ограничить память, например <policy domain="resource" name="memory" value="512MiB"/>. Ограничение можно задать и разово ключом -limit memory 512MiB в команде.

Альтернативы ImageMagick и ускорение обработки

ImageMagick универсален, но не единственный вариант. Выбор зависит от объёма и инфраструктуры.

СпособКогда подходитМинусы
ImageMagick, командная строкаЛюбая ОС, разовые и пакетные операцииНужна установка на каждый рабочий сервер
ImageMagick, COMГотовые обработки под WindowsВетка 6, разрядность, регистрация DLL
GraphicsMagick (gm convert)Большие пакеты, нужна скорость и стабильностьМеньше форматов и ключей
libvips (vipsthumbnail)Тысячи фото каталога, мало памятиДругой синтаксис, реже встречается в готовых примерах
Внешний скрипт (Python, PowerShell)Сложная логика: водяные знаки, распознаваниеЕщё одна среда для поддержки
Внешняя компонента 1СРабота в веб-клиенте и на клиенте без установки программНужна компонента под все платформы

Как ускорить обработку

  • ⚡ Не гоняйте по одной картинке. Для пакета используйте magick mogrify -path "C:\Out" -resize "1600x1600>" -strip *.jpg: один запуск процесса вместо тысячи.
  • 🧮 Сократите декодирование JPEG. Ключ -define jpeg:size=3200x3200 перед именем входного файла заставляет читать большой JPEG сразу в уменьшенном виде. Для превью это заметно быстрее.
  • 🗂 Выносите тяжёлое в фоновое задание. Обработка сотни фото в интерактивном вызове держит пользователя. Регламентное или фоновое задание делает то же без ожидания на форме.
  • 🧵 Ограничьте потоки. На сервере с десятками сеансов ключ -limit thread 2 не даст ImageMagick занять все ядра.
  • 💾 Храните уже уменьшенное. Обрабатывайте картинку один раз при загрузке, а не при каждом формировании печатной формы.

Ошибки при подключении ImageMagick к 1С

Диагностика: выберите симптом

Частые вопросы

Нужна ли лицензия на ImageMagick для коммерческой базы 1С?
Нет. ImageMagick распространяется под собственной свободной лицензией Apache-типа, её можно использовать в коммерческих системах без оплаты.
Можно ли обойтись без установки чего-либо на сервер?
Да, если хватает встроенных возможностей платформы или есть внешняя компонента для обработки картинок. Но для конвертации PDF, поворота по EXIF и пакетного сжатия внешняя программа обычно проще.
Почему превью из PDF получается с чёрным фоном?
У страницы прозрачный фон. Добавьте перед именем выходного файла ключи -background white -flatten.
Будет ли код работать в веб-клиенте?
Да, если вызов идёт в серверной процедуре. В клиентском коде веб-клиента запустить внешнюю программу или COM-объект нельзя.
Как обновить ImageMagick, не сломав обработки?
Поставьте новую версию, поправьте путь в коде или константе и только потом удалите старую. Путь удобно хранить в константе, а не в тексте модуля.