При разработке функционала для работы с изображениями в справочнике Номенклатура, особенно для последующей печати в «Коммерческих предложениях», разработчик сталкивается с рядом архитектурных вызовов. Необходимо сбалансировать качество картинки, скорость работы интерфейса и объем дискового пространства, занимаемого информационной базой. Проанализируем основные аспекты реализации этой задачи.
Рассмотрим наиболее популярные форматы и определим их применимость в среде 1С:
Выясним причину, по которой прямое хранение бинарных данных в информационной базе (ИБ) может стать проблемой. При хранении картинок непосредственно в базе (тип ХранилищеЗначения), размер файла 1CD или объем SQL-таблицы растет экспоненциально. Это приводит к замедлению создания резервных копий и выполнения регламентных операций (ТИИ).
Разберем по шагам правильный подход с использованием Библиотеки стандартных подсистем (БСП):
В типовых конфигурациях, таких как «Бухгалтерия предприятия 3.0» (БП 3.0), уже встроена подсистема «Присоединенные файлы». Проанализируем её преимущества:
Посмотрим на ситуацию глазами пользователя: он может попытаться загрузить снимок с профессиональной камеры весом 20 Мб. Для печатной формы КП нам достаточно изображения размером 800х600 пикселей. Проанализируем способы программного сжатия.
Раньше для этих целей часто использовали COM-объекты (например, ImageMagick или стандартные средства Windows). Однако современная платформа 1С предоставляет нативный объект Картинка, который работает быстрее и стабильнее, в том числе на Linux-серверах.
Разберем пример кода, который преобразует тяжелое изображение в оптимизированный JPG перед сохранением:
// Предположим, ДанныеФайла - это ДвоичныеДанные полученные от пользователя
КартинкаОригинал = Новый Картинка(ДанныеФайла);
// Проверяем, нужно ли сжимать (например, если ширина больше 1000 пикселей)
Если КартинкаОригинал.Ширина() > 1000 Тогда
// Используем метод Преобразовать для изменения формата и сжатия
// Параметры: ФорматКартинки.JPEG, Качество (от 1 до 100)
НоваяКартинка = КартинкаОригинал.Преобразовать(ФорматКартинки.JPEG);
// Если нужно программно изменить именно разрешение (размер в пикселях),
// в платформе 8.3.10+ есть возможность обработки через метод Преобразовать
// с указанием параметров трансформации.
КонецЕсли;
Важно помнить: при формировании коммерческого предложения в формате PDF, если в него вставлено 20 фотографий по 5 Мб каждая, итоговый файл будет весить более 100 Мб. Такой документ клиент не сможет получить по электронной почте. Поэтому принудительный ресайз при загрузке — это не просто рекомендация, а необходимость.
Проанализируем ситуацию, когда бухгалтер открывает список номенклатуры, где в каждой строке должна отображаться картинка. Если система будет каждый раз подгружать полноразмерный файл (даже оптимизированный до 200-300 Кб), прокрутка списка будет «тормозить».
Рекомендуем использовать стратегию двух копий:
ХранилищеЗначения прямо в базе для быстрого отображения в списках и формах подбора.Как отмечалось в обсуждении, пользователь — существо непредсказуемое. Рассмотрим шаги по ограничению их «творчества»:
Преобразовать), из файла автоматически удаляются лишние метаданные (EXIF: модель камеры, координаты GPS, дата съемки), что экономит еще до 50 Кб на каждом файле.Подводя итог, прикручивая фото к номенклатуре в БП 3.0, придерживайтесь следующего алгоритма: используйте подсистему «Присоединенные файлы» из БСП для хранения файлов вне базы, принудительно конвертируйте изображения в JPG с умеренным качеством и ограничивайте максимальное разрешение. Это обеспечит высокую скорость формирования коммерческих предложений и стабильную работу системы в долгосрочной перспективе.