При разработке интерфейсов на управляемых формах (особенно для веб-клиента или сенсорных терминалов) часто возникает задача динамически отобразить внешнее изображение на кнопке или создать плитку интерактивных графических элементов. Однако разработчики сталкиваются с системным ограничением платформы 1С:Предприятие 8.3.
Разберем природу этого ограничения, выясним причину возникновения ошибок и подробно рассмотрим рабочие альтернативные варианты вывода кликабельных картинок.
В управляемых формах для свойств Картинка элементов вида КнопкаФормы и связанных с ними объектов КомандаФормы на уровне платформы установлено жесткое правило типизации. Допустимыми значениями могут быть только:
Новый Картинка без параметров).ОбщиеКартинки, например, БиблиотекаКартинок.ЗаписатьИЗакрыть).Попытка передать в свойство Кнопка.Картинка или Команда.Картинка объект типа Картинка, инициализированный из двоичных данных, файла с диска или через навигационную ссылку временного хранилища, приведет к ошибке выполнения («Недопустимое значение» или «Несоответствие типов»). Платформа не поддерживает хранение произвольных двоичных данных непосредственно внутри структуры команды формы.
Если требуется получить визуальный аналог кнопки с произвольным внешним изображением (из файла, базы данных или внешнего источника), наиболее простым решением является элемент формы с видом Поле картинки.
Разберем по шагам, как настроить этот элемент:
АдресКартинкиНаФорме с типом Строка).Поле картинки и привяжем его свойство ПутьКДанным к реквизиту АдресКартинкиНаФорме.Гиперссылка в значение Истина.Нажатие для этого поля. В обработчике описываем логику, которая должна выполняться при клике на картинку.Посмотрим на пример программного заполнения данных на сервере:
&НаСервере
Процедура ЗагрузитьКартинкуНаСервере(ДвоичныеДанныеКартинки)
// Помещаем двоичные данные во временное хранилище формы
АдресКартинкиНаФорме = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПолеКартинкиНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПоказатьОповещениеПользователя("Действие выполнено", , "Вы нажали на динамическую картинку-кнопку!");
КонецПроцедуры
Когда необходимо построить полноценное меню плиток, карточки каталога или сложные кнопки с динамическими иконками и текстом под веб-клиент, наиболее гибким решением становится Поле HTML документа.
Рассмотрим преимущества этого подхода:
ОбработкаПрерыванияПользователя / интеграционные механизмы платформы.Посмотрим на пример генерации простого HTML с кнопкой-картинкой:
&НаСервере
Процедура СформироватьКнопкиHTML()
СтрокаBase64 = ПолучитьBase64ИзДвоичныхДанных(ПолучитьДвоичныеДанныеКартинки());
ТекстHTML =
"<html><body style='margin:0; padding:10px;'>" +
" <a href='e1cib/click/action1' style='text-decoration:none;'>" +
" <div style='border:1px solid #ccc; padding:10px; display:inline-block; border-radius:5px;'>" +
" <img src='data:image/png;base64," + СтрокаBase64 + "' style='vertical-align:middle; width:24px; height:24px;' />" +
" <span style='margin-left:8px; font-family:sans-serif;'>Выполнить действие</span>" +
" </div>" +
" </a>" +
"</body></html>";
HTMLТекстПоля = ТекстHTML;
КонецПроцедуры
Если набор иконок для кнопок заранее известен, правильным архитектурным решением является их добавление в состав конфигурации в ветку Общие картинки. Это гарантирует:
Элементы.МояКнопка.Картинка = БиблиотекаКартинок.Успешно;.При публикации базы на веб-сервере (Apache или IIS) важно помнить, что веб-клиент исполняется внутри браузера и не имеет прямого доступа к файловой системе сервера по локальным путям. Передача изображений на клиент должна производиться исключительно через временное хранилище или навигационные ссылки (ПолучитьНавигационнуюСсылку), формирующие валидные URL для браузера.