Книга знаний

1С:Предприятие / v8

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

Сохранение и восстановление данных в Хранилище значений.Автор статьи: Волшебник | Редакторы: Гений 1С
Последняя редакция №8 от 27.12.06 | История
URL: http://kb.mista.ru/article.php?id=72

Ключевые слова: хранилище, двоичные, ХранилищеЗначения, ДвоичныеДанные, СжатиеДанных, файлы, картинки, фотки, фотографии


Хранилище значений - это тип, который появился в 8.0, позволяющий сохранять прямо в базе различные данные, включая двоичные данные (произвольные файлы). Например, так можно хранить в базе данных JPG-картинки, Word-документы и т.д. Причем данные будут храниться в самой базе (файле 1CD или в таблицах на SQL-сервере) и будут включены в штатную выгрузку базы или резервную копию средствами SQL Server.

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

В хранилище значение можно сохранить почти любую информацию, например,

... картинки (фотки):

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

// в этом месте он все выводит ...

ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить();
ТекИзображение.Записать();


...табличный документ:

Процедура СохранитьВХранилищеНажатие(Элемент)
    ТабДок=Новый ТабличныйДокумент;    
    ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
    Хранилище=Новый ХранилищеЗначения(ТабДок);
    Записать();
КонецПроцедуры

Процедура ВосстановитьИзХранилищаНажатие(Элемент)
    ТабДок=Хранилище.Получить();
    Если ТабДок<>Неопределено Тогда
        ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
    КонецЕсли;
КонецПроцедуры


... произвольные файлы (двоичные данные):

ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));


Восьмерка поддерживает сжатие данных, помещаемых в хранилище:
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9));



... внешние обработки и отчеты:

Процедура ЗагрузитьОбработкуВХранилище(РеквизитТипХранилище)
   СтепеньСжатия = Новый СжатиеДанных(9); //9 максимум   
   РеквизитТипХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные("c:\отчеты\отчет.epf", СтепеньСжатия));
КонецПроцедуры
  
Процедура ЗапуститьОбработкуИзХранилища(РеквизитТипХранилище)
   ИмяВременногоФайла = КаталогВременныхФайлов()+"отчет.epf";
   ДвоичныеДанные = РеквизитТипХранилище.Получить();
   ДвоичныеДанные.Записать(ИмяВременногоФайла);
   ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла);
   ВнешняяОбработка.ПолучитьФорму().Открыть();
КонецПроцедуры


Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().

Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда
    ДвоичныеДанные = Хранилище.Получить();
Иначе
    ДвоичныеДанные = Хранилище;
КонецЕсли; 
ДвоичныеДанные.Записать(ИмяФайла);


Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:

ЗапуститьПриложение(ИмяФайла);


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

РеквизитХранилище = Неопределено;


Если в Хранилище значений содержались какие-то ссылки, то они не будут контролироваться при контроле ссылочной целостности (операция Удаление помеченных объектов или метод НайтиПоСсылкам).

К сожалению, 1С не содержит встроенных методов для проверки того, заполнено хранилище или нет.
Такой вариант не работает:
фл=Хранилище<>Неопределено;

Работает только такой вариант:
фл=Хранилище.Получить()<>Неопределено;

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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика