Имя: Пароль:
1C
1С v8
8,2 Работа с реквизитом типа ХранилищеЗначения
,
0 Кукалёв Анатолий
 
13.03.12
10:29
Есть справочник ФотоНоменклатуры.
У него есть реквизит ХранилищеКартинки - тип ХранилищеЗначения.
На форме есть кнопка "ПрикрепитьКартинку".

&НаКлиенте
Процедура ПрикрепитьКартинку(Команда)
   Диалог    = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.ПолноеИмяФайла        = "";
   Диалог.Фильтр            = "(*.jpg)|*.jpg";
   Диалог.МножественныйВыбор    = Ложь;
   Диалог.Заголовок        = "Выберите файл";
   Если Диалог.Выбрать() Тогда
       МассивФайлов    = Диалог.ВыбранныеФайлы;
       Для Каждого ИмяФайла Из МассивФайлов Цикл
           ВыбранныйФайл    = Новый Файл(ИмяФайла);
           ПутьКФайлу    = ВыбранныйФайл.ПолноеИмя;
           
           МояКартинка    = Новый Картинка(ПутьКФайлу, Истина);

           //ПроцедураПомещенияВХранилищеКартинки
       КонецЦикла;
   КонецЕсли;
КонецПроцедуры

Вопрос в том, как должна выглядеть ПроцедураПомещенияВХранилищеКартинки ?
Эта процедура должна поместить переменную МояКартинка в реквизит ХранилищеКартинки справочника ФотоНоменклатуры.
1 Cube
 
13.03.12
10:30
(0) Посмотреть, как это сделано в типовых не предлагать?
2 Рэйв
 
13.03.12
10:31
ВыбранноеФото = Новый Картинка(Диалог.ПолноеИмяФайла,Ложь);
НовоеФото = Новый ХранилищеЗначения(ВыбранноеФото,Новый СжатиеДанных(1));
СхемаПроезда=НовоеФото;
ЭлементыФормы.ПолеКартинки1.Картинка = СхемаПроезда.Получить();
3 Cube
 
13.03.12
10:33
(2) Это так просто было в обычных формах, а у него, походу, управляемые... :)
4 Рэйв
 
13.03.12
10:34
(2)Разберется поди:-)
5 Кукалёв Анатолий
 
13.03.12
10:41
Да управляемые и (2) не прокатывает.
6 Кукалёв Анатолий
 
13.03.12
10:43
Как обратиться к реквизиту ХранилищеКартинки, т.к. его даже нет в перечне реквизитов ?
7 Cube
 
13.03.12
10:46
(6) Смотри (1).
8 Кукалёв Анатолий
 
13.03.12
10:48
Смотрел, но чето простого ничего не увидел.
9 Cube
 
13.03.12
10:53
(8) Значит правильно смотрел :)
Там ничего простого нет)
10 Smallrat
 
13.03.12
10:57
примерный кусок кода:

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
   
   Перем ВыбранноеИмя;
   
   АдресФайла = "";
   Если ПоместитьФайл(АдресФайла, "", ВыбранноеИмя, Истина, ЭтаФорма.УникальныйИдентификатор) Тогда
       СтруктураИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяРасширениеФайла(ВыбранноеИмя);
       Объект.ИмяФайла = СтруктураИмяФайла.Имя + "." + СтруктураИмяФайла.Расширение;
       ПоместитьФайлНаСервер(АдресФайла);
   КонецЕсли;
   
КонецПроцедуры

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

&НаСервере
Функция ДанныеЗаполнены()
   ЭлементСправочника = РеквизитФормыВЗначение("Объект");
   Возврат ЭлементСправочника.Данные.Получить() <> Неопределено;
КонецФункции

&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
   Если Не ДанныеЗаполнены() Тогда
       Сообщить("Файл не загружен");
       Возврат;
   КонецЕсли;
   Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Данные");
   ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);
КонецПроцедуры
11 Smallrat
 
13.03.12
11:00

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
   
   Перем ВыбранноеИмя;
   
   АдресФайла = "";
   Если ПоместитьФайл(АдресФайла, "", ВыбранноеИмя, Истина, ЭтаФорма.УникальныйИдентификатор) Тогда
       СтруктураИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяРасширениеФайла(ВыбранноеИмя);
       Объект.ИмяФайла = СтруктураИмяФайла.Имя + "." + СтруктураИмяФайла.Расширение;
       ПоместитьФайлНаСервер(АдресФайла);
   КонецЕсли;
   
КонецПроцедуры

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

&НаСервере
Функция ДанныеЗаполнены()
   ЭлементСправочника = РеквизитФормыВЗначение("Объект");
   Возврат ЭлементСправочника.Данные.Получить() <> Неопределено;
КонецФункции

&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
   Если Не ДанныеЗаполнены() Тогда
       Сообщить("Файл не загружен");
       Возврат;
   КонецЕсли;
   Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Данные");
   ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);
КонецПроцедуры
12 Smallrat
 
13.03.12
11:00
ой не то

Функция РазложитьСтрокуПоТочкамИСлэшам(Знач Представление)
   Перем ТекущаяПозиция;

   Фрагменты = Новый Массив;
   
   НачальнаяПозиция = 1;
   
   Для ТекущаяПозиция = 1 По СтрДлина(Представление) Цикл
       ТекущийСимвол = Сред(Представление, ТекущаяПозиция, 1);
       Если ТекущийСимвол = "." Или ТекущийСимвол = "/" Или ТекущийСимвол = "\" Тогда
           ТекущийФрагмент = Сред(Представление, НачальнаяПозиция, ТекущаяПозиция - НачальнаяПозиция);
           НачальнаяПозиция = ТекущаяПозиция + 1;
           Фрагменты.Добавить(ТекущийФрагмент);
       КонецЕсли;    
   КонецЦикла;    
   
   Если НачальнаяПозиция <> ТекущаяПозиция Тогда
       ТекущийФрагмент = Сред(Представление, НачальнаяПозиция, ТекущаяПозиция - НачальнаяПозиция);
       Фрагменты.Добавить(ТекущийФрагмент);
   КонецЕсли;    
       
   Возврат Фрагменты;
КонецФункции

Функция ПолучитьИмяРасширениеФайла(ВыбранныйПутьКФайлу) Экспорт
   
   ИмяБезРасширения = "";
   Расширение = "";
   
   СтрокиПути = РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу);
   Если СтрокиПути.Количество() >= 2 Тогда
       Расширение = СтрокиПути[СтрокиПути.Количество()-1];
       ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2];
   КонецЕсли;
   
   Возврат Новый Структура("Имя, Расширение", ИмяБезРасширения, Расширение);
   
КонецФункции            
13 Кукалёв Анатолий
 
13.03.12
17:47
Сделал так

&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
   Диалог                        = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.ПолноеИмяФайла        = "";
   Диалог.Фильтр                = "(*.jpg)|*.jpg";
   Диалог.МножественныйВыбор    = Ложь;
   Диалог.Заголовок            = "Выберите файл";
   Если Диалог.Выбрать() Тогда
       МассивФайлов    = Диалог.ВыбранныеФайлы;
       Для Каждого ИмяФайла Из МассивФайлов Цикл
           ВыбранныйФайл        = Новый Файл(ИмяФайла);
           Объект.ПутьКФайлу    = ВыбранныйФайл.ПолноеИмя;
           
           Если Не ЗначениеЗаполнено(Объект.Наименование) Тогда
               Объект.Наименование    = ВыбранныйФайл.ИмяБезРасширения
           КонецЕсли;
           
           НоваяКартинка    = Новый Картинка(Объект.ПутьКФайлу, Истина);
           АдресКартинки    = ПоместитьВоВременноеХранилище(НоваяКартинка);
       КонецЦикла;
   КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
   Если Не ЗначениеЗаполнено(АдресКартинки) Тогда
       Сообщение        = Новый СообщениеПользователю;
       Сообщение.Текст    = "Загрузите картинку";
       Сообщение.Сообщить();
       
       Отказ    = Истина;
       Возврат
   КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
       Возврат
   КонецЕсли;
   
   ТекущаяКартинка    = Объект.Ссылка.ХранилищеКартинки.Получить();
   АдресКартинки    = ПоместитьВоВременноеХранилище(ТекущаяКартинка);
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
   УдалитьИзВременногоХранилища(АдресКартинки);
КонецПроцедуры

Прошу указать на недочеты.
Smallrat спасибо за код.
14 Кукалёв Анатолий
 
13.03.12
17:48
АдресКартинки - реквизит формы, тип строка(0)
15 Smallrat
 
14.03.12
08:47
(14) на быстрый взгляд ничего криминального нет. Работает ? Вот и хорошо :)
Независимо от того, куда вы едете — это в гору и против ветра!