Хранилище значения

Печать (Ctrl+P)

Хранение данных в полях типа ХранилищеЗначения

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

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

Соответственно поля типа ХранилищеЗначения следует использовать только в тех случаях, когда это соответствует их назначению и технологическим особенностям.

Важно! В системе не поддерживается ссылочная целостность по объектам, сохраненным в базе данных в полях типа ХранилищеЗначения. Это означает, что при попытке удаления, например, элементов справочников система не контролирует ссылки на эти элементы, сохраненные в ХранилищеЗначения.

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

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

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

Объект типа ХранилищеЗначения создается следующей конструкцией

 Хранилище = Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>)  

Параметры:

  • <Значение> (обязательный)Тип: Произвольный. Значение, которое должно быть помещено в хранилище.
  • <АлгоритмСжатияДанных> (необязательный)Тип: СжатиеДанных. Задает степень сжатия данных.
  • Если параметр не установлен, сжатие не используется.

Пример 1:

 МояКартинка = Новый Картинка("C:\Мои документы\Картинка1.bmp");
Сжатие = Новый СжатиеДанных(6);
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка, Сжатие);
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();

Пример 2: Метод получить – К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.

//  Двоичные Данные текстового файла, сохраняемого в реквизите МоеХранилище документа
 Хранилище= Заявка.МоеХранилище.Получить();  
  ВременныйФайл = ПолучитьИмяВременногоФайла("txt"); 
 Хранилище.Записать(ВременныйФайл); 
 ТекстовыйДок= Новый ТекстовыйДокумент;
  ТекстовыйДок.Прочитать(ВременныйФайл, КодировкаТекста.UTF8);

Пример 3 : Использование объект ДвоичныеДанные , значение которого считывается из файла и может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.

МояКартинка = Новый ДвоичныеДанные("C:\Мои документы\Картинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);
// сохранение значения типа ХранилищеЗначения в базе данных
НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
// реквизит Изображение имеет тип ХранилищеЗначения
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();

Пример 4 . Выгрузка значения типа ДвоичныеДанные из хранилища значений в файл

ИмяФайла = "C:\Мои документы\Картинка2.bmp";
Хранилище = НовНоменклатура.Изображение.Получить();
Хранилище.Записать(ИмяФайла);

Previous Article
Next Article

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.