В процессе интеграции 1С с интернет-магазинами или мобильными приложениями часто возникает задача оптимизации графического контента. Профессиональные фотографии товаров, загружаемые в базу, могут весить десятки мегабайт, что недопустимо для быстрой загрузки страниц сайта. В этой статье мы подробно разберем, как уменьшить разрешение и вес картинки непосредственно в коде 1С, рассмотрим современные встроенные средства платформы и альтернативные методы для более ранних версий. Для автоматического сбора файлов из внешних источников подойдёт обработка для загрузки изображений товаров с сайтов.
Начиная с версии платформы 8.3.14, разработчикам стал доступен мощный инструмент — объект ОбрабатываемаяКартинка. Это наиболее «чистый» и производительный способ решения задачи, так как он не требует регистрации внешних библиотек или установки стороннего ПО на сервер.
Проанализируем ситуацию: нам нужно взять исходное изображение, пропорционально уменьшить его и сохранить в новом формате с заданным качеством. Рассмотрим пример кода:
// Получаем двоичные данные исходного файла
КартинкаИсточник = Новый Картинка("C:\Temp\OriginalPhoto.jpg");
// Создаем объект для обработки
ОбрабатываемаяКартинка = Новый ОбрабатываемаяКартинка(КартинкаИсточник);
// Определяем новые размеры. Например, ограничим ширину 800 пикселями
НоваяШирина = 800;
Коэффициент = НоваяШирина / ОбрабатываемаяКартинка.Ширина();
НоваяВысота = ОбрабатываемаяКартинка.Высота() * Коэффициент;
// Выполняем масштабирование
ОбрабатываемаяКартинка.УстановитьРазмер(НоваяШирина, НоваяВысота);
// Сохраняем результат с оптимизацией
// Можно выбрать формат и степень сжатия (для JPEG)
ДанныеРезультата = ОбрабатываемаяКартинка.ПолучитьКартинку();
ДанныеРезультата.Записать("C:\Temp\ResizedPhoto.jpg");
Важный нюанс: при использовании метода УстановитьМаксимальныйРазмер платформа сама рассчитает пропорции, если задать только одно измерение. Это избавляет нас от лишних математических вычислений в коде.
Если ваша информационная база работает на старых версиях платформы или на ОС Windows, где встроенные методы недоступны, можно воспользоваться стандартной библиотекой операционной системы. Этот метод основан на работе с COM-объектами.
Выясним, как работает библиотека WIA. Она предоставляет фильтры для обработки изображений, один из которых называется Scale. Разберем по шагам реализацию этого метода:
// Создаем основные COM-объекты
ImageFile = Новый COMОбъект("WIA.ImageFile");
ImageProcess = Новый COMОбъект("WIA.ImageProcess");
// Загружаем исходный файл
ImageFile.LoadFile("C:\Photos\Input.jpg");
// Настраиваем фильтр масштабирования
ImageProcess.Filters.Add(ImageProcess.FilterInfos("Scale").FilterID);
// Задаем параметры фильтра (индекс 1, так как мы добавили только один фильтр)
ImageProcess.Filters.Item(1).Properties.Item("MaximumWidth").Value = 600;
ImageProcess.Filters.Item(1).Properties.Item("MaximumHeight").Value = 600;
// Сохранять пропорции (True по умолчанию в большинстве реализаций WIA)
ImageProcess.Filters.Item(1).Properties.Item("PreserveAspectRatio").Value = Истина;
// Применяем фильтр и получаем новый объект изображения
ResultImage = ImageProcess.Apply(ImageFile);
// Сохраняем результат на диск
ResultImage.SaveFile("C:\Photos\Output.jpg");
Важное предупреждение: библиотека WIA может выдавать ошибки (например, ARGBData), если изображение имеет специфический формат (CMYK, наличие альфа-канала прозрачности) или если файл поврежден. Также помните, что при работе на стороне сервера 1С (64-бит) необходимо убедиться, что соответствующая библиотека зарегистрирована в системе.
Иногда требуется не просто уменьшить размер, но и выполнить сложную предобработку: наложить водяной знак (Watermark), изменить цветовой профиль или перевести фото в современный формат WebP для сайта. В таких случаях лучше всего подходят консольные утилиты.
Рассмотрим использование ImageMagick через объект WScript.Shell. Это мощнейший инструмент, который «переваривает» практически любые форматы изображений.
КомандаЗапуска = "convert.exe ""C:\In.jpg"" -resize 800x600 -quality 75 ""C:\Out.jpg""";
WshShell = Новый COMОбъект("WScript.Shell");
// Запускаем и ждем завершения (параметр -1)
Результат = WshShell.Run(КомандаЗапуска, 0, Истина);
Если Результат <> 0 Тогда
Сообщить("Ошибка при обработке изображения!");
КонецЕсли;
При использовании внешних утилит важно учитывать следующие моменты:
Run, иначе 1С попытается отправить файл на FTP до того, как внешняя программа закончит его сжимать.Просто уменьшить пиксели — это лишь половина дела. Чтобы картинка была действительно «легкой» и качественной, проанализируем дополнительные параметры:
1. Удаление метаданных (EXIF): Профессиональные камеры записывают в файл много технической информации (модель камеры, GPS, настройки света). В некоторых случаях эти данные могут занимать до 10-15% веса файла. Объект ОбрабатываемаяКартинка при сохранении позволяет минимизировать лишний мусор.
2. Разрешение (DPI): Для мониторов достаточно 72 DPI. Если исходное фото подготовлено для печати (300 DPI), его физический вес будет выше. При ресайзе в 1С платформа автоматически приводит картинку к стандартному экранному разрешению.
3. Формат WebP: Если ваш сайт поддерживает этот формат, рассмотрите возможность конвертации. К сожалению, встроенный объект 1С (до последних версий) не всегда корректно работает с WebP на запись, поэтому здесь лучше использовать вызов magick.exe или специализированные библиотеки на стороне PHP сервера (библиотека GD), как предлагалось в обсуждении.
4. Обработка ошибок: Всегда проверяйте существование файла после обработки. Если библиотека WIA или внешняя утилита столкнется с файлом в формате CMYK, она может создать пустой файл или выдать ошибку. Мы рекомендуем использовать конструкцию Попытка...Исключение вокруг кода обработки графики.
Посмотрим на сравнение методов, чтобы выбрать оптимальный для вашего проекта:
Разберем типичный сценарий: менеджер загружает фото весом 10 Мб в карточку товара. Наша задача — при записи элемента создать два кэша (превью 100x100 и основное фото 800x800). Мы рекомендуем выполнять эту операцию в фоновом задании, чтобы пользователь не ждал окончания процесса сжатия, а мог продолжать работу с документом. Это значительно повысит комфортность работы в системе.
Используя приведенные примеры кода и рекомендации, вы сможете эффективно управлять графическими данными в 1С, обеспечивая высокую скорость работы ваших веб-ресурсов и экономию дискового пространства на сервере.