Версия для печати темы (https://pro1c.org.ua/index.php?s=5b5e4c46f4e2ee6b465d5943896d3348&showtopic=32378)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Вывод картинки товара в поле картинки

Автор: vlad_ 11.10.16, 13:25

В справочнике есть табличная часть "товары".. в ней реквизит номенклатура. кроме того в таб части реквизит "ХранилищеИзображения" с типом ХранилищеЗначения.. Ещё на форме поле "АдресКартинки" с типом поле картинки и кнопка "Добавить изображение".. При нажатии на кнопку для активной строки номенклатуры должна происходить загрузка картинки. при активизации любой строки из ТЧ картинка должна выводиться в поле "АдресКартинки".. у меня загружается но при смене строки пропадает с поля.. в чём ошибка??? помогите пожалуйста..


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

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


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

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

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

Автор: vlad_ 11.10.16, 16:51

вот скрин формы




Автор: TipsyKID 11.10.16, 18:12

Добавьте на форму (в табличную часть) реквизит формы "АдресКартинки".
Обратите внимание на процедуры "ПередЗаписью" и "ПередЗаписьюНаСервере".

Главная идея: не ганяем при каждом клике по строке клиента на сервер, а изначально ссылки на временные адреса храним у клиента, и только в момент записи передаем эти адреса на сервер и записываем их + при открытии апдейтим их.

Код не идеален, просто, за 15 минут, что успел -написал.

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

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

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

//Отображение картинки при переходе по строкам
//
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
    
    ТекСтрока = Элемент.ТекущиеДанные;
    Если ТекСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    АдресКартинки = ТекСтрока.АдресКартинки;
    
КонецПроцедуры

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

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    инд = 1;
    Для Каждого СтрокаТовары Из Объект.Товары Цикл
        ПараметрыЗаписи.Вставить("СтрокаТовары" + Формат(инд,"ЧГ=0"),СтрокаТовары.АдресКартинки);  
        инд = инд + 1;
    КонецЦикла;
КонецПроцедуры

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


Автор: vlad_ 12.10.16, 11:23

TipsyKID @ Вчера, 19:12 * ,

Большое спасибо!!!!!! Выручили сильно!!!!!!


vlad_ @ Сегодня, 11:43 * ,
немного модернизировал код.. процедура Перед записью не нужна, так как с серверной процедуры это доступно..

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua