Получить консультацию

Как загрузить, сохранить и отобразить изображения в 1С?

В данном рецепте рассмотрим, как сохранять картинки в базе 1С, на примере прикрепления изображений к товарам.

Как сохранить картинку в базу?

Картинки, как и любые файлы, можно хранить в виде двоичных данных в реквизитах с типом ХранилищеЗначения. Рассмотрим вариант сохранения картинок в регистре сведений (но можно похожим образом хранить и в самом справочнике).

Создадим регистр сведений КартинкиНоменклатуры с измерениями Номенклатура и ИмяФайла, и ресурсом Картинка (тип – хранилище значения). Имя файла мы будем использовать для того, чтобы один и тот же файл не прикреплять многократно, а заменять уже существующий с таким же именем.

Добавим команду ЗагрузитьКартинку в команды объекта регистра сведений КартинкиНоменклатуры. Команду сделаем параметризуемой с типом параметра СправочникСсылка.Номенклатура. Это автоматически добавит кнопку с данной командой как в форму элемента так и в форму списка.
Достаточно простой способ загрузить выбранную пользователем в диалоге картинку – воспользоваться методом ПоместитьФайлНаСерверАсинх. Чтобы отфильтровать только файлы картинок, используем фильтр  на расширения jpg и png (разумеется, можно указать и другие расширения, если нужно) в параметрах диалога.

&НаКлиенте
Асинх Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
	ПараметрыДиалога.Фильтр = "Файл изображения|*.jpg;*.png"; 
	ПомещенныйФайл = Ждать ПоместитьФайлНаСерверАсинх(,,, ПараметрыДиалога);
	
	Если ПомещенныйФайл <> Неопределено И Не ПомещенныйФайл.ПомещениеФайлаОтменено Тогда
		ЗаписатьФайлКартинкиНаСервере(ПараметрКоманды, ПомещенныйФайл.Адрес, ПомещенныйФайл.СсылкаНаФайл.Имя);
	КонецЕсли;
	
	Оповестить("Добавлена картинка", ПараметрКоманды);
	
КонецПроцедуры

&НаСервере
Процедура ЗаписатьФайлКартинкиНаСервере(Номенклатура, Знач АдресВХ, Знач ИмяФайла)

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

Как показать картинку в 1С на управляемой форме?

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

Нам понадобится реквизит формы “Картинки” с типом Список значений. Также добавим числовой реквизит “ИндексКартинки” и реквизит типа строка “АдресСтроки”. Пролистывание сделаем циклическим, при помощи двух команд – ЛистатьВлево и ЛистатьВправо. Чтобы получить картинку из хранилища в регистре сведений, нам нужно получить навигационную ссылку по ключу регистра сведений. В случае добавления новой картинки сделаем обработку оповещения, чтобы новая картинка сразу добавилась в коллекцию, и нам не пришлось переоткрывать форму номенклатуры.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ОбновитьКартинки();	
КонецПроцедуры

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

&НаСервере
Процедура ОтобразитьКартинку()	
	АдресКартинки = ПолучитьНавигационнуюСсылку(Картинки.Получить(ИндексКартинки).Значение, "Картинка");	
КонецПроцедуры

&НаКлиенте
Процедура ЛистатьВлево(Команда)
	ИндексКартинки = ?(ИндексКартинки = 0, Картинки.Количество()-1, ИндексКартинки - 1);
	ОтобразитьКартинку();
КонецПроцедуры

&НаКлиенте
Процедура ЛистатьВправо(Команда)
	ИндексКартинки = ?(ИндексКартинки = Картинки.Количество()-1, 0, ИндексКартинки + 1);
	ОтобразитьКартинку();
КонецПроцедуры

Готово. Конечный вариант может выглядеть примерно так:

Как показать картинку на форме в 1С?

Альтернативный вариант

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

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

&НаСервере
Процедура ОтобразитьКартинку()	
	АдресКартинки = ПоместитьВоВременноеХранилище(Картинки.Получить(ИндексКартинки).Значение.Получить());	
КонецПроцедуры

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

тринадцать − пять =

К НАЧАЛУ