Имя: Пароль:
1C
 
Работа с хранилищем значений
0 Castlevania
 
24.08.10
21:20
Есть справочник. В его реквезите нужно хранить файлы в различных форматах-doc, xls. Я слышала что можно это сделать через Хранилище значений. Но никогда с хранилищем не работала. Подскажите пожалуйста, как это сделать?
1 Лефмихалыч
 
24.08.10
21:26
ХранилищеЗначения (ValueStorage)
Методы:
Получить (Get)

Конструкторы:
На основании значения

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

Важно! В системе не поддерживается ссылочная целостность по объектам, сохраненным в базе данных в полях типа ХранилищеЗначения. Это означает, что при попытке удаления, например, элементов справочников система не контролирует ссылки на эти элементы, сохраненные в ХранилищеЗначения.
Возможен обмен с сервером. Сериализуется. XML-сериализация. Поддержка отображения в XDTO; пространство имен: {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueStorage.
Пример:
МояКартинка = Новый Картинка("C:\Мои документы\Картинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);

НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();
См. также:
ДвоичныеДанные, метод Записать
2 Лефмихалыч
 
24.08.10
21:26
это в общем, а в частности:

ДвоичныеДанные (BinaryData)
Методы:
Записать (Write)

Конструкторы:
На основании файла

Описание:
Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения.
Хранимые данные могут быть записаны в файл.
Сериализуется. XML-сериализация. Поддержка отображения в XDTO; пространство имен: {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO: может быть любым из перечисленных: base64Binary, hexBinary.
Пример:
МояКартинка = Новый ДвоичныеДанные("C:\Мои документы\Картинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);

// сохранение значения типа ХранилищеЗначения в базе данных
НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
// реквизит Изображение имеет тип ХранилищеЗначения
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();
...
// выгрузка значения типа ДвоичныеДанные из хранилища значений в файл
ИмяФайла = "C:\Мои документы\Картинка2.bmp";
НовНоменклатура.Изображение.Получить().Записать(ИмяФайла);
См. также:
ПочтовоеВложение, свойство Данные
ПочтовыеВложения, метод Добавить
ИнтернетПочтовыеВложения, метод Добавить
Картинка, метод ПолучитьДвоичныеДанные
Глобальный контекст, метод Base64Значение
Глобальный контекст, метод Base64Строка
Картинка, конструктор Формирование из двоичных данных
ИнтернетТекстПочтовогоСообщения, свойство Данные
3 Лефмихалыч
 
24.08.10
21:27
СП током бьется при попытке его почитать, что ли?
4 Castlevania
 
24.08.10
21:32
(3) Чтобы его применить, нужно создать реквизит в справочнике?
5 H A D G E H O G s
 
24.08.10
21:33
Плохой пример.
Примерщика на мыло.
6 Castlevania
 
24.08.10
21:33
Или можно элемент формы с типом Хранилище?
7 Лефмихалыч
 
24.08.10
21:33
(4) чтобы применить - не нужно а вот, чтобы сохранить - обязательно
8 Castlevania
 
24.08.10
21:34
А как его потом извлечь?
9 H A D G E H O G s
 
24.08.10
21:34
(4) Безусловно
10 Castlevania
 
24.08.10
21:35
И еще такой ламерский вопрос: можно ли хранить сразу несколько файлов одного или разных типов?
11 Лефмихалыч
 
24.08.10
21:35
(5) дай свой
(8) обратным образом, об этом тоже в СП написано точно такими же русскими буквами, только спрашивать ни о чем не надо
12 Castlevania
 
24.08.10
21:36
+(10) В одном реквезите
13 H A D G E H O G s
 
24.08.10
21:36
Смотрим типовые конфы, не зря там в Номенклатуре Ссылка на справочник с Хранилищем, а не само Хранилище.

Отдел разработки типовых конфигураций так исправил косяк отдела разработки платформы.
14 Лефмихалыч
 
24.08.10
21:37
(10) скрючь раром в один и храни наздоровье. А еще лучше, открой любую туповую и погляди, как там ХранилищеДополнительнойИнформации сделано
15 Лефмихалыч
 
24.08.10
21:37
(12) а зачем именно в одном? чтобы понятнее было и проще потом с этим работать?
16 H A D G E H O G s
 
24.08.10
21:37
(10) Да!
Храни в хранилище СписокЗначений с элементами - ДвоичнымиДанными.
17 Castlevania
 
24.08.10
21:39
(15) Просто я не знаю что юзвери там будут хранить :) Просили сделать возможность сохранения всех файлов
18 Лефмихалыч
 
24.08.10
21:41
(17) смотри ХранилищеДополнительнойИнформации, не изобретай велосипедов
19 Castlevania
 
24.08.10
21:43
(18) Это не типовая. Самописная
20 Лефмихалыч
 
24.08.10
21:44
(19) тем более
21 Лефмихалыч
 
24.08.10
21:44
+(20) это будет единственная качественная вещь во всей конфе
22 Castlevania
 
24.08.10
21:47
(21) А где можно почитать про это?
23 Castlevania
 
24.08.10
21:47
Или это тоже самое, что и Хранилище Значения?
24 Лефмихалыч
 
24.08.10
21:50
(22) открой УТ, БП или УПП, найди там справочник ХранилищеДополнительнойИнформации, посмотри, как он работает в предприятии (он как раз для хранения файлов и придуман), а потом иди в конфигуратор и изучи, как эти сотонисты из 1С этого добились. Потом тебе не составит труда методом копипасты в свой нетленке сделать то же самое, даже лучше
25 Castlevania
 
24.08.10
21:51
(24) Спасибо огромное. Сейчас этим займусь:)
26 Castlevania
 
25.08.10
13:02
В общем сделала так:
/ запишем файл в хранилище    
Отказ = Ложь;    
Если ЭтоНовый() Тогда
Вопрос = "Перед вводом файлов и изображений необходимо записать элемент. Записать?";    
Ответ  = Вопрос(Вопрос, РежимДиалогаВопрос.ОКОтмена);    
Если Ответ = КодВозвратаДиалога.ОК Тогда        
Отказ = Не ЗаписатьВФорме();        
Иначе            
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Если НЕ Отказ Тогда
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
           
Если ДиалогОткрытияФайла.Выбрать() Тогда
ВыбранныйФайл = Новый Файл(ДиалогОткрытияФайла.ПолноеИмяФайла);
//ЭлементыФормы.ОсновноеИзображение.Картинка = ВыбранноеФото;    
Файл = Новый Файл(ДиалогОткрытияФайла.ПолноеИмяФайла);
НайтиИмя = Справочники.ХранилищеДополнительнойИнформации.НайтиПоНаименованию(Строка(Файл.ПолноеИмя));
Если НайтиИмя.Наименование = "" Тогда
НовыйЭлемент = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
НовыйЭлемент.Объект = ЭтотОбъект.Ссылка;
НовыйЭлемент.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Файл;    
НовыйЭлемент.Наименование = Строка(Файл.ПолноеИмя);    
НовыйЭлемент.Хранилище = Новый ХранилищеЗначения(Файл);
НовыйЭлемент.Записать();    
//ОсновноеИзображение = НовыйЭлемент.Ссылка;
//Иначе    
//ОсновноеИзображение = НайтиИмя.ССылка;
КонецЕсли;    
Иначе        
Отказ = Истина;    
Возврат;    
КонецЕсли;
КонецЕсли;



Но как его оттуда извлечь, я не найду. В типовой сложно все
27 Amiralnar
 
25.08.10
13:06
(16) ОМГ!!! В кошмарном сне врагу не пожелаю...
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн