Как программно отобразить картинку из временного хранилища на управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При программном создании интерфейса управляемых форм разработчики часто сталкиваются с задачей вывода произвольных изображений, загруженных из базы данных, файла или двоичных данных. При попытке назначить программно созданному элементу ДекорацияФормы с видом ВидДекорацииФормы.Картинка объект типа Картинка, сформированный из двоичных данных, платформа 1С возвращает ошибку "Недопустимое значение".

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

Выясним причину ошибки декорации формы

Рассмотрим, почему не работает прямая подстановка объекта Картинка в элемент декорации. Свойство Картинка элемента ДекорацияФормы на управляемой форме при программной установке рассчитано исключительно на статические изображения из стандартных библиотек (например, БиблиотекаКартинок.Руководитель). Платформа 1С не поддерживает передачу объекта Картинка, созданного на основе динамических двоичных данных или временного хранилища, напрямую в свойства декорации.

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

Пошаговый алгоритм программного вывода картинки

Разберем по шагам правильную последовательность действий для динамического создания поля картинки и вывода в него изображения.

  1. Создание реквизита формы: Нам потребуется программно добавить реквизит формы с типом Строка неограниченной длины. В этот реквизит будет помещаться URL-адрес временного хранилища.
  2. Помещение картинки во временное хранилище: Получим двоичные данные файла и поместим их во хранилище с помощью функции ПоместитьВоВременноеХранилище, передав вторым параметром ЭтаФорма.УникальныйИдентификатор для привязки времени жизни данных к открытой форме.
  3. Создание элемента формы: Добавим элемент формы типа ПолеФормы и установим ему вид ВидПоляФормы.ПолеКартинки.
  4. Связывание с данными: Укажем имя созданного реквизита в свойстве ПутьКДанным созданного элемента.

Проанализируем пример кода, реализующий описанную логику на сервере:


// 1. Формируем массив новых реквизитов формы
МассивДобавляемыхРеквизитов = Новый Массив;
ИмяРеквизита = "Реквизит_Фото_" + Строка(Индекс);

ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка");
РеквизитФото = Новый РеквизитФормы(ИмяРеквизита, ОписаниеТипаСтрока, , "Фотография");
МассивДобавляемыхРеквизитов.Добавить(РеквизитФото);

// Изменяем реквизиты формы
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

// 2. Получаем адрес картинки во временном хранилище и записываем в реквизит
АдресФотографии = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
ЭтаФорма[ИмяРеквизита] = АдресФотографии;

// 3. Добавляем элемент формы для отображения картинки
ИмяЭлемента = "Поле_Фото_" + Формат(Индекс, "ЧГ=0");
ПолеФормы = ЭтаФорма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ГруппаРодитель);
ПолеФормы.Вид = ВидПоляФормы.ПолеКартинки;
ПолеФормы.ПутьКДанным = ИмяРеквизита;

Обработка события нажатия и отключение стандартного вывода адреса

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

Чтобы подавить это стандартное поведение и выполнить только собственный код (например, открыть фотографию в полном размере или выгрузить файл), необходимо в клиентской процедуре-обработчике установить значение СтандартнаяОбработка = Ложь.

Пример программного назначения обработчика события:


ПолеФормы.Гиперссылка = Истина;
ПолеФормы.УстановитьДействие("Нажатие", "Подключаемый_ПриНажатииНаГиперссылкуКартинки");

Пример реализации процедур-обработчиков на клиенте:


&НаКлиенте
Процедура Подключаемый_ПриНажатииНаГиперссылкуКартинки(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартный вывод адреса временного хранилища
    СтандартнаяОбработка = Ложь;
    
    // Выполняем пользовательскую логику
    ПоказатьПредупреждениеПользователю("Клик по картинке: " + Элемент.Имя);

КонецПроцедуры

Настройка режима масштабирования картинки

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

Рассмотрим варианты значения перечисления РазмерКартинки:


// Устанавливаем сохранение пропорций при масштабировании
ПолеФормы.РазмерКартинки = РазмерКартинки.Пропорционально;

Таким образом, комбинируя программное создание реквизита типа Строка, связывание его с ПолеФормы вида ПолеКартинки и переопределение СтандартнаяОбработка = Ложь, вы сможете гибко выводить любые динамические изображения на управляемых формах 1С.

← На главную