Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема отображения картинки на управляемой форме справочника 1С 8.2.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
Vemerton
Добрый день,
Уже второй день не могу решить вопрос с отображением картинки на управляемой форме элемента справочника.
Проблема заключается в том, что картинке отображается на форме только в текущем сеансе.
Если выйти из приложения и зайти, то форме справочника в реквизите (Рисунок - тип строка) данные есть, но отображения на форме нет.

Большая просьба помочь, а то уже руки опускаются.

Вот мой пример как я работаю с картинкой в справочнике:

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


Это первая задача, затем нужно из этого справочника отображать картинку в табличной части документа.
Значение подставляется но отображения даже в первом сеансе в таличной части нет.

Пример кода для табличной части:
    
&НаКлиенте
Процедура СтрокиПриАктивизацииСтроки(Элемент)
    Данные = Элементы.Строки.ТекущиеДанные;
    Картинка = ПолучитьКартинку();
    Данные.Файл = Картинка;
КонецПроцедуры



&НаСервере
Функция ПолучитьКартинку()
   ЭлСпрКартинки = Справочники.Картинки.НайтиПоНаименованию("Excel");
   Картинка=ПолучитьНавигационнуюСсылку(ЭлСпрКартинки, "Рисунок");;
   Возврат  Картинка
КонецФункции
logist
Цитата(Vemerton @ 13.11.13, 10:41) необходимо зарегистрироваться для просмотра ссылки
Проблема заключается в том, что картинке отображается на форме только в текущем сеансе.

Этот код не наталкивает на мысли почему не сохраняется?
Цитата(Vemerton @ 13.11.13, 10:41) необходимо зарегистрироваться для просмотра ссылки
      АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Картинка,Объект.Ссылка.УникальныйИдентификатор());
        Объект.Рисунок = АдресВоВременномХранилище;

Если нет - подсказываю - Хранилище ВРЕМЕННОЕ.

Объект.Рисунок у вас должно быть типа ХранилищеЗначения
Vemerton
Правильно ли я понял, что нужно изменить эти строки:
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Картинка,Объект.Ссылка.УникальныйИдентификатор());
        Объект.Рисунок = АдресВоВременномХранилище;


Но что мне использовать для хранилища, реквизит справочника с типом хранилище?
logist
Цитата(Vemerton @ 13.11.13, 11:51) необходимо зарегистрироваться для просмотра ссылки
Правильно ли я понял, что нужно изменить эти строки:

Не только эти. Все которые работают с рисунком на этапе открытия формы, и т.д.

Цитата(Vemerton @ 13.11.13, 11:51) необходимо зарегистрироваться для просмотра ссылки
Но что мне использовать для хранилища, реквизит справочника с типом хранилище?

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


Не понимаю как я могу записать значиние в реквизит с типом значение.
И как потом это значение получить и вывести в поле рисунок с типом строка?
logist
Вот вам код, ДЛЯ ПРИМЕРА(!), тупо передирать не стоит, проанализируйте и сделайте свое.

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

&НаСервере
Процедура СоздатьХранилищеКартинки(ФайлКартинки)
    СправочникФайл = Справочники.ФайлыКартинокБлюд.СоздатьЭлемент();
    Картинка = Новый Картинка(ФайлКартинки);
    СправочникФайл.ФайлКартинки = Новый ХранилищеЗначения(Картинка);
    СправочникФайл.Владелец = Объект.Ссылка;
    СправочникФайл.Наименование = Объект.Наименование + ". Загружена: " + Формат(ТекущаяДата(),"ДЛФ=DT");
    СправочникФайл.Записать();
    Объект.ФайлКартинкиБлюда = СправочникФайл.Ссылка;
    Записать();
    ОбновитьКартинкуСервер();
КонецПроцедуры    

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ОбновитьКартинкуСервер();
КонецПроцедуры
Vemerton
Спасибо большое, только сейчас добрался до рабочего места.
Сейчас буду пробовать.
Vemerton
запутался в некоторых местах, просьба помочь:
/Процедура СоздатьХранилищеКартинки(ФайлКартинки)
//    СправочникФайл = Справочники.ФайлыКартинокБлюд.СоздатьЭлемент();
//    Картинка = Новый Картинка(ФайлКартинки);
//    СправочникФайл.ФайлКартинки = Новый ХранилищеЗначения(Картинка);

СправочникФайл.ФайлКартинки - это реквизит с типом значения хранилище?

    СправочникФайл.Владелец = Объект.Ссылка;

- Не понял что означает эта строка? Это некий идентификатор?

    СправочникФайл.Наименование = Объект.Наименование + ". Загружена: " + Формат(ТекущаяДата(),"ДЛФ=DT");
    СправочникФайл.Записать();
    Объект.ФайлКартинкиБлюда = СправочникФайл.Ссылка;

- Объект.ФайлКартинкиБлюда - это реквизит с типом строка? - не понятно зачем записывать ссылку текущего элмента в поле строки текущего элемента
    Записать();
    ОбновитьКартинкуСервер();
КонецПроцедуры


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

Не пойму что это за поле "КартинкаБлюда"- ? ведь поле для картинки это Объект.ФайлКартинкиБлюда
КонецЕсли;
КонецПроцедуры


Заранее спасибо.
logist
Цитата(Vemerton @ 13.11.13, 15:47) необходимо зарегистрироваться для просмотра ссылки
СправочникФайл.ФайлКартинки - это реквизит с типом значения хранилище?

В моем коде картинка хранится в отдельном справочнике (подчиненном), да у реквизита тип ХранилищеЗначения

Цитата(Vemerton @ 13.11.13, 15:47) необходимо зарегистрироваться для просмотра ссылки
Не понял что означает эта строка? Это некий идентификатор?

Я вам скопировал свой код, у вас он будет такой какой зависит от ваших задач, у меня в наименование формируется некая строка, и записывается справочник Владелец после записи подчиненного справочника.

Цитата(Vemerton @ 13.11.13, 15:47) необходимо зарегистрироваться для просмотра ссылки
Объект.ФайлКартинкиБлюда - это реквизит с типом строка? - не понятно зачем записывать ссылку текущего элмента в поле строки текущего элемента

У меня это реквизит ссылка на подчиненный справочник в котором хранится картинка.

Цитата(Vemerton @ 13.11.13, 15:47) необходимо зарегистрироваться для просмотра ссылки
Не пойму что это за поле "КартинкаБлюда"- ? ведь поле для картинки это Объект.ФайлКартинкиБлюда

Это поле формы, в него передается строка - навигационная ссылка на объект картинки который хранится в подчиненном справочнике.
Vemerton
Вроде понячял, что это два справочника:
- ФайлыКартинокБлюд
- Блюда

Соотвественно для спр. ФайлыКартинокБлюд есть реквизиты:
-ФайлКартинки;
-Владелец;
-Наименование;

А для справочника Блюда есть ревизиты:
- ФайлКартинкиБлюда;
- КартинкаБлюда;

связаны эти справочники через поле Владелец.

Впросос по типам значений в ревизитах:
Спр. ФайлыКартинокБлюд.ФайлКартинки;
Спр.Блюда.КартинкаБлюда

Для двух реквизитов - это строка?

Хм. не понимаю почему у меня ругается когда я хочу записать следующее:

{Справочник.Картинки.Форма.ФормаЭлемента.Форма(30)}: Поле объекта не обнаружено (Файл)
Объект.Файл = Новый ХранилищеЗначения(Картинка);
Где Обьект - это текущий справчник где нужно хранить картинки
а поле Файл с типом ХранилищеЗначения
logist
Цитата(Vemerton @ 13.11.13, 16:14) необходимо зарегистрироваться для просмотра ссылки
А для справочника Блюда есть ревизиты:
- ФайлКартинкиБлюда;
- КартинкаБлюда;

Нет. КартинкаБлюда это реквизиты формы, а ФайлКартинкиБлюда это реквизит объекта.

Цитата(Vemerton @ 13.11.13, 16:14) необходимо зарегистрироваться для просмотра ссылки
Впросос по типам значений в ревизитах:
Спр. ФайлыКартинокБлюд.ФайлКартинки;

Уже в который раз повторяю - ХранилищеЗначения

Цитата(Vemerton @ 13.11.13, 16:14) необходимо зарегистрироваться для просмотра ссылки
Спр.Блюда.КартинкаБлюда

Нет такого реквизита в объекте. Это РЕКВИЗИТ ФОРМЫ!!!

Цитата(Vemerton @ 13.11.13, 16:17) необходимо зарегистрироваться для просмотра ссылки
{Справочник.Картинки.Форма.ФормаЭлемента.Форма(30)}: Поле объекта не обнаружено (Файл)

Вы не сможете работать с реквизитом типа ХранилищеЗначение этого объекта из его же формы. Поэтому в моем варианте используется отдельный справочник.
Vemerton
Спасибо, что помогаете!

Хм. не понимаю почему у меня ругается, когда я хочу записать следующее:

{Справочник.Картинки.Форма.ФормаЭлемента.Форма(30)}: Поле объекта не обнаружено (Файл)
Объект.Файл = Новый ХранилищеЗначения(Картинка);
Где Обьект - это текущий справчник где нужно хранить картинки
а поле Файл с типом ХранилищеЗначения

Что бы не создавать еще один справочник для файлов, где я смогу записать данные в реквизит с типом хранилище значения?
Может в модуле объекта?

Что бы не создавать еще один справочник для файлов, где я смогу записать данные в реквизит с типом хранилище значения?
Может в модуле объекта?
logist
Цитата(Vemerton @ 13.11.13, 16:37) необходимо зарегистрироваться для просмотра ссылки
м. не понимаю почему у меня ругается, когда я хочу записать следующее:

{Справочник.Картинки.Форма.ФормаЭлемента.Форма(30)}: Поле объекта не обнаружено (Файл)
Объект.Файл = Новый ХранилищеЗначения(Картинка);
Где Обьект - это текущий справчник где нужно хранить картинки
а поле Файл с типом ХранилищеЗначения

Еще раз:
Цитата(logist @ 13.11.13, 16:20) необходимо зарегистрироваться для просмотра ссылки
Вы не сможете работать с реквизитом типа ХранилищеЗначение этого объекта из его же формы. Поэтому в моем варианте используется отдельный справочник.

Vemerton
Что бы не создавать еще один справочник для файлов, где я смогу записать данные в реквизит с типом хранилище значения?
Может в модуле объекта?
logist
Цитата(Vemerton @ 13.11.13, 16:45) необходимо зарегистрироваться для просмотра ссылки
Может в модуле объекта?

Может и там. Попробуйте из формы сохранять куда-то картинку (во временное хранилище), как-то в модуль передать адрес хранилища, потом в ПередЗаписью получить оттуда картинку и записать в реквизит.
Vemerton
Окончательно запутался.
Пошел третий день.

Нашел в методичке по основным объектам пример работы с картинкой, переделал его под свою конфу.
Отладчиком смотрю реквизит с типом "Хранилище значения" заполняется.

Но картинка не отображается, может поскажете почему.
Или приведете другой рабочий пример, без создания файла.

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

&Наклиенте

Процедура  Команда1(Команда)
     Перем Имя,Адрес;
    
     Если
         ПоместитьФайл(Адрес,"",Имя,истина,ЭтаФорма.УникальныйИдентификатор) Тогда
         Объект.ИмяФайла = Имя;
         ПоместитьФайлОбъекта(Адрес);
     КонецЕсли;
    
    
КонецПроцедуры
logist
Цитата(Vemerton @ 13.11.13, 19:02) необходимо зарегистрироваться для просмотра ссылки
Но картинка не отображается, может поскажете почему.

Потому:
Цитата(Vemerton @ 13.11.13, 19:02) необходимо зарегистрироваться для просмотра ссылки
  УдалитьИзВременногоХранилища(Адрес);
  Рисунок = Адрес;
Vemerton
Т.е. я могу написать Руснок = Спр.Файл;
В реквизите значение то есть - верно?
logist
Цитата(Vemerton @ 14.11.13, 9:30) необходимо зарегистрироваться для просмотра ссылки
Т.е. я могу написать Руснок = Спр.Файл;
В реквизите значение то есть - верно?

Нет. Файл это ХранилищеЗначения. И открывайте уже синтаксис-помощник и смотрите где и какие методы и свойства доступны.
Vemerton
Открыл синтаксис метод получить().

ХранилищеЗначения.Получить (ValueStorage.Get)
ХранилищеЗначения (ValueStorage)
Получить (Get)
Синтаксис:

Получить()
Возвращаемое значение:

Тип: Произвольный.
Значение, содержащееся в хранилище.
Описание:

Получает из хранилища сохраненное в нем значение.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

МояКартинка = ХранилищеКартинки.Получить();

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

&Наклиенте

Процедура  Команда1(Команда)
     Перем Имя,Адрес;
    
     Если
         ПоместитьФайл(Адрес,"",Имя,истина,ЭтаФорма.УникальныйИдентификатор) Тогда
         Объект.ИмяФайла = Имя;
         ПоместитьФайлОбъекта(Адрес);
     КонецЕсли;
    
    
КонецПроцедуры


Все равно не работает(.
Видимо все-таки не судьба.
logist
Цитата(Vemerton @ 14.11.13, 10:58) необходимо зарегистрироваться для просмотра ссылки
Рисунок = Спр.Файл.Получить();

У вас здесь сама картинка получается, а не навигационная ссылка.
Vemerton
Чтобы перепроверить, я решил попробовать записать картинку к себе на жесткий диск и БД 1с- получилось.
Подумал, может из-за того что на сервере происходила запись в поле (тип строка) картинка, может ее нужно перечитать на форме из БД.
Сделал и это ошибки нет, и изображения тоже нет((((

Пример моего кода, может кто-то подскажет, в чем моя тупость.
 &НаСервере
Процедура ПоместитьФайлОбъекта(Адрес)
  спр = РеквизитФормыВЗначение("Объект");
  ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
  Спр.Файл = Новый ХранилищеЗначения(ДвоичныеДанные);
  УдалитьИзВременногоХранилища(Адрес);
  Рисунок = Спр.Файл.Получить();
  Спр.Записать();
  ИмяФайла = "D:\!_1C_Prog\Картинка2.bmp";
  Рисунок.Записать(ИмяФайла);

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

Процедура  Команда1(Команда)
     Перем Имя,Адрес;
    
     Если
         ПоместитьФайл(Адрес,"",Имя,истина,ЭтаФорма.УникальныйИдентификатор) Тогда
         Объект.ИмяФайла = Имя;
         ПоместитьФайлОбъекта(Адрес);
         Элементы.Рисунок.Обновить();
     КонецЕсли;
    
    
КонецПроцедуры





Спасибо logist
ПОЛУЧИЛОСЬ АЛИЛУЙЯ!

&НаСервере
Процедура ПоместитьФайлОбъекта(Адрес)
  спр = РеквизитФормыВЗначение("Объект");
  ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
  Спр.Файл = Новый ХранилищеЗначения(ДвоичныеДанные);
  УдалитьИзВременногоХранилища(Адрес);
  Картинка = Спр.Файл.Получить();
  Спр.Записать();
  ИмяФайла = "D:\!_1C_Prog\Картинка2.bmp";
  Картинка.Записать(ИмяФайла);
    
  ЗначениеВРеквизитФормы(спр,"Объект");
    
КонецПроцедуры
&Наклиенте

Процедура  Команда1(Команда)
     Перем Имя,Адрес;
    
     Если
         ПоместитьФайл(Адрес,"",Имя,истина,ЭтаФорма.УникальныйИдентификатор) Тогда
         Объект.ИмяФайла = Имя;
         ПоместитьФайлОбъекта(Адрес);
        
     КонецЕсли;
    

     АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Файл",);
     Объект.Рисунок=АдресКартинки;
КонецПроцедуры



Спасибо форуму, и человеку, который его создал.
Потому, что мне этот форум помог дважды, когда я уже не знал к кому обратиться.
logist
Vemerton, и вам спасибо, заходите еще smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.