Как сохранить и отобразить картинку из регистра сведений в 1С

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

При разработке прикладных решений в 1С часто возникает задача привязать графические изображения к объектам конфигурации: фотографии товаров, сканы документов или фото автомобилей. Для этого нередко используют регистры сведений с ресурсом типа ХранилищеЗначения. Разберем подробно, как правильно программно записать изображение в регистр, как извлечь его и отобразить на форме, а также проанализируем нюансы производительности и альтернативные способы хранения.

Сохранение изображения в регистр сведений

Рассмотрим процесс записи графического файла с диска в ресурс регистра сведений. Для эффективного использования дискового пространства упакуем двоичные данные в ХранилищеЗначения с использованием сжатия данных.

Разберем пример создания новой записи через МенеджерЗаписи:


Файл = Новый Файл(ИмяФайла);
Если Файл.Существует() И Файл.ЭтоФайл() Тогда
    
    НовЗапись = РегистрыСведений.ФотоАвтомобилей.СоздатьМенеджерЗаписи();
    НовЗапись.Модель = Стр.Модель;
    НовЗапись.Цвет = Цвет;
    
    Попытка
        // Создаем объект Картинка и упаковываем его в ХранилищеЗначения со сжатием
        Данные = Новый ХранилищеЗначения(Новый Картинка(Файл.ПолноеИмя, Ложь), Новый СжатиеДанных(9));
        НовЗапись.Картинка = Данные;
        НовЗапись.Записать();
    Исключение
        Сообщить("Ошибка добавления файла! Возможно, файл заблокирован другой программой", СтатусСообщения.Внимание);
    КонецПопытки;
    
КонецЕсли;

Обратим внимание на параметр сжатия: конструктор Новый СжатиеДанных(9) обеспечивает максимальную степень упаковки данных перед помещением в базу данных.

Чтение данных и отображение картинки в обычных формах

Выясним, как извлечь сохраненную картинку с помощью запроса и вывести ее в поле формы. В обычном интерфейсе элемент управления напрямую поддерживает установку объекта Картинка.

Посмотрим на пример извлечения и вывода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ФотоАвтомобилей.Картинка КАК ХранилищеКартинки
    |ИЗ
    |   РегистрСведений.ФотоАвтомобилей КАК ФотоАвтомобилей
    |ГДЕ
    |   ФотоАвтомобилей.Модель = &Модель
    |   И ФотоАвтомобилей.Цвет = &Цвет";

Запрос.УстановитьПараметр("Модель", Модель);
Запрос.УстановитьПараметр("Цвет", Цвет);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    // Извлекаем объект из ХранилищаЗначения
    ДанныеКартинки = Выборка.ХранилищеКартинки.Получить();
    
    Если ТипЗнч(ДанныеКартинки) = Тип("Картинка") Тогда
        ЭлементыФормы.ПолеПредварительногоПросмотра.Картинка = ДанныеКартинки;
    Иначе
        ЭлементыФормы.ПолеПредварительногоПросмотра.Картинка = БиблиотекаКартинок.Скрепка;
    КонецЕсли;
КонецЕсли;

Особенности отображения в управляемых формах

В управляемом интерфейсе прямое присвоение объекта Картинка элементу формы не применяется. Поле формы связывается с реквизитом типа Строка, содержащим навигационную ссылку или адрес во временном хранилище.

Разберем по шагам два основных способа работы в клиент-серверной архитектуре:

  1. Через временное хранилище: на стороне сервера извлекаем данные методом Получить() из ХранилищеЗначения, вызываем ПоместитьВоВременноеХранилище() с передачей УникальныйИдентификатор формы и присваиваем полученный адрес строковому реквизиту формы.
  2. Через навигационную ссылку: используем функцию ПолучитьНавигационнуюСсылку(), передавая ключ записи регистра сведений и имя ресурса. В этом случае платформа самостоятельно подгрузит двоичные данные по сформированному URL.

Анализ производительности и риски хранения файлов в базе

Проанализируем технические нюансы и возможные проблемы, возникающие при активном сохранении изображений в базе данных:

  1. Ограничение файловой базы данных: в файловом режиме работы действует лимит в 4 ГБ на одну внутреннюю таблицу. При интенсивном сохранении тяжелых изображений таблица регистра сведений быстро исчерпает свободное пространство, что приведет к сбоям.
  2. Размер резервных копий: хранение сотен тысяч медиафайлов в теле информационной базы существенно увеличивает время выгрузки, создания дампов и восстановления базы данных при сбоях.
  3. Повышенная нагрузка на оперативную память: передача объемных полей типа ХранилищеЗначения нагружает сетевой трафик и серверные процессы. Крайне не рекомендуется включать такие поля в динамические списки без жесткой необходимости.

Рекомендации по оптимизации

Чтобы избежать падения производительности, рекомендуется применять следующие архитектурные подходы:

  1. Генерация миниатюр: с помощью объекта ОбработкаКартинок уменьшайте разрешение и размер фото при загрузке. Легкую миниатюру (превью) можно хранить в регистре для быстрого вывода в интерфейсе, а оригинал — загружать отдельно при детальном просмотре.
  2. Вынос файлов в тома на диске: используйте сетевые каталоги (UNC-пути) или FTP-сервер. В регистре сведений сохраняйте только относительный путь или идентификатор файла, обеспечив службе сервера 1С полные права доступа к сетевой папке.
  3. Контроль дублей: рассчитывайте хэш-сумму (контрольную сумму) каждого файла при загрузке, чтобы предотвратить повторное сохранение одинаковых изображений.
  4. Асинхронные вызовы: в веб-клиенте и тонком клиенте передавайте файлы на сервер с помощью асинхронных методов платформы (ПоместитьФайлНаСерверАсинх), чтобы не блокировать интерфейс пользователя.
← На главную