Хранение двоичных данных

Реквизиты, которые вы добавляете элементам проекта, могут быть предназначены для хранения двоичных данных: файлов документов, изображений, видео и т.д. Такие реквизиты имеют тип ДвоичныйОбъект.Ссылка.

Особенность двоичных данных заключается в том, что они, как правило, имеют большой размер, что может влиять на производительность приложения. По этой причине «1С:Шина» не хранит двоичные данные в тех же таблицах базы данных, что и остальные реквизиты. Для хранения двоичных данных «1С:Шина» использует специальные хранилища, которые должны быть заранее настроены администратором сервера. Непосредственно в реквизите хранится только ссылка на двоичные данные в этих хранилищах.

Хранилища двоичных данных

Сервер поддерживает два типа хранилищ:

  • Файловое — данные хранятся в локальном или сетевом каталоге на диске;
  • S3 — данные хранятся в сервисе, совместимом с Amazon S3, например:

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

Примечание: Чтобы облегчить просмотр всех хранилищ, в списке Инфраструктура > Объектные хранилища все стандартные файловые хранилища, созданные «1С:Шиной» для каждого приложения, отображаются в виде одной обобщенной строки.

Загрузка двоичных данных в приложении

Двоичные данные в приложении могут быть загружены разными способами:

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

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

Правила использования хранилища и свойства данных

Администратор для каждого хранилища описывает набор правил. Разработчик в своих алгоритмах загрузки двоичных данных задает свойства загружаемых данных. «1С:Шина» помещает двоичные данные в то хранилище, правилам которого удовлетворяют свойства двоичных данных (подробнее).

В процессе эксплуатации сервера администратор может менять набор хранилищ, может изменять их правила. После этого он может выполнить реорганизацию двоичных данных (вручную или по расписанию), при которой «1С:Шина» заново сопоставит свойства данных и правила хранилищ и переместит экземпляры двоичных данных в оптимальные хранилища.

Установка свойств двоичных данных

На сервере вы можете установить свойства двоичных данных непосредственно перед их загрузкой в хранилище. Например:

знч ВременныеФайлы = новый ДвоичныйОбъект.Свойства("temp")
                                         .Временные()
 
знч РезервныеКопии = новый ДвоичныйОбъект.Свойства("backup")
                                         .РедкийДоступ()
                                         .Конфиденциальность(ДвоичныйОбъект.Конфиденциальность.Конфиденциальные)
                                         .НадежностьХранилища(ДвоичныйОбъект.НадежностьХранилища.Средняя)

На клиенте перед загрузкой в хранилище установка свойств двоичных данных невозможна. Но после того, как данные загружены, вы можете перейти на сервер и изменить свойства уже загруженных данных.

Например, в переменной ДанныеСсылка вы имеете ссылку на загруженные двоичные данные (ДвоичныйОбъект.Ссылка):

знч ВременныеФайлы = новый ДвоичныйОбъект.Свойства("temp").Временные()
ДвоичныйОбъект.УстановитьСвойства(ДанныеСсылка, ВременныеФайлы) 

Когда администратор сервера выполнит реорганизацию двоичных данных, ваши данные попадут в оптимальное хранилище.

Удаление двоичных данных

После загрузки в хранилище двоичные данные не могут быть изменены. Допускается только изменение прикладных свойств данных.

Удалить двоичные данные может только «1С:Шина» в результате сборки мусора. Она автоматически контролирует время жизни данных. Как только на двоичные данные не остается хранимых ссылок (ДвоичныйОбъект.Ссылка), «1С:Шина» удаляет такие двоичные данные. Удаление выполняется с помощью функции сборки мусора, которая выполняется на сервере (вручную или по расписанию).