Как использовать внешние картинки для кнопок и динамических элементов в управляемых формах 1С?

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

При разработке интерфейсов на управляемых формах (особенно для веб-клиента или сенсорных терминалов) часто возникает задача динамически отобразить внешнее изображение на кнопке или создать плитку интерактивных графических элементов. Однако разработчики сталкиваются с системным ограничением платформы 1С:Предприятие 8.3.

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

Ограничение платформы: почему нельзя напрямую назначить картинку кнопке

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

  1. Пустая картинка (объект Новый Картинка без параметров).
  2. Картинка из библиотеки (системные стандартные пиктограммы или предопределенные объекты из ветки метаданных ОбщиеКартинки, например, БиблиотекаКартинок.ЗаписатьИЗакрыть).

Попытка передать в свойство Кнопка.Картинка или Команда.Картинка объект типа Картинка, инициализированный из двоичных данных, файла с диска или через навигационную ссылку временного хранилища, приведет к ошибке выполнения («Недопустимое значение» или «Несоответствие типов»). Платформа не поддерживает хранение произвольных двоичных данных непосредственно внутри структуры команды формы.

Способ 1. Использование «Поля картинки» в режиме гиперссылки

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

Разберем по шагам, как настроить этот элемент:

  1. Добавим в форму строковый реквизит (например, АдресКартинкиНаФорме с типом Строка).
  2. Создадим элемент формы с типом Поле картинки и привяжем его свойство ПутьКДанным к реквизиту АдресКартинкиНаФорме.
  3. Установим свойство элемента Гиперссылка в значение Истина.
  4. Создадим обработчик события Нажатие для этого поля. В обработчике описываем логику, которая должна выполняться при клике на картинку.

Посмотрим на пример программного заполнения данных на сервере:


&НаСервере
Процедура ЗагрузитьКартинкуНаСервере(ДвоичныеДанныеКартинки)
    // Помещаем двоичные данные во временное хранилище формы
    АдресКартинкиНаФорме = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПолеКартинкиНажатие(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПоказатьОповещениеПользователя("Действие выполнено", , "Вы нажали на динамическую картинку-кнопку!");
КонецПроцедуры

Способ 2. Поле HTML-документа (универсальный интерфейс для веб-клиента)

Когда необходимо построить полноценное меню плиток, карточки каталога или сложные кнопки с динамическими иконками и текстом под веб-клиент, наиболее гибким решением становится Поле HTML документа.

Рассмотрим преимущества этого подхода:

  1. Изображения внедряются прямо в разметку страницы в формате Base64 (Data URL) либо загружаются по внешним URL.
  2. Появляется возможность задавать любые эффекты при наведении, анимации и стили через стандартный CSS.
  3. Нажатия на элементы интерфейса передаются в код 1С через перехват навигации или объект ОбработкаПрерыванияПользователя / интеграционные механизмы платформы.

Посмотрим на пример генерации простого 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;
КонецПроцедуры

Способ 3. Предопределенные пиктограммы и библиотеки картинок

Если набор иконок для кнопок заранее известен, правильным архитектурным решением является их добавление в состав конфигурации в ветку Общие картинки. Это гарантирует:

  1. Мгновенную отдачу графики клиенту без дополнительных обращений к базе или внешним дискам.
  2. Корректное кэширование браузером в веб-клиенте.
  3. Возможность программного переключения стандартных картинок для кнопок через конструкцию вида Элементы.МояКнопка.Картинка = БиблиотекаКартинок.Успешно;.

Особенности работы графики в веб-клиенте

При публикации базы на веб-сервере (Apache или IIS) важно помнить, что веб-клиент исполняется внутри браузера и не имеет прямого доступа к файловой системе сервера по локальным путям. Передача изображений на клиент должна производиться исключительно через временное хранилище или навигационные ссылки (ПолучитьНавигационнуюСсылку), формирующие валидные URL для браузера.

← На главную