Каталог решений - Хранение изображений в сетевом каталоге

Хранение изображений в сетевом каталоге

Хранение изображений в сетевом каталоге

В наличии

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

Категория:

Описание

Попробую сделать такой функционал в типовой конфигурации УПП (УТ, КА)

Опишу вкратце действия шаг за шагом но если что-то сложно написал, заранее прошу прощения.    

1. Создаю константу ПутьККартинкамНаСервере. В нее пишу полный путь к сетевому каталогу. Выполняем код: Константы.ПутьККартинкамНаСервере.Установить(«\\ВашПуть\»);

2. Создаю регистр сведений  ИзображенияНоменклатуры с двумя измерениями Объект (Справочник.Номенклатура), Путь (Строка, 255) и реквизитом Основное (Булево).

3. В регистр сведений  ИзображенияНоменклатуры добавляю основную форму записи. После на форму кнопку ИзменитьКартинку. В модуль формы пишу код листинга 1.0 и привяжем событие Нажатие на кнопку.

//листинг 1.0
Функция КоличествоКартинок(Объект)

 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | ИзображенияНоменклатуры.Объект КАК Объект
  |ИЗ
  | РегистрСведений.ИзображенияНоменклатуры КАК ИзображенияНоменклатуры
  |ГДЕ
  | ИзображенияНоменклатуры.Объект = &Объект";

 Запрос.УстановитьПараметр("Объект",Объект);
 Результат = Запрос.Выполнить().Выгрузить();

 Возврат Результат.Количество(); 
КонецФункции

Функция ПолучитьЧастьСтрокиОтделеннойСимволом(Знач ИсходнаяСтрока, Знач СимволПоиска)
 
 ПозицияСимвола = СтрДлина(ИсходнаяСтрока);
 Пока ПозицияСимвола >= 1 Цикл
  
  Если Сред(ИсходнаяСтрока, ПозицияСимвола, 1) = СимволПоиска Тогда
      
   Возврат Сред(ИсходнаяСтрока, ПозицияСимвола + 1); 
   
  КонецЕсли;
  
  ПозицияСимвола = ПозицияСимвола - 1; 
 КонецЦикла;

 Возврат "";
   
КонецФункции

Процедура ИзменитьКартинкуНажатие(Элемент)
  
  СтандартнаяОбработка = ложь;
  ПутьКСерверу = Константы.ПутьККартинкамНаСервере.Получить();
  ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
  ДиалогОткрытияФайла.Заголовок = "Выберите файл с изображением";
  ДиалогОткрытияФайла.ПолноеИмяФайла = "";
  ДиалогОткрытияФайла.ПредварительныйПросмотр = Истина;
  Фильтр = "(*.jpg)|*.jpg,(*.png)|*.png";


  Если ДиалогОткрытияФайла.Выбрать() Тогда
   ВыбранноеИзображение = ДиалогОткрытияФайла.ПолноеИмяФайла;
  Иначе
   Возврат;
  КонецЕсли;
  
  Артикул = Объект.Артикул;
  КолКарт = КоличествоКартинок(Объект);
  Расширение = ПолучитьЧастьСтрокиОтделеннойСимволом(ДиалогОткрытияФайла.ПолноеИмяФайла,".");
  Имякартинки = "NPhoto_";
  Если КолКарт = 0 тогда
   ИмяНаСервере = Строка(Имякартинки)+СокрЛП(Артикул)+"."+Расширение;
  Иначе 
   ИмяНаСервере = Строка(Имякартинки)+СокрЛП(Артикул)+"_"+Строка(КолКарт)+"."+Расширение;
  КонецЕсли; 
  
  КопироватьФайл(ДиалогОткрытияФайла.ПолноеИмяФайла, ПутьКСерверу+ИмяНаСервере);
  
  ПутьККартинке = ИмяНаСервере;
  
  Путь = ПутьККартинке;  

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

4. Добавляю общую форму ФормаИзображения с полем картинки ОсновноеИзображение и табличное поле Изображения которое будет содержать список для редактирования изображения. В модуле пишу листинг 2.0.  Далее в свойстве табличного поля указываю ТипЗначения: РегистрСведенийСписок.ИзображенияНоменклатуры и событие ИзображенияОбработкаЗаписиНовогоОбъекта. И обязательно привязать одноименное событие формы ПриОткрытии.  

//листинг 2.0

Перем мКартинки;
Перем ПутьКСерверу;
Процедура ПриОткрытии()
 
 УстОтбор(Изображения.Отбор,,"Объект", ВладелецФормы.Ссылка, Истина);
 мКартинки = Добавленные.ПолучитьКартинкиИзРегистра(ВладелецФормы.Ссылка);
 
 Если мКартинки.количество() > 0 тогда
  ФайлКартинки = новый Файл(ПутьКСерверу+мКартинки[0].Путь);
  Если ФайлКартинки.Существует() и СтрДлина(мКартинки[0].Путь) > 0 тогда
   ЭлементыФормы.ОсновноеИзображение.картинка = новый Картинка(ПутьКСерверу+мКартинки[0].Путь);
  КонецЕсли;
 Иначе
   ЭлементыФормы.ОсновноеИзображение.картинка = новый Картинка(); 
 КонецЕсли;
    ТекущиеИзображение = 0;
 
КонецПроцедуры

Процедура УстОтбор(Отбор,НастройкаОтбора=0,Поле="Объект",Значение,ОтключатьПустое=Ложь) Экспорт
 
 Если Отбор.Найти(Поле) = Неопределено Тогда
     Отбор.Добавить(Поле);
 КонецЕсли;
 
 Попытка
  Отбор[Поле].ВидСравнения=ВидСравнения.Равно;
 Исключение
  Отбор[Поле].ВидСравнения=ВидСравнения.Содержит;
 КонецПопытки;
 
  Отбор[Поле].Значение=Значение;
  Отбор[Поле].Использование=?(ОтключатьПустое,ЗначениеЗаполнено(Значение),Истина);
  
 Если ЗначениеЗаполнено(НастройкаОтбора) Тогда
    НастройкаОтбора[Поле].Доступность=Ложь;
    КонецЕсли;
   
КонецПроцедуры

Процедура ИзображенияОбработкаЗаписиНовогоОбъекта(Элемент, Объект, СтандартнаяОбработка)
 СтандартнаяОбработка = ложь;
КонецПроцедуры

функция ПолучитьКартинкиИзРегистра(объект)
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | ИзображенияНоменклатуры.Путь
  |ИЗ
  | РегистрСведений.ИзображенияНоменклатуры КАК ИзображенияНоменклатуры
  |ГДЕ
  | ИзображенияНоменклатуры.Объект = &Объект
  |
  |УПОРЯДОЧИТЬ ПО
  | ИзображенияНоменклатуры.Основное";

 Запрос.УстановитьПараметр("Объект", Объект);

 Результат = Запрос.Выполнить().Выгрузить();
 
 Возврат Результат;
 
КонецФункции 

ПутьКСерверу = Константы.ПутьККартинкамНаСервере.Получить();
мКартинки = новый ТаблицаЗначений;

5. Идем в ФормуЭлемента номенклатуры и заменяем код в процедуре ОсновноеИзображениеНажатие(). Код в листинге 3.0

//листинг 3.0
Процедура ОсновноеИзображениеНажатие(Элемент)

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

 //РаботаСФайлами.ОткрытьФормуИзображения(ЭтаФорма, ОсновноеИзображение, Ссылка);
 
 Форма = ОткрытьФорму("ОбщаяФорма.ФормаИзображения", , ЭтаФорма);

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

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

6. Так как форм где необходимо отобразить изображение может быть много, функции из листинга 4.0 поместим в общий модуль. У меня общий модуль называется «Добавленные».  

// листинг 4.0 

#Если Клиент Тогда
функция ПолучитьКартинкиИзРегистра(объект) Экспорт 
 
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | ИзображенияНоменклатуры.Путь
  |ИЗ
  | РегистрСведений.ИзображенияНоменклатуры КАК ИзображенияНоменклатуры
  |ГДЕ
  | ИзображенияНоменклатуры.Объект = &Объект
  |
  |УПОРЯДОЧИТЬ ПО
  | ИзображенияНоменклатуры.Основное УБЫВ";

 Запрос.УстановитьПараметр("Объект", Объект);

 Результат = Запрос.Выполнить().Выгрузить();

 Возврат Результат;
 
КонецФункции
Функция ПоказатьКартинкуИзРегистра(объект) Экспорт 
 
 ПутьКСерверу = Константы.ПутьККартинкамНаСервере.Получить(); 
 мКартинки = ПолучитьКартинкиИзРегистра(объект);
 Если мКартинки.количество() > 0 тогда
  ФайлКартинки = новый Файл(ПутьКСерверу+мКартинки[0].Путь);
  Если ФайлКартинки.Существует() и СтрДлина(мКартинки[0].Путь) > 0 тогда
   Картинка = новый Картинка(ПутьКСерверу+мКартинки[0].Путь);
  КонецЕсли;
 Иначе
   Картинка = новый Картинка(); 
 КонецЕсли;
 
 Возврат картинка;

КонецФункции 
#КонецЕсли 
	

7. Пример из модуля формы элемента Номенклатуры в листинге 5.0
    

// листинг 5.0 
Процедура ПоказатьОсновноеИзображение() Экспорт

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

П.С. не забываем дать разрешение на чтение и запись в сетевой каталог для изображений.

has been added to your cart:
Оформление заказа