helpf.pro
Регистрация

v8: Получение данных из ХралищаЗначений

Bell
14.07.2014 17:53Прочитано: 5355

Здравствйте,
Форма Списка справочинка.

Данные в хранилще есть. В элемент они попадают, но при открытии элемента картикнка не видна, что сделал не так.

ДанныеХЗ (ХранилищеЗначений)

ДанныеАдрес (Строка) Реквизит элемента спр.

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

// ??? ХранимыйФайл.ДанныеХЗ = Новый ХранилищеЗначения(СтрокаФайл.Значение.Хранение, Новый СжатиеДанных()); ХранимыйФайл.Записать(); КонецЦикла; Элементы.Список.Обновить(); КонецПроцедуры

Yandex
Возможно, вас также заинтересует
Реклама на портале
Bell
14.07.2014 17:57Ответ № 1
Код 1C v 8.3
 &НаСервереПроцедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение)		ТаблицаФайлов = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресХЗ);		Для Каждого СтрокаФайл Из ТаблицаФайлов Цикл				Файл = Новый Файл(СтрокаФайл.Значение.Имя);		ХранимыйФайл = Справочники.ХранилищеДанныхСправочники.СоздатьЭлемент();		ХранимыйФайл.СсылкаНаОбъект                    = СсылкаНаОбъект;		ХранимыйФайл.Наименование                      = Файл.Имя;		ХранимыйФайл.ДанныеПуть                        = Файл.Путь;		ХранимыйФайл.ДанныеТекущаяДата                 = ТекущаяДата();				ХранимыйФайл.ДанныеХЗ = Новый ХранилищеЗначения(СтрокаФайл.Значение.Хранение, Новый СжатиеДанных());  		ХранимыйФайл.Записать();			КонецЦикла;		Элементы.Список.Обновить();	КонецПроцедуры   
E_Migachev
15.07.2014 00:58Ответ № 2

Как-то у тебя сложно или я чего-то не понял, вообщем так:

Добавление картинки

Код 1C v 8.2 УП
 &НаКлиенте
Процедура ДобавитьКартинку(Команда)
ИмяФайла = "";
ПутьФайла = "";
//Вызываем Диалоговое окно и помещаем файл Картинки из локальной файловой системы во временное хранилище
Если ПоместитьФайл(ПутьФайла, , ИмяФайла, Истина) = Истина Тогда
 
//в строковый реквизит ФОТО нашей формы сохраняем ссылку на Картинку во временном хранилище
Фото = ПутьФайла;
//для создания нового элемента в Справочнике Файлы и записи Картинки в его реквизит Файл
//переходим на сервер с помощью вызова серверной процедуры
УстановитьКартинку();
КонецЕсли; 
//условие ЕСЛИ нужно для того, чтобы если пользователь отказался от выбора файла
//мы не вызывали серверную процедуру УстановитьКартинку()
КонецПроцедуры

Действия по установке (загрузке) картинки и ее отображения на форме нашего справочника Сотрудника необходимо выполнять на стороне сервера. Это особенность работы системы с файлами. Именно для этого в тексте процедуры ДобавитьКартинку осуществляется вызов другой процедуры УстановитьКартинку(), которая будет выполняться на сервере.

В программном модуле, ниже процедуры ДобавитьКартинку(Команда) пишем следующий программный код:

Код 1C v 8.2 УП
 &НаСервере
Процедура УстановитьКартинку()
//создаем новый элемент в Справочнике Файлы
НовыйФайлКартинки = Справочники.Файлы.СоздатьЭлемент();
//в реквизит СправочникаФайлы Файл помещаем выбранную ранее Картинку
НовыйФайлКартинки.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Фото));
Фото = ПоместитьВоВременноеХранилище(НовыйФайлКартинки.Файл.Получить());
//записываем новый элемент справочника Файлы
НовыйФайлКартинки.Записать();
//устанавливаем значение реквизита Картинка Справочника Сотрудники
Объект.Картинка = НовыйФайлКартинки.Ссылка;
КонецПроцедуры

Чтобы при открытии картинка отобразилась:

Код 1C v 8.2 УП
 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//отображение картинки при открытии формы справочника
Фото = ПолучитьНавигационнуюСсылку(Объект.Картинка, "Файл");
//устанавливаем автомасштаб для картинки
Элементы.Фото.РазмерКартинки = РазмерКартинки.АвтоРазмер;
КонецПроцедуры
Bell
15.07.2014 10:13Ответ № 3

1) я в ообщей форме помещаю данные в ХранилищеЗначений. (данные заполнены)

2) При нажатии кпонки на общей форме создаются элементы справочника. Все данные из хранилища  заполняются в элементе спр, а вот с картикой проблема. Я сейчас еще разок книгу читану. Где то рядом брожу.(Процедура ОбработкаВыбора)

Bell
15.07.2014 10:19Ответ № 4

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

// ????????

      .ХранимыйФайл.ДанныеХЗ = Новый ХранилищеЗначения(СтрокаФайл.Значение.Хранение, Новый СжатиеДанных());

КонецЦикла;

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

Bell
15.07.2014 11:48Ответ № 5

Если написать (выбараю  2 картинки)

Сообщить(СтрокаФайл.Значение.Хранение);

Выводит 

"e1cib/tempstorage/07d3bf97-8ce4-4205-b9ac-bd9bc076e4b2"   Строка

"e1cib/tempstorage/07d3bf97-8ce4-4205-b9ac-bd9bc076e4b3"   Строка

Этот алгоритм не отрабатывает..

ХранимыйФайл.ДанныеХЗ = Новый ХранилищеЗначения(СтрокаФайл.Значение.Хранение, Новый СжатиеДанных());

E_Migachev
15.07.2014 14:09Ответ № 6

у тебя обычные формы что ли? то вот https://help1c.com/faq/view/391.html

Bell
16.07.2014 12:19Ответ № 7

Да нет управляемая.

Для того что бы избавиться от модальности я решил передавать данные через хранилище.

Вот алгорит выгрузки из общей формы

Bell
16.07.2014 12:20Ответ № 8
Код 1C v 8.х
 &НаКлиентеПроцедура Загрузить()		Если НЕ ПроверитьЗаполнение() Тогда		Возврат;	КонецЕсли;		ОчиститьСообщения();	Если СписокФайлов.Количество() = 0 Тогда		ТекстСообщения = НСтр("ru='Файлы не выбраны !!!'");		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);		Возврат;	КонецЕсли;		ПомещаемыеФайлы = Новый Массив;	Для каждого СтрокаФайл Из СписокФайлов Цикл		Описание = Новый ОписаниеПередаваемогоФайла(СтрокаФайл.ПолноеИмяФайла, "");		ПомещаемыеФайлы.Добавить(Описание);	КонецЦикла;		// -------------------------------------------------------------------------------	ПомещенныеФайлы         = Новый Массив;	СписокЗагруженныхФайлов = Новый СписокЗначений;		Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда				Для каждого Файл Из ПомещенныеФайлы Цикл			СписокЗагруженныхФайлов.Добавить(Файл);		КонецЦикла;				Закрыть(Истина);			Иначе				Сообщение = Новый СообщениеПользователю();		Сообщение.Текст = НСтр("ru = 'Файлы не загружены'", "ru");		Сообщение.Сообщить();			КонецЕсли;		// РАНЬШЕ БЫЛО БЕЗ ЭТОГО Все работает	// Через хранилище --------------------------------------------------------------------------	// Что бы не было модальных окон		//АдресХЗ = ПоместитьВыбранныеФайлыВХранилище(ПомещаемыеФайлы); // Не передает свойства файла	АдресХЗ = ПоместитьВыбранныеФайлыВХранилище(СписокЗагруженныхФайлов);	Структура = Новый Структура;	Структура.Вставить("АдресХЗ",АдресХЗ);	ОповеститьОВыборе(Структура);	КонецПроцедуры   
DJ_Serega
16.07.2014 12:22Ответ № 9

блин... да что с синтаксисом ;( капец какой-то

Bell
16.07.2014 12:22Ответ № 10
Код 1C v 8.2 УП
 &НаКлиентеПроцедура Загрузить()		Если НЕ ПроверитьЗаполнение() Тогда		Возврат;	КонецЕсли;		ОчиститьСообщения();	Если СписокФайлов.Количество() = 0 Тогда		ТекстСообщения = НСтр("ru='Файлы не выбраны !!!'");		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);		Возврат;	КонецЕсли;		ПомещаемыеФайлы = Новый Массив;	Для каждого СтрокаФайл Из СписокФайлов Цикл		Описание = Новый ОписаниеПередаваемогоФайла(СтрокаФайл.ПолноеИмяФайла, "");		ПомещаемыеФайлы.Добавить(Описание);	КонецЦикла;		// -------------------------------------------------------------------------------	ПомещенныеФайлы         = Новый Массив;	СписокЗагруженныхФайлов = Новый СписокЗначений;		Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда				Для каждого Файл Из ПомещенныеФайлы Цикл			СписокЗагруженныхФайлов.Добавить(Файл);		КонецЦикла;				Закрыть(Истина);			Иначе				Сообщение = Новый СообщениеПользователю();		Сообщение.Текст = НСтр("ru = 'Файлы не загружены'", "ru");		Сообщение.Сообщить();			КонецЕсли;		// РАНЬШЕ БЫЛО БЕЗ ЭТОГО Все работает	// Через хранилище --------------------------------------------------------------------------	// Что бы не было модальных окон		//АдресХЗ = ПоместитьВыбранныеФайлыВХранилище(ПомещаемыеФайлы); // Не передает свойства файла	АдресХЗ = ПоместитьВыбранныеФайлыВХранилище(СписокЗагруженныхФайлов);	Структура = Новый Структура;	Структура.Вставить("АдресХЗ",АдресХЗ);	ОповеститьОВыборе(Структура);	КонецПроцедуры   
DJ_Serega
16.07.2014 12:22Ответ № 11

E_Migachev, объясни как нужно вставлять ) наверно с видео )

Bell
16.07.2014 12:29Ответ № 12

E_Migachev
16.07.2014 12:48Ответ № 13

(12) да, напишу вечерком

для bell:

в управляемых формах принцип следующий:

Простой пример справочника с картинкой

Отображения картинки текущего элемента списка

В новой версии платформы 1С 8.2 работа с картинками производится отличным от предыдущих платформ методом, разобраться с которым без примеров сложно. Подробно можно прочитать в книге Разработка управляемого интерфейса глава 3.18. Работа с файлами и картинками. Примеры данной статья являются переработанными и дополненными примерами книги.

Картинка как и раньше (8.1) хранится в базе в реквизите (реквизите ТЧ) с типом ХранилищеЗначения, но записать данные в реквизит с этим типом обычном способом нельзя, запись производится в предопределенной процедуре «ПередЗаписьюНаСервере».

Для отображения картинки создается элемент формы поле картинки, данными для которого, является реквизит формы (с типом Строка(0)), содержащий навигационную ссылку на картинку (можно получить функцией «ПолучитьНавигационнуюСсылку») или адрес во временном хранилище (пол.ф. «ПоместитьФайл»)

Ниже приведен код части примера:

Код 1C v 8.2 УП
 &НаКлиенте

Процедура ЗагрузитьФотографию(Команда)
Перем ВыбранноеИмя,АдресВременногоХранилища;
Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина, УникальныйИдентификатор) Тогда
АдресКартинки = АдресВременногоХранилища;
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры

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

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

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

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

В книге Разработка управляемого интерфейса используется дополнительно поле для сохранения имени файла оно необходимо если нужно чтобы программа запомнила из какой папки пользователь предпочитает добавлять или выгружать файлы.

В процедуре ПриЗаписиНаСервере на первый взгляд можно убрать код удаление из временного хранилища т.к. ф. ПоместитьФайл вызывается с параметром УникальныйИдентификатор формы т.е. объект хранилища будет существовать до закрытия формы, но рекумендуется освобождать ресурсы сразу (если пользователь загрузит картинку и нажмет записать, форма не закрыта и объект будет существовать до закрытия).

Bell
22.07.2014 13:54Ответ № 14

СФ файл

E_Migachev
23.07.2014 01:41Ответ № 15

скачал, посмотрю

E_Migachev
24.07.2014 00:22Ответ № 16

Пока разбирался - написал по твоему CF статейку: https://help1c.com/faq/view/1562.html


Что изменил:

В общей форме

Код 1C v 8.3
 &НаКлиенте
Процедура Загрузить()

Если НЕ ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;

ОчиститьСообщения();
Если СписокФайлов.Количество() = 0 Тогда
Сообщить("Файлы не выбраны !!!'");
Возврат;
КонецЕсли;

ПомещаемыеФайлы = Новый Массив;
Для каждого СтрокаФайл Из СписокФайлов Цикл
Описание = Новый ОписаниеПередаваемогоФайла(СтрокаФайл.ПолноеИмяФайла, "");
ПомещаемыеФайлы.Добавить(Описание);
КонецЦикла;

// -------------------------------------------------------------------------------
ПомещенныеФайлы         = Новый Массив;
СписокЗагруженныхФайлов = Новый СписокЗначений;

Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор) Тогда

Закрыть(Истина);

Иначе

Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Файлы не загружены'", "ru");
Сообщение.Сообщить();

КонецЕсли;

ОповеститьОВыборе(ПомещенныеФайлы);

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

и в доп форме:

Код 1C v 8.3
  &НаСервере
Процедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение)

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

Элементы.Список.Обновить();

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

результат в DT

Скачать DT - Платформа 8.3.4

DJ_Serega
24.07.2014 10:38Ответ № 17

(16) только по ссылке 404 ;)

Bell
24.07.2014 10:54Ответ № 18

СПАСИБО. Не обратил внимания на то что ПоместитьФайлы помещает во временное хранилище

E_Migachev
24.07.2014 11:22Ответ № 19

(17) охх )  не правильно вставил ссылку, поздно уже было ) вот Загрузка картинок в базу 1С (сохранение в хранилище значений)

и статья П. Чистова на эту тему Работа с изображениями (картинками) в интерфейсе Такси

DJ_Serega
24.07.2014 12:49Ответ № 20

(19) аналогично =)

Подсказка: Вы можете приложить к ответу файл или изображение щелкнув по значку или в редакторе.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.