HelpF.pro

Загрузка картинок в базу 1С (сохранение в хранилище значений)

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

Bell в управляемом интерфейсе пробует сохранить выбранные картинки в базу 1С, но возникли сложности с сохранением в хранилище значений. как пример Bell приложил CF файл с мини конфигурацией, за что ему большое спасибо, т.к. большая часть материалов этой статьи написана им, я лишь поправил небольшие участки кода связанные с передачей файлов и сохранение в хранилище значений.


Так как везде уже Такси, то CF я перевел в этот режим и в нем демонстрирую.

Имеется справочник Хранилище данных:

Основная Форма Элемента:

Ее код:

Код 1C v 8.3
 // ПРОЦЕДУРЫ ФОРМЫ
//======================================================================================================
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Объект.Ссылка.Пустая() Тогда
Объект.Наименование = ".";
КонецЕсли;

Если НЕ Параметры.Ключ.Пустая() Тогда
  ДанныеАдрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеХЗ");
КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)

Если Объект.Ссылка.Пустая() Тогда
КонецЕсли;


КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

Если ЭтоАдресВременногоХранилища(ДанныеАдрес) Тогда

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

КонецЕсли;

КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

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


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


// ПРОЦЕДУРЫ ЭЛЕМЕНТОВ ФОРМЫ
//======================================================================================================


&НаКлиенте
Процедура ВыбратьДанные(Команда)

ДанныеВыбрать();


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


&НаКлиенте
Процедура СохранитьДанные(Команда)
 
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
Предупреждение(НСтр("ru = 'Элемент не записан !!!'"));
Возврат;
КонецЕсли;

ДанныеСохранения = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеХЗ");
ИмяСохранения    = Объект.Наименование; 
//ИмяСохранения    = Объект.Наименование + Объект.ДанныеРасширение; 
    ПолучитьФайл(ДанныеСохранения, ИмяСохранения, Истина);

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


// ПРОЦЕДУРЫ ПРОЧИЕ
//======================================================================================================


&НаКлиенте
Процедура ДанныеВыбрать()

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

ДанныеАдрес = ПолученныеДанныеАдрес;

ВыбранныйФайл = Новый Файл(Объект.ДанныеПуть);
Объект.Наименование          =  ВыбранныйФайл.Имя;
Объект.ДанныеТекущаяДата     =  ТекущаяДата();

Модифицированность = Истина;
КонецЕсли;
 
КонецПроцедуры

так же имеется общая форма ФормаЗагрузкиФайлов

При помощи ее выбираются файлы изображений и загружаются в справочник - одновременно можно загружать несколько файлов

код формы:

Код 1C v 8.3
 // ПРОЦЕДУРЫ ЭЛЕМЕНТОВ ФОРМЫ
//======================================================================================================
&НаКлиенте
Процедура СписокФайловПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)

Отказ = Истина;

ДобавитьФайлы();


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

// ПРОЦЕДУРЫ ПРОЧИЕ
//======================================================================================================
&НаКлиенте
Процедура ДобавитьФайлы()

ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.МножественныйВыбор = Истина;
ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'", "ru");
ВыборФайла.Фильтр = НСтр("ru = 'Все файлы'", "ru") + " (*.*)|*.*";
ВыборФайла.ПредварительныйПросмотр = Истина;
Если ВыборФайла.Выбрать() Тогда

Для каждого СтрокаФайл Из ВыборФайла.ВыбранныеФайлы Цикл

ОписаниеФайла = Новый Файл(СтрокаФайл);

НВС = СписокФайлов.Добавить();
НВС.ПолноеИмяФайла   = СтрокаФайл; 
НВС.РазмерФайла      = ОписаниеФайла.Размер();

КонецЦикла;

КонецЕсли;

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

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

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

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

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

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

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

Иначе

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

КонецЕсли;


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


КонецПроцедуры
&НаСервере
Функция ПоместитьВыбранныеФайлыВХранилище(ПомещаемыеФайлы)

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


в коде вызывается ОповеститьОВыборе(ПомещенныеФайлы) и срабатывает обработчик в ФормаСпискаДополнительно

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

Если ИсточникВыбора.ИмяФормы = "ОбщаяФорма.ФормаЗагрузкиФайлов" Тогда
ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение);
КонецЕсли;

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

и следующим кодом идет создание элементов справочника и загрузка изображений из временного хранилища

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

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

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

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

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


Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq82/view/1562.html