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