Учебный курс: Подготовка на 1С:Специалист по платформе 1С:Предприятие 8.3

Решение задач по управляемым формам – тема № 14:
Как реализовать отображение картинок на форме и хранение их в базе

Работа с графическими изображениями повышает наглядность и удобство работы с программой. Поэтому в платформе «1С:Предприятие» реализована работа с изображениями.

Для удобства пользователей в базе можно хранить изображения различных объектов. Это могут быть фотографии товаров, сканы документов, копии документов физических лиц и так далее. Также сохраненные изображения можно отображать на формах документов, справочников и других объектов.

Кроме того, в современных типовых конфигурациях фирмы «1С» есть возможность выбора места хранения прикрепленных изображений – в самой информационной базе или в отдельном каталоге на жестком диске. Это связано с тем, что графические изображения могут занимать достаточно много места, следовательно, размер информационной базы может сильно увеличиться.

Более подробно вопросы хранения изображений и вывода изображения на форму рассматриваются в курсе Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3» (См. Занятие 26).

Однако приемы работы с изображениями не меняются в зависимости от способа хранения этих изображений. Далее рассмотрим пример задачи, который может встретиться на экзамене:

Необходимо обеспечить возможность прикреплять изображение к элементу справочника Номенклатура. Изображения следует хранить в информационной базе. Прикрепленное изображение номенклатуры должно отображаться на форме элемента.

На форме элемента справочника «Номенклатура» разместить кнопку «Загрузить картинку». При нажатии на эту кнопку пользователь выбирает файл на диске, который будет прикреплен к карточке номенклатуры:

Отображение картинки на форме номенклатуры

Рисунок 1 – Отображение картинки на форме номенклатуры

Как организовать хранение изображений в базе

Для хранения произвольных данных в платформе «1С:Предприятие» предназначен специальный тип ХранилищеЗначений. Этот тип позволяет хранить в информационной базе любые двоичные данные – изображения, электронные таблицы, PDF-файлы и так далее.

Важно, что поля такого типа хранятся непосредственно в информационной базе. Значит, они будут сохранены в файле с расширением dt при создании выгрузки базы, а также в резервной копии, созданной средствами СУБД. Дополнительное резервное копирование файлов с изображениями не потребуется.

Для решения поставленной задачи организуем хранение прикрепленных изображений непосредственно в справочнике Номенклатура. Для этого создадим в справочнике реквизит Изображение (тип – ХранилищеЗначения):

Реквизит справочника «Номенклатура» для хранение картинки

Рисунок 2 – Реквизит справочника «Номенклатура» для хранение картинки

Как отобразить изображение на форме

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

Использование временного хранилища для отображения картинки на форме

Рисунок 3 – Использование временного хранилища для отображения картинки на форме

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

Последовательно произведем описанные выше действия.

Как настроить форму для отображения на ней картинки

Создадим на форме элемента справочника Номенклатура реквизит АдресКартинки с типом Строка:

Создание реквизита формы «Адрес картинки»

Рисунок 4 – Создание реквизита формы «Адрес картинки»

Перенесем созданный реквизит на форму:

Создание элемента формы «Адрес картинки»

Рисунок 5 – Создание элемента формы «Адрес картинки»

Для поля АдресКартинки установим свойство Вид в значение «Поле картинки»:

Установка значения свойства Вид для поля «АдресКартинки»

Рисунок 6 – Установка значения свойства Вид для поля «АдресКартинки»

Создадим команду формы ЗагрузитьКартинку:

Команда формы «Загрузить картинку»

Рисунок 7 – Команда формы «Загрузить картинку»

Перенесем команду на форму:

Размещение команды «Загрузить картинку» на форме

Рисунок 8 – Размещение команды «Загрузить картинку» на форме

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

В свойствах конфигурации режим модальности не используется:

Свойство конфигурации «Режим использования модальности»

Рисунок 9 – Свойство конфигурации «Режим использования модальности»

Поэтому для помещения файла во временное хранилище используется метод глобального контекста НачатьПомещениеФайла. Процедура ЗагрузитьКартинку будет иметь следующий код:

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

После того, как выбранный пользователем файл будет помещен во временное хранилище, система вызывает процедуру ЗагрузитьКартинкуЗавершение, указанную в описании оповещения. В ней реквизиту формы АдресКартинки присваивается адрес временного хранилища, куда была помещена картинка.

Поскольку при выполнении рассмотренного программного кода не изменяются значения реквизитов объекта, при закрытии формы система не спросит, следует ли сохранить выполненные изменения. Чтобы не потерять отображающуюся на форме, но еще не записанную в базу картинку, признак модифицированности формы установим в значение Истина.

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

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

В пользовательском режиме откроем форму элемента справочника «Номенклатура». Нажмем кнопку Загрузить картинку, выберем файл с изображением с диска, после чего картинка отобразится на форме:

Загрузка изображения с диска

Рисунок 10 – Загрузка изображения с диска

Модифицированность формы отображается при помощи символа (*) в заголовке формы.

Обратите внимание – сейчас картинка отображается на форме, но в информационной базе она еще не сохранена. Дело в том, что в базе изображение хранится в реквизите справочника «Номенклатура». Поскольку элемент справочника еще не записан, в базе данных этого изображения еще нет. Оно располагается только во временном хранилище. При записи элемента справочника необходимо данные из временного хранилища сохранить в реквизит справочника.

Как сохранить изображение в базу

Ранее была реализована загрузка изображения из файла во временное хранилище, а также отображение картинки на форме. Теперь обеспечим хранение изображения в информационной базе. Для этого необходимо данные из временного хранилища перенести в реквизит Изображение справочника «Номенклатура».

Поскольку работа с хранилищем значения доступна только на Сервере, создадим в модуле формы элемента справочника Номенклатура обработчик события ПередЗаписьюНаСервере:

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

Если в реквизите формы АдресКартинки содержится адрес временного хранилища, записываем в реквизит Изображение данные картинки, находящиеся во временном хранилище.

При открытии формы нужно отображать сохраненную в базе картинку на форме. Для этого в модуле формы элемента справочника Номенклатура реализуем обработчик события ПриСозданииНаСервере. Код обработчика будет выглядеть следующим образом:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) АдресКартинки = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Изображение"); КонецПроцедуры

При помощи метода глобального контекста ПолучитьНавигационнуюСсылку получаем навигационную ссылку на реквизит Изображение текущей позиции номенклатуры. Полученную ссылку присваиваем реквизиту формы АдресКартинки. Это позволит платформе отобразить на форме в поле картинки изображение номенклатуры.

Таким образом, поставленная задача решена. Реализовано хранение изображения в информационной базе, а также его отображение на форме.

Перейти к следующей теме:
“Как организовать хранение картинок товаров во внешних файлах на диске, а также их отображение на форме” (№ 15)

Комментарии закрыты