Как подключить ImageMagick к 1С:Предприятию и обрабатывать картинки на сервере
Содержание
Чтобы установить 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
- Скачайте установщик нужной сборки с официального сайта imagemagick.org.
- Запустите его от имени администратора.
- Оставьте путь установки по умолчанию, например
C:\Program Files\ImageMagick-7.1.1-Q16-HDRI. Запишите его: этот путь понадобится в коде. - На шаге выбора компонентов отметьте Add application directory to your system path.
- Если в старом коде используется команда
convert, отметьте Install legacy utilities (e.g. convert). - Для ветки 6.x и COM-варианта отметьте пункт установки ImageMagickObject OLE Control.
- Завершите установку и откройте новое окно командной строки.
- Проверьте:
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. Ему нужны:
- Чтение и выполнение для каталога ImageMagick.
- Чтение и запись в каталог временных файлов, который возвращает
ПолучитьИмяВременногоФайла(). - Для 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 занять все ядра. - 💾 Храните уже уменьшенное. Обрабатывайте картинку один раз при загрузке, а не при каждом формировании печатной формы.