Имя: Пароль:
1C
1С v8
ХранилищеЗначения Несоответствие типов при выводе картинки на элемент формы
,
0 DenisVich
 
30.11.17
13:17
Есть реквизит с типом ХранилищеЗначения. Туда записана картинка. Хочу ее отобразить при активизации на форме(табличная часть содержит этот реквизит). При активизации строки во время попытки вывода изображения:
"            Если мТекущееОсновноеИзображение = Неопределено Тогда
                ЭлементыФормы.ПолеКартинкиФотография.Картинка = мПустаяКартинка;
            Иначе
                ЭлементыФормы.ПолеКартинкиФотография.Картинка = мТекущееОсновноеИзображение;
            КонецЕсли;    "
Сообщение: "Несоответствие типов. ЭлементыФормы.ПолеКартинкиФотография.Картинка = мТекущееОсновноеИзображение;"
Пустая картинка(Неопределено) элементу присваевается.
1 DenisVich
 
30.11.17
13:18
Отображение делаю в записанном элементе.(Задачи).
2 Fish
 
30.11.17
13:18
Показывай, как ты картинку запихиваешь в ХранилищеЗначения и как достаёшь оттуда.
3 DenisVich
 
30.11.17
13:19
Перем ДиалогВыбораФайлаОбъект;
    Перем КартинкаОбъект;
    //Объявление, инициализация переменных. -
    ДиалогВыбораФайлаОбъект = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбораФайлаОбъект.Фильтр = "Все картинки (*.jpg;*.jpeg;*.tif;*.gif;*.png)|*.jpg;*.jpeg;*.tif;*.gif;*.png|"
            + "Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|"
            + "Формат TIFF (*.tif)|*.tif|"
            + "Формат GIF (*.gif)|*.gif|"
            + "Формат PNG (*.png)|*.png";

        Если ДиалогВыбораФайлаОбъект.Выбрать() Тогда
            КартинкаОбъект = Новый Картинка(ДиалогВыбораФайлаОбъект.ПолноеИмяФайла);
            Если ЗначениеЗаполнено(ДиалогВыбораФайлаОбъект.ПолноеИмяФайла)    Тогда
                ОбходСтроки = ДиалогВыбораФайлаОбъект.ПолноеИмяФайла;
                ИскомыйНомер = 0;
                НомерСимвола = 0;
                Пока СтрДлина(ОбходСтроки)>0 Цикл
                    НомерСимвола = НомерСимвола+1;
                    ИскомыйСимвол = Прав(ОбходСтроки,1);
                    Если ИскомыйСимвол = "\" Тогда
                        ИскомыйНомер = НомерСимвола-1;
                        Прервать;
                    Иначе
                        ОбходСтроки = Лев(ДиалогВыбораФайлаОбъект.ПолноеИмяФайла,СтрДлина(Обходстроки)-1);    
                    КонецЕсли;                    
                КонецЦикла;
                ИмяФайла = Прав(ДиалогВыбораФайлаОбъект.ПолноеИмяФайла,ИскомыйНомер);
            КонецЕсли;
            //Фотография = Новый ХранилищеЗначения(КартинкаОбъект.ПолучитьДвоичныеДанные());
            НовыйЭлемент = Картинки.Добавить();
            НовыйЭлемент.Название = ИмяФайла;
            НовыйЭлемент.ДанныеКартинки = Новый ХранилищеЗначения(КартинкаОбъект.ПолучитьДвоичныеДанные());
4 DenisVich
 
30.11.17
13:20
Если сделать так то картинка отображается.
"ЭлементыФормы.ПолеКартинкиФотография.Картинка = КартинкаОбъект";
5 Fish
 
30.11.17
13:21
А переменной мТекущееОсновноеИзображение где значение присваивается?
6 DenisVich
 
30.11.17
13:21
Во время добавления в табличну часть. А не по активизации строки в записанном элементе.
7 DenisVich
 
30.11.17
13:21
Все отображается. (6)
8 Fish
 
30.11.17
13:24
(4)(6) Ну так КартинкаОбъект у тебя имеет тип Картинка. А значение переменной мТекущееОсновноеИзображение из (0), похоже иного типа.
9 DenisVich
 
30.11.17
13:25
В модуле форму ниже всех процедур:
"мПустаяКартинка = Новый Картинка;
мТекущееОсновноеИзображение = Новый Картинка; "
Пустая картинка работает.
10 DenisVich
 
30.11.17
13:28
Тогда как получить из хранилища картинку.
Элементы.ДанныеКартинки.Получить()?
"Процедура ПоказатьОсновноеИзображение(АктивнаяСтрока)

            ЗаписаннаяЗадача = Задачи.ТекущиеЗадания.НайтиПоНомеру(Номер);
            Для Каждого Элементы Из ЗаписаннаяЗадача.Картинки Цикл
                Если Не ЗначениеЗаполнено(Элементы.НомерСтроки) Тогда
                    Возврат;
                КонецЕсли;
                Если Элементы.НомерСтроки = АктивнаяСтрока Тогда
                    мТекущееОсновноеИзображение  = Элементы.ДанныеКартинки.Получить();
                КонецЕсли;
            КонецЦикла;
            
            Если мТекущееОсновноеИзображение = Неопределено Тогда
                ЭлементыФормы.ПолеКартинкиФотография.Картинка = мПустаяКартинка;
            Иначе
                ЭлементыФормы.ПолеКартинкиФотография.Картинка = мТекущееОсновноеИзображение;
            КонецЕсли;                
                
КонецПроцедуры
"
11 Fish
 
30.11.17
13:28
(9) А почему она не должна работать?
12 DenisVich
 
30.11.17
13:29
После того как обращаешься к Элементы.ДанныеКартинки.есть только Получить(). Обратиться нельзя по другому.
13 DenisVich
 
30.11.17
13:31
Не пойму почему несоотвествие типов.
14 Fish
 
30.11.17
13:31
(12) У тебя в хранилище значений лежат двоичные данные. Это ещё не картинка. Используй:
Картинка (Picture)
Формирование из двоичных данных
Синтаксис:

Новый Картинка(<ДвоичныеДанные>, <ПрозрачныйФон>)
Параметры:

<ДвоичныеДанные> (обязательный)

Тип: ДвоичныеДанные.
Двоичные данные изображения, из которого будет сформирован объект Картинка.
<ПрозрачныйФон> (необязательный)

Тип: Булево.
Определяет, будет ли использован цвет прозрачности при создании картинки.
Используется только для картинок, формат которой не поддерживает прозрачности.
За цвет прозрачности принимается цвет последнего пикселя (правый - нижний).
Значение по умолчанию: Ложь.
Описание:

Создает картинку из двоичных данных.
В режиме запуска "Веб-клиент" конструктор не используется.
15 Fish
 
30.11.17
13:32
(13) Посмотри в отладчике, там увидишь тип, и всё поймёшь.
16 DenisVich
 
30.11.17
13:35
Поменял на: мТекущееОсновноеИзображение  = Новый Картинка(Элементы.ДанныеКартинки.Получить());
(15) Спасибо.
17 Fish
 
30.11.17
13:39
(16) Только вот зачем ты преобразовывал картинку в двоичные данные?
Вроде ХЗ позволяет напрямую с картинкой работать:
ХранилищеЗначения (ValueStorage)
Методы:

Получить (Get)

Конструкторы:

На основании значения

Описание:

Предназначен для хранения значения в специальном формате. Он может быть записан в поля базы данных, имеющие соответствующий тип. Это позволяет сохранять в базе данных значения, тип которых не может быть выбран в качестве типа поля, например, Картинка.

Пример:

МояКартинка = Новый Картинка("C:\Мои документы\Картинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);

НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();