Инструменты пользователя

Инструменты сайта


1c:общие:формы:картинки_в_управляемых_формах

Картинки в управляемых формах

Картинка - это двоичные данные, и в базе они хранятся в виде реквизитов с типом ХранилищеЗначения. Значения такого типа недоступны на клиенте. Поэтому не совсем очевидно, как же с ними работать. На самом деле всё очень просто, разработчики платформы придумали изящное решение данной проблемы.

Между сервером и клиентом двоичные данные передаются через временное хранилище. Точнее, передаются не сами данные, а специальный идентификатор, имеющий тип Строка. Строки прекрасно передаются от клиента к серверу и обратно.

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

Заполняется реквизит обычно в обработчике события ПриСозданииНаСервере. Вот пример, когда само изображение хранится в реквизите объекта под названием Изображение:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЗагруженныйФайл = ПоместитьВоВременноеХранилище(Объект.Ссылка.Изображение.Получить(), ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры

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

Изменить картинку несложно - достаточно просто записать в реквизит формы новый идентификатор картинки. Вот пример того, как на клиенте можно загрузить картинку из указанного файла:

    ВыбранноеИзображение = Новый Картинка(ИмяФайла, Ложь);
    ЗагруженныйФайл = ПоместитьВоВременноеХранилище(ВыбранноеИзображение, ЭтаФорма.УникальныйИдентификатор);
    ЭтаФорма.Модифицированность = Истина;

Здесь мы загружаем картинку стандартным способом - соответствующим конструктором объекта типа Картинка. Далее, помещаем её во временное хранилище и запоминаем идентификатор в реквизите формы. Последняя строка нужна если при замене картинки требуется устанавливать флаг изменения в форме. Как вариант - можно установить свойство "Сохраняемые данные" реквизита формы.

Если изображение хранится в основном объекте формы, то при записи объекта необходимо записать и картинку. Самое лучшее место для этого - событие ПриЗаписиНаСервере. В нём есть доступ ко всем необходимым данным:

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

Здесь мы получаем данные из временного хранилища, помещаем их в реквизит типа ХранилищеЗначения с именем Изображение. Не забываем записать объект!

Приведённый пример максимально упрощён, он записывает картинку даже если она не менялась. В реальном коде лучше добавить признак изменения и соответствующие проверки.

Если картинка хранится в другом объекте, код будет аналогичным, только добавится строка с получением другого объекта.

См. также

Только авторизованные участники могут оставлять комментарии.
1c/общие/формы/картинки_в_управляемых_формах.txt · Последнее изменение: 2016/11/29 18:22 — alex