Хранение двоичных данных
Реквизиты, которые вы добавляете элементам проекта, могут быть предназначены для хранения двоичных данных: файлов документов, изображений, видео и т.д. Такие реквизиты имеют тип ДвоичныйОбъект.Ссылка.
Особенность двоичных данных заключается в том, что они, как правило, имеют большой размер, что может влиять на производительность приложения. По этой причине «1С:Шина» не хранит двоичные данные в тех же таблицах базы данных, что и остальные реквизиты. Для хранения двоичных данных «1С:Шина» использует специальные хранилища, которые должны быть заранее настроены администратором сервера. Непосредственно в реквизите хранится только ссылка на двоичные данные в этих хранилищах.
Хранилища двоичных данных
Сервер поддерживает два типа хранилищ:
- Файловое — данные хранятся в локальном или сетевом каталоге на диске;
- S3 — данные хранятся в сервисе, совместимом с Amazon S3, например:
- Yandex Object Storage;
- VK Cloud Solutions Storage;
- MinIO — локальный S3-сервер.
Сервер для каждого приложения стандартно создает одно локальное файловое хранилище двоичных данных. Для оптимизации ресурсов можно добавлять к серверу дополнительные хранилища и подключать их к приложениям.
Загрузка двоичных данных в приложении
Двоичные данные в приложении могут быть загружены разными способами:
- На клиенте, в результате перетаскивания файла в компонент пользовательского
интерфейса. В этом случае загрузку файлов можно выполнить в обработчике события
ПриПеретаскивании, которое возникает у этого компонента.
Например, если файл перетаскивается в форму элемента справочника
(ФормаЭлемента), то в модуле этого компонента вы можете
загрузить файл следующим
образом:
метод ПриПеретаскивании(Источник: Компонент, Событие: СобытиеПриПеретаскивании) знч Файлы = Событие.Значение как ЧитаемыйМассив<ВыбранныйФайл> Событие.СтандартнаяОбработка = Ложь для Файл из Файлы пер ссылка = ЗагрузкиФайлов.НачатьЗагрузку(Файл).ПолучитьРезультат() // Сохранение ссылки на двоичные данные ; ;
- На клиенте, в результате использования компонента ВыборФайлов. В
этом случае загрузку файлов можно выполнить в обработчике события
ПриВыбореФайлов, которое возникает у компонента-владельца.
Например, если компонент ВыборФайлов расположен в форме элемента
справочника (компонент ФормаЭлемента), то в модуле компонента
формы справочника вы можете загрузить файл следующим
образом:
метод ПриВыбореФайлов(Файлы: Массив): неизвестно // Загрузить только первый файл, если файлов несколько. пер Ссылка = ЗагрузкиФайлов.НачатьЗагрузку(Файлы[0]).ПолучитьРезультат() // Сохранить ссылку на двоичные данные в реквизите «ФайлДоговора». Сущность.Данные["ФайлДоговора"] = Ссылка ;
- На сервере, для этого предназначен тип встроенного языка
ДвоичныйОбъект. Например, метод HTTP-сервиса может получать
изображение и сохранять его в справочнике
Изображения:
@ВПроекте метод ДобавитьИзображение(Запрос: HttpСервисЗапрос) // Получить заголовки запроса. знч Код = Запрос.Параметры.ПолучитьПервый("imageCode") знч Размер = Запрос.Заголовки.ПолучитьПервый("Content-Length") знч ТипСодержимого = Запрос.Заголовки.ПолучитьПервый("Content-Type") // Загрузить двоичные данные в хранилище. знч Изображение: ДвоичныйОбъект = ОбъектноеХранилище.Загрузить(Запрос.Тело, новый Число(Размер), ТипСодержимого) // Создать элемент справочника «Изображения» и в его реквизите «Данные» сохранить ссылку на двоичные данные. знч ИзображениеЭлемент = новый Изображения.Объект() ИзображениеЭлемент.Код = Код ИзображениеЭлемент.Данные = Изображение.Ссылка ИзображениеЭлемент.Записать() Запрос.Ответ.УстановитьТело(Изображение.Ссылка.ВСтроку()) ;
Для более эффективного расхода памяти в хранилищах двоичных данных, «1С:Шина» обеспечивает дедупликацию двоичных данных: при загрузке экземпляра вычисляется его хеш-сумма и если экземпляр с такой хеш-суммой уже есть в хранилище, то он будет задействован повторно.
Правила использования хранилища и свойства данных
Администратор для каждого хранилища описывает набор правил. Разработчик в своих алгоритмах загрузки двоичных данных задает свойства загружаемых данных. «1С:Шина» помещает двоичные данные в то хранилище, правилам которого удовлетворяют свойства двоичных данных (подробнее).
В процессе эксплуатации сервера администратор может менять набор хранилищ, может изменять их правила. После этого он может выполнить реорганизацию двоичных данных (вручную или по расписанию), при которой «1С:Шина» заново сопоставит свойства данных и правила хранилищ и переместит экземпляры двоичных данных в оптимальные хранилища.
Установка свойств двоичных данных
На сервере вы можете установить свойства двоичных данных непосредственно перед их загрузкой в хранилище. Например:
знч ВременныеФайлы = новый ДвоичныйОбъект.Свойства("temp")
.Временные()
знч РезервныеКопии = новый ДвоичныйОбъект.Свойства("backup")
.РедкийДоступ()
.Конфиденциальность(ДвоичныйОбъект.Конфиденциальность.Конфиденциальные)
.НадежностьХранилища(ДвоичныйОбъект.НадежностьХранилища.Средняя)
На клиенте перед загрузкой в хранилище установка свойств двоичных данных невозможна. Но после того, как данные загружены, вы можете перейти на сервер и изменить свойства уже загруженных данных.
Например, в переменной ДанныеСсылка вы имеете ссылку на загруженные двоичные данные (ДвоичныйОбъект.Ссылка):
знч ВременныеФайлы = новый ДвоичныйОбъект.Свойства("temp").Временные()
ДвоичныйОбъект.УстановитьСвойства(ДанныеСсылка, ВременныеФайлы)
Когда администратор сервера выполнит реорганизацию двоичных данных, ваши данные попадут в оптимальное хранилище.
Удаление двоичных данных
После загрузки в хранилище двоичные данные не могут быть изменены. Допускается только изменение прикладных свойств данных.
Удалить двоичные данные может только «1С:Шина» в результате сборки мусора. Она автоматически контролирует время жизни данных. Как только на двоичные данные не остается хранимых ссылок (ДвоичныйОбъект.Ссылка), «1С:Шина» удаляет такие двоичные данные. Удаление выполняется с помощью функции сборки мусора, которая выполняется на сервере (вручную или по расписанию).