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