Как программно назначить произвольную картинку кнопке на управляемой форме в 1С 8.3?

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

При разработке интерактивных интерфейсов в управляемом приложении 1С:Предприятие 8.3 часто возникает задача динамического вывода изображений на элементы формы. Однако при попытке программно присвоить объекту КнопкаФормы произвольное изображение из ХранилищаЗначений, файла или двоичных данных разработчики сталкиваются с ошибкой параметра.

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

Причина ошибки и ограничения платформы 1С

Рассмотрим, как работает стандартный механизм назначения картинок для элементов формы. Для общих картинок конфигурации код выглядит следующим образом:


НоваяКнопка = Элементы.Добавить("КнопкаСмайл", Тип("КнопкаФормы"), Элементы.ГруппаКнопок);
НоваяКнопка.Заголовок = "Смайл";
НоваяКнопка.Вид = ВидКнопкиФормы.Гиперссылка;
НоваяКнопка.Отображение = ОтображениеКнопки.Картинка;
НоваяКнопка.Картинка = БиблиотекаКартинок.СписокСмай;

Данный код работает корректно. Однако при попытке подставить вместо БиблиотекаКартинок.<ИмяКартинки> объект типа Картинка, сформированный из двоичных данных или полученный из хранилища значений, платформа выдает ошибку.

Обратимся к Синтаксис-помощнику для свойства Картинка объекта КнопкаФормы:

Примечание платформы: Если картинка задается программно, может быть установлена картинка вида Пустая или ИзБиблиотеки.

Таким образом, прямое присвоение произвольного динамического изображения свойству Картинка элемента КнопкаФормы заблокировано на уровне платформы. Кроме того, динамическое создание новых метаданных (общих картинок) во время работы пользовательского сеанса невозможно — их добавление выполняется только в режиме конфигуратора или при пакетной выгрузке/загрузке конфигурации.

Альтернативный способ 1: Использование элемента «Поле картинки»

Для создания интерактивной «кнопки» с произвольным динамическим изображением проанализируем вариант с элементом Поле картинки. Этот элемент позволяет выводить изображения по адресу во временном хранилище и отбатывать клики пользователя.

Разберем реализацию по шагам:

  1. Добавим на форму реквизит с типом Строка для хранения адреса картинки во временном хранилище.
  2. Поместим двоичные данные изображения во временное хранилище и запишем полученный адрес в реквизит.
  3. Создадим элемент формы с видом Поле картинки, свяжем его с реквизитом и включим режим гиперссылки.

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

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

Альтернативный способ 2: Использование декорации с видом «Картинка»

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

Посмотрим на пример программного создания декорации-картинки:


&НаСервере
Процедура СоздатьДекорациюКартинкуНаСервере()

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

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

Альтернативный способ 3: Использование Поля HTML-документа

Если требуется выводить сложную сетку кнопок с произвольными изображениями (например, каталог товаров или панели смайлов), сформируем динамический HTML-код. Внутри HTML выведем теги <img> с картинками в формате Base64 или по URL-ссылкам и обработаем клики через события документа.

  1. Разместим на форме элемент Поле HTML документа.
  2. Сформируем HTML-разметку с кнопками-картинками.
  3. Перехватим переход по ссылкам или клики в событии ПриНажатии поля HTML-документа.

Альтернативный способ 4: Использование Расширения конфигурации

В случаях, когда список картинок заранее известен на этапе разработки, но их не хочется добавлять в основную конфигурацию (чтобы не снимать её с поддержки), добавим изображения в общие картинки Расширения конфигурации.

В этом случае обращения к библиотеке картинок из расширения будут доступны программно без ограничений:


ЭлементКнопка.Картинка = БиблиотекаКартинокИмениРасширения.МояДинамическаяКартинка;

Резюме

Прямая установка произвольной картинки для стандартного объекта КнопкаФормы через свойство Картинка не поддерживается платформой 1С:Предприятие 8.3. Для реализации этой задачи следует использовать элемент Поле картинки или Декорацию формы с установленным флагом Гиперссылка = Истина и адресом во временном хранилище.

← На главную