При разработке интерактивных интерфейсов в управляемом приложении 1С:Предприятие 8.3 часто возникает задача динамического вывода изображений на элементы формы. Однако при попытке программно присвоить объекту КнопкаФормы произвольное изображение из ХранилищаЗначений, файла или двоичных данных разработчики сталкиваются с ошибкой параметра.
В этой статье мы разберем причины данного ограничения платформы и рассмотрим проверенные альтернативные варианты решения задачи.
Рассмотрим, как работает стандартный механизм назначения картинок для элементов формы. Для общих картинок конфигурации код выглядит следующим образом:
НоваяКнопка = Элементы.Добавить("КнопкаСмайл", Тип("КнопкаФормы"), Элементы.ГруппаКнопок);
НоваяКнопка.Заголовок = "Смайл";
НоваяКнопка.Вид = ВидКнопкиФормы.Гиперссылка;
НоваяКнопка.Отображение = ОтображениеКнопки.Картинка;
НоваяКнопка.Картинка = БиблиотекаКартинок.СписокСмай;
Данный код работает корректно. Однако при попытке подставить вместо БиблиотекаКартинок.<ИмяКартинки> объект типа Картинка, сформированный из двоичных данных или полученный из хранилища значений, платформа выдает ошибку.
Обратимся к Синтаксис-помощнику для свойства Картинка объекта КнопкаФормы:
Примечание платформы: Если картинка задается программно, может быть установлена картинка вида Пустая или ИзБиблиотеки.
Таким образом, прямое присвоение произвольного динамического изображения свойству Картинка элемента КнопкаФормы заблокировано на уровне платформы. Кроме того, динамическое создание новых метаданных (общих картинок) во время работы пользовательского сеанса невозможно — их добавление выполняется только в режиме конфигуратора или при пакетной выгрузке/загрузке конфигурации.
Для создания интерактивной «кнопки» с произвольным динамическим изображением проанализируем вариант с элементом Поле картинки. Этот элемент позволяет выводить изображения по адресу во временном хранилище и отбатывать клики пользователя.
Разберем реализацию по шагам:
Строка для хранения адреса картинки во временном хранилище.Поле картинки, свяжем его с реквизитом и включим режим гиперссылки.
// На сервере
&НаСервере
Процедура ИнициализироватьКартинкуКнопкуНаСервере()
// Получаем двоичные данные изображения (например, из ХранилищаЗначений или файла)
ДвоичныеДанныеКартинки = ПолучитьКартинкуИзХранилища();
// Помещаем данные во временное хранилище
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, ЭтаФорма.УникальныйИдентификатор);
// Создаем элемент формы "Поле картинки"
ИмяЭлемента = "ИнтерактивнаяКартинка";
ЭлементКартинка = Элементы.Добавить(ИмяЭлемента, Тип("ЭлементФормы"), Элементы.ГруппаФормы);
ЭлементКартинка.Вид = ВидЭлементаФормы.ПолеКартинки;
ЭлементКартинка.ПутьКДанным = "АдресКартинки";
ЭлементКартинка.Гиперссылка = Истина; // Включаем поведение гиперссылки
// Назначаем обработчик нажатия
ЭлементКартинка.УстановитьДействие("Нажатие", "ИнтерактивнаяКартинкаНажатие");
КонецПроцедуры
В клиентском обработчике события Нажатие реализуем необходимую бизнес-логику, которая должна срабатывать при клике по изображению.
Второй способ заключается в использовании декорации формы. Элемент ДекорацияФормы с видом Картинка также умеет принимать изображения из временного хранилища и реагировать на клики пользователя.
Посмотрим на пример программного создания декорации-картинки:
&НаСервере
Процедура СоздатьДекорациюКартинкуНаСервере()
АдресРесурса = ПоместитьВоВременноеХранилище(ДвоичныеДанныеИзображения, ЭтаФорма.УникальныйИдентификатор);
Декорация = Элементы.Добавить("КартинкаКнопка", Тип("ДекорацияФормы"), Элементы.ОсновнаяГруппа);
Декорация.Вид = ВидДекорацииФормы.Картинка;
Декорация.Картинка = Новый Картинка(АдресРесурса);
Декорация.Гиперссылка = Истина;
Декорация.УстановитьДействие("Нажатие", "ОбработкаНажатияКартинки");
КонецПроцедуры
Если требуется выводить сложную сетку кнопок с произвольными изображениями (например, каталог товаров или панели смайлов), сформируем динамический HTML-код. Внутри HTML выведем теги <img> с картинками в формате Base64 или по URL-ссылкам и обработаем клики через события документа.
Поле HTML документа.ПриНажатии поля HTML-документа.В случаях, когда список картинок заранее известен на этапе разработки, но их не хочется добавлять в основную конфигурацию (чтобы не снимать её с поддержки), добавим изображения в общие картинки Расширения конфигурации.
В этом случае обращения к библиотеке картинок из расширения будут доступны программно без ограничений:
ЭлементКнопка.Картинка = БиблиотекаКартинокИмениРасширения.МояДинамическаяКартинка;
Прямая установка произвольной картинки для стандартного объекта КнопкаФормы через свойство Картинка не поддерживается платформой 1С:Предприятие 8.3. Для реализации этой задачи следует использовать элемент Поле картинки или Декорацию формы с установленным флагом Гиперссылка = Истина и адресом во временном хранилище.