При организации распределенных информационных баз (РИБ) или настроенных планов обмена в 1С часто возникает задача передачи медиафайлов — например, основных изображений товаров. Начинающие разработчики иногда решают эту задачу «в лоб»: создают у элемента справочника (например, Номенклатура) реквизит ОсновноеИзображение с типом ХранилищеЗначения. Рассмотрим, почему такой подход приводит к серьезным проблемам с производительностью и как правильно организовать хранение и передачу картинок между базами 1С.
На первый взгляд добавление реквизита типа ХранилищеЗначения прямо в объект выглядит удобным, однако в механизме распределенных баз это создает сразу несколько критических архитектурных проблем:
ХранилищеЗначения преобразуются в текстовую строку Base64. Это приводит к увеличению объема передаваемых данных примерно на 33% по сравнению с исходным файлом.rphost рискует израсходовать весь лимит доступной памяти, что приводит к завершению процесса с ошибкой недостатка памяти (Out of Memory) и «нависанию» обмена.Самый простой и правильный подход — не хранить бинарные данные в самом элементе номенклатуры, а использовать отдельный подчиненный справочник (например, ХранилищеДополнительнойИнформации или присоединенные файлы) и просто включить его в состав состава плана обмена.
Рассмотрим преимущества этого подхода:
СправочникСсылка.ХранилищеДополнительнойИнформации.Если по условиям архитектуры всё же необходимо использовать ХранилищеЗначения в объекте, следует программно ограничить авторегистрацию и сжимать данные при записи.
Разберем по шагам, как это реализовать:
ПриЗаписи будем проверять, менялось ли именно изображение (например, по хэш-сумме MD5), и регистрировать объект вручную только при изменении данных картинки.ХранилищеЗначения обязательно укажем параметр степени сжатия:
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
// Используем оптимальное или максимальное сжатие данных
ХранилищеИзображения = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(СжатиеДанных.Оптимальное));
ОбъектНоменклатура.ОсновноеИзображение = ХранилищеИзображения;
ОбъектНоменклатура.Записать();
В конфигурациях, построенных на Библиотеке Стандартных Подсистем (БСП), реализован механизм подсистемы «Работа с файлами». Данный механизм позволяет хранить файлы вне базы данных — на томах сетевого диска. В таком случае в обмене передается не сам бинарный файл внутри сообщения обмена, а структура файлов передается отдельным пакетом или закачивается по требованию через HTTP-сервисы.
Проанализировав возможные сценарии, сформируем практические рекомендации для разработчиков:
ХранилищеЗначения в реквизитах часто обновляемых справочников.