Имя: Пароль:
1C
1С v8
Загрузка и просмотр картинки (ХранилищеЗначений)
0 queit
 
04.07.13
07:04
В общем хочется загрузить картинку из файла и вывести её на просмотр.
Делаю справочник "Файлы", реквизит "ХранимыйФайл" - тип "ХранилищеЗначения".
Команда загрузить:
&НаСервере
Процедура СоздатьФайлНаСервере(АдресФайла, ИмяФайла)

   ХранилищеКартинки = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресФайла));

   ОбФормы = РеквизитФормыВЗначение("Объект");
   ОбФормы.Наименование = ИмяФайла;
   ОбФормы.ХранимыйФайл = ХранилищеКартинки;
   ЗначениеВРеквизитФормы(ОбФормы, "Объект");

КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФайл()

   // Создание из файла
   ПолноеИмяФайла = "";

   РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
   ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ВыборФайла.МножественныйВыбор = Ложь;
   ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
   ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.*)|*.*'");

   Результат = ВыборФайла.Выбрать();
   ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла;

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

КонецПроцедуры

&НаКлиенте
Процедура ВыбратьФайл(Команда)
   
   ЗагрузитьФайл();
   
КонецПроцедуры

потом создаю реквизит формы "АдресКартинки" - тип "Строка"
Помещаю на форму элемент "АдресКартинки" вид - "Поле картинки"
затем В при создании на сервере пишу:
   АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ХранимыйФайл");

и картинка не выводится =(

Подскажите что я делаю не так?
1 Cyberhawk
 
04.07.13
07:18
Я через ЗапуститьПриложение открываю картинки:

&НаКлиенте
Процедура ОткрытьФайл(Индекс)    Экспорт
   Если ПустаяСтрока(Объект.Вложения[Индекс].ИмяФайлаИсточника) Тогда
       Предупреждение(НСтр("ru = 'Имя не задано'", "ru"));
       Возврат;
   КонецЕсли;    
   
   Адрес = АдресХранилища(Индекс);
   Файл = Новый Файл(Объект.Вложения[Индекс].ИмяФайлаИсточника);
   #Если ВебКлиент тогда
       ПолучитьФайл(Адрес,Файл.Имя, Истина);
   #Иначе
       ПутьКФайлу = КаталогВременныхФайлов()+Файл.Имя;
       ПолучитьФайл(Адрес,ПутьКФайлу, ЛОжь);
       ЗапуститьПриложение(ПутьКФайлу);
   #КонецЕсли
КонецПроцедуры
2 Cyberhawk
 
04.07.13
07:19
Объект.Вложения - табличная часть с файлами
3 queit
 
04.07.13
07:26
Как вариант можно и так, но все таки хочется чтобы на форме показывалась картинка.
Вообще ни понимаю как это сделать.
4 Cyberhawk
 
04.07.13
07:26
Так посмотри как это сделано в УТ 11
5 Cyberhawk
 
04.07.13
07:26
Для номенклатуры
6 queit
 
04.07.13
07:30
(4) дык посмотрел как в УНФ, так и делается как я написал :-)
Все проходит без ошибок, в хранилище записывается, вот только в элементе на форме не отображается.
7 cw014
 
04.07.13
07:32
А сделать отдельный реквизит с типом "Картинка" и туда помещать твою картинку из ХранилищеЗначений никак?
8 cw014
 
04.07.13
07:32
ОбФормы = РеквизитФормыВЗначение("Объект");
   ОбФормы.Наименование = ИмяФайла;
   ОбФормы.ХранимыйФайл = ХранилищеКартинки;
   ЗначениеВРеквизитФормы(ОбФормы, "Объект");


1 и 4 строка в контексте формы бессмыслены
9 queit
 
04.07.13
07:33
(8) тогда как поместить данные в реквизит?
10 cw014
 
04.07.13
07:34
(9) Если в реквизит объекта, то напрямую
Объект.ХранимыйФайл = ХранилищеКартинки;
11 queit
 
04.07.13
07:36
(10) и где это строчка должна выполняться?
12 cw014
 
04.07.13
07:37
(11) Вместо всего хлама, указанного в (8)
13 queit
 
04.07.13
07:40
(12) вообще-то, "Объект" - это "ДанныеФормыСтруктура", в этой структуре у меня нет реквизита "ХранимыйФайл". У него тип "ХранилищеЗначений". Ничего не путаете?
14 cw014
 
04.07.13
07:49
(13) Ладно, верю. Но имхо зачем тебе "АдресКартинки" в виде строки?
15 cw014
 
04.07.13
07:50
Добавь в реквизиты формы реквизит с типом "Картинка", помести его на форму да и закидывай туда свою картинку
16 queit
 
04.07.13
07:58
(15) такой вариант пробовал:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   Картинка = Новый Картинка(Объект.Ссылка.ХранимыйФайл.Получить());
   
КонецПроцедуры

все равно пусто :-(
17 cw014
 
04.07.13
08:04
Значит что то где то не так делаешь
18 queit
 
04.07.13
08:09
(17) вот в этом-то и вопрос. В отладчике останавливаюсь - в реквизите "ХранимыйФайл" есть двоичные данные.
Значит картинка загружается. Почему не выводится - вопрос остается открытым
19 Лодырь
 
04.07.13
08:10
О, видать топикстартер штурмует ЦАН.
20 Лодырь
 
04.07.13
08:11
Надо уже выложить куданибудь конфигу с их заданием.
21 queit
 
04.07.13
08:18
(19) А вот и не угадали :-)
Пишу конфу для хостела, там смысл следующий:
есть номера, в номерах есть места - кровати. Кровати бывают разные - деревянные, железные, надувные, просто высокие матрасы. Так вот места - это отдельный справочник и хотелось бы чтобы в этом справочнике была фотка места - кровати :-)

А что у ЦАН есть такая задачка???
22 queit
 
04.07.13
08:18
(20) если у них нечто подобное, то поделитесь, пожалуйста.
23 Лодырь
 
04.07.13
08:21
(22) Есть, а вы им постучите - они вам задание и вышлют )Тут задача обсуждалась, во всяком случае я натыкался пару раз случайно.
24 queit
 
04.07.13
08:34
(23) да как-то у них своя задача, а у меня своя :-)
25 bborisko
 
04.07.13
08:54
Я вот так показываю
ДД=Новый ДвоичныеДанные(ТекущаяКартинка);
АдресКартинки = ПоместитьВоВременноеХранилище(ДД);

Но у меня ТекущаяКартинка - строка с путем к файлу
26 queit
 
04.07.13
08:56
(25) неее, это не красиво. Так придется хранить файлы на диске. У меня все хранится в базе, в ХранилищеЗначений
27 bborisko
 
04.07.13
08:59
(26) Все зависит от количества картинок)
А вообще можно же сохранить в темп и открыть.
28 queit
 
04.07.13
09:01
Создал реквизит "ТекКартинка" тип "картинка". Поместил на форму картинку.
Выполняю код:
   ТекКартинка = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайла));

Картинка пустая - вот здесь я вообще ничего не понимаю ((( двоичные данные же есть, куда пропадает картинка...не понятно...
29 queit
 
04.07.13
09:02
(27) В принципе можно, но реально хочется разобраться как это делается в типовой.
30 bborisko
 
04.07.13
09:06
У меня АдресКартинки - реквизит строка , а на форме АдресКартинки  - поле картинки с данными из реквизита строка

Попробуй так же просто адрес указать. А вообще это все у меня на УФ, на обычных формах не помню но там было все проще.
31 queit
 
04.07.13
09:12
(30) да, у меня все так же. Не работает - картинка не отображается вообще.
32 bborisko
 
04.07.13
09:19
Посмотри в типовых как - там например в справочнике сотрудники - фото сотрудника отображается и хранится оно как раз в базе.
33 queit
 
04.07.13
10:08
дело было не в бабине )))
нужно еще вот такую конструкцию:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
   
   Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда
       ТекущийОбъект.ХранимыйФайл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресКартинки));
   КонецЕсли;
   
КонецПроцедуры
34 Cyberhawk
 
04.07.13
11:26
Молодец
Ошибка? Это не ошибка, это системная функция.