Картинка - это двоичные данные, и в базе они хранятся в виде реквизитов с типом ХранилищеЗначения. Значения такого типа недоступны на клиенте. Поэтому не совсем очевидно, как же с ними работать. На самом деле всё очень просто, разработчики платформы придумали изящное решение данной проблемы.
Между сервером и клиентом двоичные данные передаются через временное хранилище. Точнее, передаются не сами данные, а специальный идентификатор, имеющий тип Строка. Строки прекрасно передаются от клиента к серверу и обратно.
Идея работы с картинками в управляемых формах заключается в следующем. Создаётся реквизит формы строкового типа. На форму помещается поле, у которого свойство Вид
равно Картинка
, связанный с ранее созданным реквизитом формы. С этого момента если в созданный реквизит поместить тот самый идентификатор, платформа его распознает, загрузит картинку и отобразит её на форме. Никаких дополнительных усилий со стороны программиста предпринимать не требуется. А сам реквизит вполне можно использовать для доступа к сохранённому во временном хранилище изображению как на стороне клиента, так и на сервере.
Заполняется реквизит обычно в обработчике события ПриСозданииНаСервере
. Вот пример, когда само изображение хранится в реквизите объекта под названием Изображение
:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ЗагруженныйФайл = ПоместитьВоВременноеХранилище(Объект.Ссылка.Изображение.Получить(), ЭтаФорма.УникальныйИдентификатор); КонецПроцедуры
Здесь мы сохраняем картинку из базы данных во временном хранилище и запоминаем полученный идентификатор в реквизите формы ЗагруженныйФайл
. Разумеется, реквизит можно назвать как угодно.
Изменить картинку несложно - достаточно просто записать в реквизит формы новый идентификатор картинки. Вот пример того, как на клиенте можно загрузить картинку из указанного файла:
ВыбранноеИзображение = Новый Картинка(ИмяФайла, Ложь); ЗагруженныйФайл = ПоместитьВоВременноеХранилище(ВыбранноеИзображение, ЭтаФорма.УникальныйИдентификатор); ЭтаФорма.Модифицированность = Истина;
Здесь мы загружаем картинку стандартным способом - соответствующим конструктором объекта типа Картинка. Далее, помещаем её во временное хранилище и запоминаем идентификатор в реквизите формы. Последняя строка нужна если при замене картинки требуется устанавливать флаг изменения в форме. Как вариант - можно установить свойство "Сохраняемые данные" реквизита формы.
Если изображение хранится в основном объекте формы, то при записи объекта необходимо записать и картинку. Самое лучшее место для этого - событие ПриЗаписиНаСервере
. В нём есть доступ ко всем необходимым данным:
&НаСервере Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ЗначениеЗаполнено(ЗагруженныйФайл) Тогда ТекущийОбъект.Изображение = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(ЗагруженныйФайл)); ТекущийОбъект.Записать(); КонецЕсли; КонецПроцедуры
Здесь мы получаем данные из временного хранилища, помещаем их в реквизит типа ХранилищеЗначения с именем Изображение
. Не забываем записать объект!
Приведённый пример максимально упрощён, он записывает картинку даже если она не менялась. В реальном коде лучше добавить признак изменения и соответствующие проверки.
Если картинка хранится в другом объекте, код будет аналогичным, только добавится строка с получением другого объекта.