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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Виталий

    Добрый вечер! Сделал данную загрузку, но при нажатие кнопки “Создать” выскакивает следующая ошибка:
    Ошибка при вызове метода контекста (Получить)
    {Справочник.Номенклатура.Форма.ФормаЭлемента.Форма(24)}:АдресКартинки = ПоместитьВоВременноеХранилище(Картинки.Получить(ИндексКартинки).Значение.Получить());
    {Справочник.Номенклатура.Форма.ФормаЭлемента.Форма(18)}:ОтобразитьКартинку();

    [ОшибкаВоВремяВыполненияВстроенногоЯзыка]
    по причине:
    Значение индекса выходит за границы диапазона
    [ОшибкаИспользованияВстроенногоЯзыка]

    Подскажите, в чем может быть проблема?

    1. Добрый день! нужно посмотреть отладчиком, что содержится в коллекции Картинки. Похоже, что индекс картинки у вас больше, чем самый большой индекс в коллекции.
      Если не получится разобраться, воспроизведите это на маленькой конфигурации какой-нибудь, например каркасной, и выложите на яндекс-диск. Можете связаться со мной через телеграм или вотсап, посмотрю ваш пример.

  2. Виталий

    Доброе утро! Команда регистра сведения располагается на форме элемента. При попытке создать новый элемент выскакивает ошибка “Значение индекса выходит за границы диапазона”, из-за попадания в процедуру “ПриСозданииНаСервере”, где он начинает выполнять запрос, который на данный момент является пустым, так как сама команда для загрузки картинки располагается на форме элемента.

  3. Виталий

    Если я расположу команду регистра сведения на форме списка справочника “Номенклатуры”, то воспроизводиться ошибка “Команда не может быть выполнена для указанного объекта!”, а если расположить команду на панели навигации, то тут все отлично работает, так как сначала идет загрузка картинки, а только потом создание элемента справочника.

    1. Виталий, отвечу ровно так же как в первый раз. Телепатически код анализировать не получается, увы.
      Если не получится разобраться, воспроизведите это на маленькой конфигурации какой-нибудь, например каркасной, и выложите на яндекс-диск. Можете связаться со мной через телеграм или вотсап, посмотрю ваш пример.

  4. Как отобразить несколько FullHD картинок с прокрутой по вертикали, а не кнопками влево-вправо?

    При 5+ картинок их пропорции сжимаются как 1:10 (против 16:9 как должно быть в FullHD), вне зависимости от устанавливаемого размера, их высоты, и свойств масштабирования

    1. Боюсь, быстрого ответа не дам, тут только экспериментировать и разбираться, с настройками отображения картинки, свойство “РазмерКартинки” убедиться что стоит “Реальный размер”

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

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

10 + десять =

К НАЧАЛУ