Имя: Пароль:
1C
1С v8
Картинка в УФ
0 Wobland
 
16.09.12
08:52
создаю себе справочник фотографий. реквизит один - Фото - типа ХЗ. Но никак не могу показать на форме. Что делаю не так?

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


Фото - реквизит формы типа картинка. Последняя строка вообще не отрабатывает: Недопустимое значение. Хотя слева и справа картинки. об.Фото.Получить() в отладчике показывает некие двоичные данные. Что делаю не так?
1 Wobland
 
16.09.12
08:53
+(0) вроде с декорацией то же выходит..
2 andrewks
 
16.09.12
08:58
ты открой демо-конфу "УП" - там всё на пальцах
3 Wobland
 
16.09.12
08:59
(2) УТ11 открывал. пришёл к выводу, что для добавления фото номенклатуры, его нужно предварительно в справочник файлов засунуть. а там как-то не очень прозрачно. плюнул и пошёл спать ;)
УП - это что?
4 andrewks
 
16.09.12
09:00
демо-конфа "Управляемое приложение". если украли, могу свой вариант выложить
5 Wobland
 
16.09.12
09:03
(4) на ИТСе есть? вчера искал что-то демо, но эту не нашёл
6 andrewks
 
16.09.12
09:07
ясно, короче. это не из демки, это мой тестовый пример

у справочника есть реквизит "Изображение1" типа ХЗ (не путать с х.з. ;-) )
на форме два текстовых реквизита: ИмяФайлаКартинки и Картинка
в Поле картинки устанавливаем ПутьКДанным="Каринка"\

код:

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

&НаСервере
Функция ЭтоАдресХран(АдресХран)
   Возврат ЭтоАдресВременногоХранилища(АдресХран);
КонецФункции
   
&НаКлиенте
Процедура ПолеКартинкиНажатие(Элемент, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
       ТекстВопроса = НСтр("ru='Для выбора изображения необходимо записать объект. Записать?'");
       Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
       Если Ответ = КодВозвратаДиалога.Да Тогда
           Записать();
       Иначе
           Возврат
       КонецЕсли;
   КонецЕсли;
   
   Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
       ИдентификаторФайла = Новый УникальныйИдентификатор;
       Фильтр = НСтр("ru = 'Все картинки (*.bmp;*.gif;*.png;*.jpeg;*.dib;*.rle;*.tif;*.jpg;*.ico;*.wmf;*.emf)|*.bmp;*.gif;*.png;*.jpeg;*.dib;*.rle;*.tif;*.jpg;*.ico;*.wmf;*.emf"
                                   + "|Все файлы(*.*)|*.*"
                                   + "|Формат bmp(*.bmp*;*.dib;*.rle)|*.bmp;*.dib;*.rle"
                                   + "|Формат GIF(*.gif*)|*.gif"
                                   + "|Формат JPEG(*.jpeg;*.jpg)|*.jpeg;*.jpg"
                                   + "|Формат PNG(*.png*)|*.png"
                                   + "|Формат TIFF(*.tif)|*.tif"
                                   + "|Формат icon(*.ico)|*.ico"
                                   + "|Формат метафайл(*.wmf;*.emf)|*.wmf;*.emf'");
       Если ПодключитьРасширениеРаботыСФайлами() Тогда
           ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
           ВыборФайла.МножественныйВыбор = Ложь;
           ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
           ВыборФайла.Фильтр = Фильтр;
           Если ЗначениеЗаполнено(ИмяФайлаКартинки) Тогда
               ВыборФайла.ПолноеИмяФайла=ИмяФайлаКартинки;
           КонецЕсли;
       
           РезВыбора=ВыборФайла.Выбрать();
           Если РезВыбора Тогда
               ИмяФайлаКартинки=ВыборФайла.ПолноеИмяФайла;
               Если ЭтоАдресХран(Картинка) Тогда
                   АдресХран=Картинка;
               Иначе
                   АдресХран="";
               КонецЕсли;
               АдресХран="";
               ПоместитьФайл(АдресХран,ИмяФайлаКартинки,,Ложь,ЭтаФорма.УникальныйИдентификатор);
               Картинка=АдресХран;
               ЭтаФорма.Элементы.ПолеКартинки.Обновить();
               ЭтаФорма.Модифицированность=1;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   Картинка=ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение1");
КонецПроцедуры

7 andrewks
 
16.09.12
09:08
короче, разбирайся, я, есличо - сваливаю, у меня по графику - велопробег
8 Wobland
 
16.09.12
09:09
(6) >Поле картинки устанавливаем ПутьКДанным
кажется, здесь ответ. спасибо, читаю
9 Wobland
 
16.09.12
11:22
разобрался, но не до конца. в частности, открываю форму существующего элемента, гружу новое изображение (изменение поля картинки видны), сразу пытаюсь сохранить - сохраняется "прошлая" картинка. и это несмотря на то, что объект предварительно записываю. что я недоучёл?


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

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

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

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
   Если ЭтоАдресВременногоХранилища(Картинка) Тогда
       ТекущийОбъект.Фото=Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Картинка));
   КонецЕсли;
КонецПроцедуры
10 Wobland
 
16.09.12
14:08
а вот если вместо ЗаписатьОбъект(); записать по кнопке (стандартной), всё отрабатывает, как нужно. как так я не так записываю?
11 Web00001
 
16.09.12
14:47
есть МГ от гилева как работать с картинками, кинь письмо мне на мыло, кину ссылку
12 Wobland
 
16.09.12
15:49
(11) кинул.

у меня как-то запись объекта не отрабатывает имхо:
&НаСервере
Процедура ЗаписатьОбъект()
   об=РеквизитФормыВЗначение("Объект");
   об.Записать();
   ЗначениеВРеквизитФормы(об, "Объект");
КонецПроцедуры
13 andrewks
 
16.09.12
16:34
(9) в (6) абсолютно работающий готовый код. можно тупо скопипастить, и всё
14 andrewks
 
16.09.12
16:38
(12) для чего этот код?
15 Wobland
 
16.09.12
16:52
(13) у тебя там загрузка, загрузку я победил, я "выдернуть" не могу. точнее, если последовательность действий, при котором вытаскивается не то.
(14) это я сохраняю то, что есть в памяти (в объекте) в базу с тем, чтобы потом из объекта вытащить картинку, отдать клиенту и сохранить на его диске.

спасибо Web00001, файл принял, буду изучать
16 andrewks
 
16.09.12
17:19
(15) а, ясно, я в "сразу пытаюсь сохранить " интерпретировал "сохранить" как "записать элемент"
17 andrewks
 
16.09.12
17:22
(15) " это я сохраняю то, что есть в памяти (в объекте) в базу с тем, чтобы потом из объекта вытащить картинку"

нахрена?  если ты её только что качнул - она у тебя в ВХ, бери её прямо оттуда, зачем огород городить? да и запись элемента при _извлечении_ картинки - это моветон, имхо
18 andrewks
 
16.09.12
17:24
я, кстати, вообще не стал заморачиваться с кнопкой сохранения картинки - а нафига, если есть штатное ПКМ\сохранить как?
19 andrewks
 
16.09.12
17:24
а я понял, наверное, в чём твоя проблема - ты про Обновить() забыл
20 Wobland
 
16.09.12
17:31
(17) согласен про моветон, это у меня уже танцы с бубном. она у меня не всегда во ВХ - сразу после открытия её туда никто не положил.
(18) гыгы, не видел. тогда является особенностью интерфейса, кнопку сохранить себе шлём лесом ;)
(19) да вроде нет

с учётом (18) объявляю форму работающей, займусь изучением ХЗ, картинков и иже с ними. всем спасибо
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший