HelpF.pro

Пример хранения изображений в базе (отдельный справочник), в интерфейсе Такси и без модальности

Часто разрабатывая некую конфигурацию, пользователи хотят прикреплять к элементу справочника фото и чтобы они хранились в базе данных.

В этой статье я расскажу как к справочнику объекты строительства подключить хранилище фотографий в виде справочника Хранилище файлов.

Основные элементы конфигурации с которыми нам работать:

1. Справочник Объекты строительства - основной справочник в котором хранится инфо и к каждому элементу нужно подгружать фото

2. Справочник Хранилище Фалов, он подчинен справочнику Объекты строительства и в нем есть реквизит ДанныеХЗ - хранилище значений в котором мы будем хранить фото

Форма элемента Объекты строительства, добавим кнопку загрузить фото для списка Файлы (динамический список, в котором запросом отбирается по владельцу приложенные файлы)

Код команды Добавить Файлы (Код для отключенного режима модальности):

Код 1C v 8.3
 &НаКлиенте
Процедура ДобавитьФайлы()
//ПРОВЕРИМ - текущий элемент записан или нет
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда // Записан
Оповещение  =  Новый ОписаниеОповещения("ОбработатьВыборФайла",   ЭтотОбъект);
НачатьПомещениеФайла(Оповещение,   ,   ,   Истина,   УникальныйИдентификатор);
Иначе // НЕ записан, нужно спросить пользователя
Оповещение = Новый ОписаниеОповещения("ОтветНаВопросЗаписать", ЭтотОбъект);
ТекстВопроса = "Элемент не записан, Записать?";
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецЕсли;  
КонецПроцедуры

//вопрос пользователю
&НаКлиенте 
Процедура ОтветНаВопросЗаписать(Результат, ДополнительныеПараметры) Экспорт 
// Вопрос пользователю, если ДА, то записываем объект и снова вызываем добавить файлы
Если Результат = КодВозвратаДиалога.Да Тогда
ЭтотОбъект.Записать();
ДобавитьФайлы();
КонецЕсли;
КонецПроцедуры 

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

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

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

Добавим для списка файлы Событие ФайлыПриАктивизацииСтроки

Код 1C v 8.3
 &НаКлиенте
Процедура ФайлыПриАктивизацииСтроки(Элемент)
Попытка
ТекКартинка = ФайлыПриАктивизацииСтрокиНаСервере(Элемент.ТекущиеДанные.Ссылка); 
Исключение
//видимо нет еще фото
КонецПопытки;
КонецПроцедуры


&НаСервереБезКонтекста
Функция ФайлыПриАктивизацииСтрокиНаСервере(ЭлементС)
Возврат ПолучитьНавигационнуюСсылку(ЭлементС, "ДанныеХЗ");
КонецФункции

+ чуть не забыл, т.к. файлы это динамический список с установленным запросом и параметром - необходимо при открытии задать параметр:

Установим параметр при открытии:

Код 1C v 8.3
 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Файлы.Параметры.УстановитьЗначениеПараметра("Владелец",Объект.Ссылка);
КонецПроцедуры

Результат:


Скачать DT с примером : Foto_V_BD.7z 


Если у Вас есть вопросы или комментарии - пишите ниже, обсудим )
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq83/view/1661.html