В данном рецепте рассмотрим, как сохранять картинки в базе 1С, на примере прикрепления изображений к товарам.
Как сохранить картинку в базу?
Картинки, как и любые файлы, можно хранить в виде двоичных данных в реквизитах с типом ХранилищеЗначения. Рассмотрим вариант сохранения картинок в регистре сведений (но можно похожим образом хранить и в самом справочнике).
Создадим регистр сведений КартинкиНоменклатуры с измерениями Номенклатура и ИмяФайла, и ресурсом Картинка (тип – хранилище значения). Имя файла мы будем использовать для того, чтобы один и тот же файл не прикреплять многократно, а заменять уже существующий с таким же именем.
Добавим команду ЗагрузитьКартинку в команды объекта регистра сведений КартинкиНоменклатуры. Команду сделаем параметризуемой с типом параметра СправочникСсылка.Номенклатура. Это автоматически добавит кнопку с данной командой как в форму элемента так и в форму списка.
Достаточно простой способ загрузить выбранную пользователем в диалоге картинку – воспользоваться методом ПоместитьФайлНаСерверАсинх. Чтобы отфильтровать только файлы картинок, используем фильтр на расширения jpg и png (разумеется, можно указать и другие расширения, если нужно) в параметрах диалога.
&НаКлиенте Асинх Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов; ПараметрыДиалога.Фильтр = "Файл изображения|*.jpg;*.png"; ПомещенныйФайл = Ждать ПоместитьФайлНаСерверАсинх(,,, ПараметрыДиалога); Если ПомещенныйФайл <> Неопределено И Не ПомещенныйФайл.ПомещениеФайлаОтменено Тогда ЗаписатьФайлКартинкиНаСервере(ПараметрКоманды, ПомещенныйФайл.Адрес, ПомещенныйФайл.СсылкаНаФайл.Имя); КонецЕсли; Оповестить("Добавлена картинка", ПараметрКоманды); КонецПроцедуры &НаСервере Процедура ЗаписатьФайлКартинкиНаСервере(Номенклатура, Знач АдресВХ, Знач ИмяФайла) МЗ = РегистрыСведений.КартинкиНоменклатуры.СоздатьМенеджерЗаписи(); МЗ.Номенклатура = Номенклатура; МЗ.ИмяФайла = ИмяФайла; МЗ.Картинка = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВХ)); МЗ.Записать(); КонецПроцедуры
Как показать картинку в 1С на управляемой форме?
Классический способ отображения картинок – получения адреса во временном хранилище и отображение его в виде поля картинки на форме. Рассмотрим пример, когда нам нужно хранить множество картинок для одного товара, и отображать с пролистыванием, наподобие галереи.
Нам понадобится реквизит формы “Картинки” с типом Список значений. Также добавим числовой реквизит “ИндексКартинки” и реквизит типа строка “АдресСтроки”. Пролистывание сделаем циклическим, при помощи двух команд – ЛистатьВлево и ЛистатьВправо. Чтобы получить картинку из хранилища в регистре сведений, нам нужно получить навигационную ссылку по ключу регистра сведений. В случае добавления новой картинки сделаем обработку оповещения, чтобы новая картинка сразу добавилась в коллекцию, и нам не пришлось переоткрывать форму номенклатуры.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОбновитьКартинки(); КонецПроцедуры &НаСервере Процедура ОбновитьКартинки() Перем Выборка, Запрос, КлючКартинки; Запрос = Новый Запрос("ВЫБРАТЬ | КартинкиНоменклатуры.Номенклатура КАК Номенклатура, | КартинкиНоменклатуры.ИмяФайла КАК ИмяФайла |ИЗ | РегистрСведений.КартинкиНоменклатуры КАК КартинкиНоменклатуры |ГДЕ | КартинкиНоменклатуры.Номенклатура = &Номенклатура"); Запрос.УстановитьПараметр("Номенклатура", Объект.Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Картинки.Очистить(); Пока Выборка.Следующий() Цикл КлючКартинки = РегистрыСведений.КартинкиНоменклатуры.СоздатьКлючЗаписи(Новый Структура("Номенклатура, ИмяФайла", Выборка.Номенклатура, Выборка.ИмяФайла)); Картинки.Добавить(КлючКартинки); КонецЦикла; ОтобразитьКартинку(); КонецПроцедуры &НаСервере Процедура ОтобразитьКартинку() АдресКартинки = ПолучитьНавигационнуюСсылку(Картинки.Получить(ИндексКартинки).Значение, "Картинка"); КонецПроцедуры &НаКлиенте Процедура ЛистатьВлево(Команда) ИндексКартинки = ?(ИндексКартинки = 0, Картинки.Количество()-1, ИндексКартинки - 1); ОтобразитьКартинку(); КонецПроцедуры &НаКлиенте Процедура ЛистатьВправо(Команда) ИндексКартинки = ?(ИндексКартинки = Картинки.Количество()-1, 0, ИндексКартинки + 1); ОтобразитьКартинку(); КонецПроцедуры
Готово. Конечный вариант может выглядеть примерно так:
Альтернативный вариант
Вместо использования навигационной ссылки можно пойти другим путем – получить хранилище значений, извлечь из него двоичные данные и поместить во временное хранилище. В этом случае нам не нужно формировать ключи записей регистра сведений.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Запрос = Новый Запрос("ВЫБРАТЬ | КартинкиНоменклатуры.Картинка КАК Картинка |ИЗ | РегистрСведений.КартинкиНоменклатуры КАК КартинкиНоменклатуры |ГДЕ | КартинкиНоменклатуры.Номенклатура = &Номенклатура"); Запрос.УстановитьПараметр("Номенклатура", Объект.Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Картинки.Очистить(); Пока Выборка.Следующий() Цикл Картинки.Добавить(Выборка.Картинка); КонецЦикла; ОтобразитьКартинку(); КонецПроцедуры &НаСервере Процедура ОтобразитьКартинку() АдресКартинки = ПоместитьВоВременноеХранилище(Картинки.Получить(ИндексКартинки).Значение.Получить()); КонецПроцедуры