Часто разрабатывая некую конфигурацию, пользователи хотят прикреплять к элементу справочника фото и чтобы они хранились в базе данных.
В этой статье я расскажу как к справочнику объекты строительства подключить хранилище фотографий в виде справочника Хранилище файлов.
Основные элементы конфигурации с которыми нам работать :
1. Справочник Объекты строительства - основной справочник в котором хранится инфо и к каждому элементу нужно подгружать фото
2. Справочник Хранилище Фалов, он подчинен справочнику Объекты строительства и в нем есть реквизит ДанныеХЗ - хранилище значений в котором мы будем хранить фото
Форма элемента Объекты строительства , добавим кнопку загрузить фото для списка Файлы (динамический список, в котором запросом отбирается по владельцу приложенные файлы)
Код команды Добавить Файлы (Код для отключенного режима модальности):
Код 1C v 8.3 &НаКлиенте
Процедура ДобавитьФайлы()
Если ЗначениеЗаполнено( Объект. Ссылка) Тогда
Оповещение = Новый ОписаниеОповещения( "ОбработатьВыборФайла" , ЭтотОбъект) ;
НачатьПомещениеФайла( Оповещение, , , Истина , УникальныйИдентификатор) ;
Иначе
Оповещение = Новый ОписаниеОповещения( "ОтветНаВопросЗаписать" , ЭтотОбъект) ;
ТекстВопроса = "Элемент не записан, Записать?" ;
ПоказатьВопрос( Оповещение, ТекстВопроса, РежимДиалогаВопрос. ДаНет) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ОтветНаВопросЗаписать(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога. Да Тогда
ЭтотОбъект. Записать( ) ;
ДобавитьФайлы( ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат ;
КонецЕсли ;
ОписаниеФайла = Новый Файл( ВыбранноеИмяФайла) ;
СохранитьФайлВХранилище( Адрес, Объект. Ссылка, ОписаниеФайла. ИмяБезРасширения) ;
Элементы. Файлы. Обновить( ) ;
ЭтаФорма. ОбновитьОтображениеДанных( ) ;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СохранитьФайлВХранилище(Адрес,Владелец,Имя)
НовФайл = Справочники. ХранилищеФайлов. СоздатьЭлемент( ) ;
НовФайл. Владелец = Владелец;
НовФайл. Наименование = Имя;
НовФайл. ДанныеТекущаяДата = ТекущаяДата( ) ;
НовФайл. ДанныеХЗ = Новый ХранилищеЗначения( ПолучитьИзВременногоХранилища( Адрес) ) ;
НовФайл. Записать( ) ;
КонецПроцедуры
файлы записаны, далее если файлов много, то пользователь может перемещаться по списку файлов и ему должны показываться файлы
Добавим для списка файлы Событие ФайлыПриАктивизацииСтроки
Код 1C v 8.3 &НаКлиенте
Процедура ФайлыПриАктивизацииСтроки(Элемент)
Попытка
ТекКартинка = ФайлыПриАктивизацииСтрокиНаСервере( Элемент. ТекущиеДанные. Ссылка) ;
Исключение
КонецПопытки ;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ФайлыПриАктивизацииСтрокиНаСервере(ЭлементС)
Возврат ПолучитьНавигационнуюСсылку( ЭлементС, "ДанныеХЗ" ) ;
КонецФункции
+ чуть не забыл, т.к. файлы это динамический список с установленным запросом и параметром - необходимо при открытии задать параметр:
Установим параметр при открытии:
Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Файлы. Параметры. УстановитьЗначениеПараметра( "Владелец" , Объект. Ссылка) ;
КонецПроцедуры
Результат:
Скачать DT с примером : Foto_V_BD.7z
Если у Вас есть вопросы или комментарии - пишите ниже, обсудим
Пример создания, очистки и обновления Диаграммы График
Код 1C v 8.х Диаграмма = ЭлементыФормы.Диаграмма;
// Очистить диаграмму, возможно ранее в нее уже выводились данные.
Диаграмма.КоличествоСерий = 0;
Диаграмма.КоличествоТочек = 0;
// Количество серий будет ограничиваться (не все значения будут показываться ).
Диаграмма.МаксимумСерий = МаксимумСерий.Ограничено;
Диаграмма.МаксимумСерийКоличество = 7;
Диаграмма.ВидПодписей = ВидПодписейКДиаграмме.Процент;
Диаграмма.ОбластьЗаголовка.Текст = "Обороты номенклатуры";
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
| ПродажиКомпанииОбороты.Номенклатура,
| СУММА(ПродажиКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиКомпанииОбороты
|СГРУППИРОВАТЬ ПО
| ПродажиКомпанииОбороты.Номенклатура";
Результат = Запрос.Выполнить();
// Запретить обновление диаграммы на время вывода данных.
Диаграмма.Обновление = Ложь;
// Установить единственную точку.
Диаграмма.КоличествоТочек = 1;
Диаграмма.Точки[0].Текст = "Количество";
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Количество серий, если бы не ограничивали зависело бы от результата запроса.
КоличествоСерий = Диаграмма.Серии.Количество();
Диаграмма.КоличествоСерий = КоличествоСерий + 1;
Диаграмма.Серии[КоличествоСерий].Текст = Выборка.Номенклатура;
// Установить значение "на пересечении" точки и серии.
// Первый параметр - 0 , так как в диаграмме только одна точка.
Диаграмма.УстановитьЗначение(0, КоличествоСерий, Выборка.КоличествоОборот);
КонецЦикла;
// Обновить диаграмму.
Диаграмма.Обновление = Истина;
Код 1C v 8.х Диаграмма = ЭлементыФормы.Диаграмма;
// Очистить диаграмму, возможно ранее в нее уже выводились данные.
Диаграмма.КоличествоСерий = 0;
Диаграмма.КоличествоТочек = 0;
// Количество серий будет ограничиваться (не все значения будут показываться ).
Диаграмма.МаксимумСерий = МаксимумСерий.Ограничено;
Диаграмма.МаксимумСерийКоличество = 7;
Диаграмма.ВидПодписей = ВидПодписейКДиаграмме.Процент;
Диаграмма.ОбластьЗаголовка.Текст = "Обороты номенклатуры";
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
| ПродажиКомпанииОбороты.Номенклатура,
| СУММА(ПродажиКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиКомпанииОбороты
|СГРУППИРОВАТЬ ПО
| ПродажиКомпанииОбороты.Номенклатура";
Результат = Запрос.Выполнить();
// Запретить обновление диаграммы на время вывода данных.
Диаграмма.Обновление = Ложь;
// Установить единственную точку.
Диаграмма.КоличествоТочек = 1;
Диаграмма.Точки[0].Текст = "Количество";
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Количество серий, если бы не ограничивали зависело бы от результата запроса.
КоличествоСерий = Диаграмма.Серии.Количество();
Диаграмма.КоличествоСерий = КоличествоСерий + 1;
Диаграмма.Серии[КоличествоСерий].Текст = Выборка.Номенклатура;
// Установить значение "на пересечении" точки и серии.
// Первый параметр - 0 , так как в диаграмме только одна точка.
Диаграмма.УстановитьЗначение(0, КоличествоСерий, Выборка.КоличествоОборот);
КонецЦикла;
// Обновить диаграмму.
Диаграмма.Обновление = Истина;
Код 1C v 7.x
Процедура ПостроитьДиаграмму(Диагр)
КолСерий= 0 ;
Спр. ВыбратьЭлементы( ) ;
Пока Спр. ПолучитьЭлемент( ) = 1 Цикл
Если Спр. ЭтоГруппа( ) = 0 Тогда
КолСерий= КолСерий+ 1 ;
КонецЕсли ;
КонецЦикла ;
Диагр. КоличествоСерий( КолСерий) ;
Диагр. КоличествоТочек( 1 ) ;
БИ= СоздатьОбъект( "БухгалтерскиеИтоги" ) ;
БИ. Рассчитать( ДатаОтчета, ДатаОтчета) ;
номер= 1 ;
Спр. ВыбратьЭлементы( ) ;
Пока Спр. ПолучитьЭлемент( ) = 1 Цикл
Если Спр. ЭтоГруппа( ) = 0 Тогда
Диагр. УстановитьИмяСерии( Номер, Спр. Наименование) ;
Диагр. УстановитьЗначение( 1 , номер, БИ. СКД( "10" , "К" , , Спр. ТекущийЭлемент( ) ) ) ;
номер= номер+ 1 ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Код 1C v 7.x
Процедура СформироватьДиаграмму(Диаграмма1)
Диаграмма1 . Обновление( 0 ) ;
Диаграмма1 . Заголовок = "Поступления от покупателей" ;
Диаграмма1 . УстановитьИмяСерии( 1 , "Рубли" ) ;
Диаграмма1 . АвтоУстановкаИменТочек( 1 ) ;
БухИт = СоздатьОбъект( "БухгалтерскиеИтоги" ) ;
Бухит. ВыполнитьЗапрос( НачКвартала( РабочаяДата( ) ) ,
КонКвартала( РабочаяДата( ) ) , "60.1" , , , 1 , "Неделя" , "С" ) ;
БухИт. ВыбратьПериоды( ) ;
А = 1 ;
Пока БухИт. ПолучитьПериод( ) = 1 Цикл
Диаграмма1 . УстановитьЗначение( А, 1 , БухИт. ДО( ) ) ;
А = А + 1 ;
КонецЦикла ;
Диаграмма1 . Обновление( 1 ) ;
КонецПроцедуры