При работе с картинками используется тот же самый подход, который был описан выше. Отличие заключается только в том, что в предыдущем примере нам не нужно было никак отображать файл в форме элемента справочника Поставщики. А картинка, как правило, загружается в информационную базу именно для того, чтобы отображать ее в какой-либо форме.
Примечание
Пример можно посмотреть в демонстрационной базе «Файлы и картинки», справочник Товары.
Работу с картинками рассмотрим на примере справочника Товары и картинки товара. Ее нужно загрузить, отобразить в форме, сохранить в базе данных и иметь возможность получить из базы данных на клиентский компьютер.
Снова сделаем оговорку. Рассматриваемый пример упрощен, и картинку мы будем хранить в одном из реквизитов самого справочника Товары. В реальной работе, как правило, так не поступают, а хранят картинки в отдельных объектах конфигурации, в справочниках или в регистрах сведений.
Как и в предыдущем примере, справочник Товары будет содержать два реквизита: ФайлКартинки, чтобы хранить саму картинку, и ИмяФайлаКартинки, чтобы знать ее имя при выгрузке на клиентский компьютер (рис. 3.162).

Рис. 3.162. Структура справочника «Товары»
Форма элемента справочника Товары также будет содержать два дополнительных реквизита: ИмяФайлаКартинки и СсылкаНаКартинку (рис. 3.163).

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

Рис. 3.164. Реквизиты формы справочника «Товары»
Таким образом, после помещения картинки она окажется во временном хранилище, а в реквизите формы будет ссылка на нее. Связанное с реквизитом поле картинки отобразит ее в форме (рис. 3.165).

Рис. 3.165. Отображение картинки из временного хранилища
Когда пользователь решит сохранить сделанные изменения, на сервере будет вызван обработчик события формы Перед записью на сервере (листинг 3.142).
Листинг 3.142. Обработчик события «Перед записью на сервере»
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Получить файл из хранилища и поместить его в объект
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(СсылкаНаКартинку);
ТекущийОбъект.ФайлКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
ТекущийОбъект.ИмяФайлаКартинки = ИмяФайлаКартинки;
КонецЕсли;
КонецПроцедуры
Этот обработчик также аналогичен тому, что рассматривался в листинге 3.133. Картинка из временного хранилища помещается в объект справочника, туда же помещается имя картинки из реквизита формы (рис. 3.166).

Рис. 3.166. Помещение картинки в реквизит справочника
Затем платформа начнет запись объекта, и его данные будут помещены в базу данных (рис. 3.167).

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

Рис. 3.168. Отображение картинки из реквизита справочника
Теперь осталось сделать последнюю небольшую доработку. Если сейчас закрыть форму и снова открыть сохраненный элемент, мы не увидим картинки в форме, так как в реквизите формы нет ссылки на сохраненную в базе данных картинку. Поэтому создадим обработчик события формы При создании на сервере и в нем поместим в реквизит формы ссылку на картинку (листинг 3.145).
Листинг 3.145. Обработчик события «При создании на сервере»
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.ИмяФайлаКартинки <> "" Тогда
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлКартинки");
КонецЕсли;
КонецПроцедуры
Процесс получения картинки из информационной базы выглядит точно так же, как и в случае работы с файлами (листинг 3.146, рис. 3.169).
Листинг 3.146. Получение картинки из информационной базы
&НаКлиенте
Процедура СохранитьНаДиск(Команда)
Если Объект.ИмяФайлаКартинки = "" Тогда
ПоказатьПредупреждение(, "У товара нет сохраненной в базе картинки");
Иначе
СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлКартинки");
ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайлаКартинки);
КонецЕсли;
КонецПроцедуры

Рис. 3.169. Диалог получения файла