Разработка и Конфигурация · 11 мин
Как программно поменять картинку у кнопки 1С
Способы программно изменить картинку кнопки в 1С 8.3: свойство Картинка, библиотека картинок, картинка из файла и из хранилища. Примеры кода и типичные ошибки.
Картинка кнопки в 1С — это свойство Картинка элемента формы, которое можно изменить как в конфигураторе, так и программно в коде на встроенном языке. Программное изменение нужно, когда внешний вид кнопки должен зависеть от логики: состояния документа, прав пользователя, режима работы формы или результата проверки данных.
Основных сценария два: подставить картинку из стандартной библиотеки платформы (БиблиотекаКартинок) или загрузить собственное изображение — из общей картинки конфигурации, файла на диске или двоичных данных из хранилища значений. Ниже разобраны оба подхода с готовыми примерами кода для управляемых и обычных форм.
Важный нюанс: у кнопок командной панели, кнопок формы и декораций-картинок разные свойства и ограничения. Прежде чем менять картинку, убедитесь, что вы обращаетесь к правильному элементу и что для него задано корректное отображение (например, ОтображениеКнопки.Картинка или НадписьКартинка).
Где в 1С хранится картинка кнопки и как к ней обратиться
У каждой кнопки формы (элемент типа «Кнопка» или команда в командной панели) есть свойство Картинка типа Картинка. В конфигураторе оно задаётся в палитре свойств элемента формы, а программно доступно через коллекцию Элементы (управляемые формы) или ЭлементыФормы (обычные формы).
Обращение выглядит так: Элементы.КнопкаПечать.Картинка. Если кнопка находится в командной панели или подменю, обращаться к ней всё равно нужно по имени элемента формы, а не по имени команды — это частая причина ошибки «Поле объекта не обнаружено».
Способ 1. Установить картинку из библиотеки картинок платформы
Самый простой и надёжный вариант — использовать готовые картинки платформы. Они не требуют добавления файлов в конфигурацию и одинаково выглядят у всех пользователей.
// Управляемая форма, клиентская процедура
&НаКлиенте
Процедура УстановитьКартинкуКнопки(Команда)
Элементы.КнопкаПечать.Картинка = БиблиотекаКартинок.Печать;
КонецПроцедуры
Для обычной формы код аналогичен, только коллекция называется ЭлементыФормы:
// Обычная форма
ЭлементыФормы.КнопкаПечать.Картинка = БиблиотекаКартинок.Печать;
Посмотреть доступные имена картинок можно в конфигураторе: откройте палитру свойств любой кнопки, нажмите кнопку выбора в поле «Картинка» и перейдите на вкладку «Из библиотеки». Там же видно внешний вид каждой иконки в текущей версии платформы.
Способ 2. Установить свою картинку из общих картинок конфигурации
Если стандартных иконок недостаточно, добавьте изображение в ветку «Общие → Общие картинки» конфигуратора. Загруженная картинка хранится внутри конфигурации и доступна всем пользователям без дополнительных файлов.
Программно общая картинка подключается так же, как библиотечная, только через коллекцию ОбщиеКартинки:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.КнопкаЗагрузить.Картинка = ОбщиеКартинки.ЗагрузкаИзФайла;
КонецПроцедуры
Для управляемых форм дополнительно проверьте свойство Отображение кнопки: если стоит «Надпись», картинка не будет видна. Установите ОтображениеКнопки.Картинка или ОтображениеКнопки.НадписьКартинка программно либо в конфигураторе:
Элементы.КнопкаЗагрузить.Отображение = ОтображениеКнопки.НадписьКартинка;
Способ 3. Загрузить картинку из файла или двоичных данных
Когда изображение выбирает пользователь или оно хранится в базе (например, в реквизите типа «ХранилищеЗначения»), картинку создают из двоичных данных. Для управляемых форм загрузка файла с клиента делается через временное хранилище:
&НаКлиенте
Процедура ЗагрузитьКартинку(Команда)
НачатьПомещениеФайла(
Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),
, , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, Доп) Экспорт
Если Результат Тогда
УстановитьКартинкуНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьКартинкуНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Элементы.КнопкаЛоготип.Картинка = Новый Картинка(ДвоичныеДанные);
КонецПроцедуры
Если картинка хранится в базе, двоичные данные извлекают из хранилища значения на сервере и точно так же передают в конструктор Новый Картинка(). Платформа корректно обрабатывает распространённые растровые форматы (PNG, JPEG, BMP, GIF); для иконок кнопок предпочтителен PNG с прозрачным фоном.
Динамическая смена картинки по условию
Типовая задача — менять иконку в зависимости от состояния объекта: например, показывать зелёный флажок для проведённого документа и серый — для непроведённого. Логику размещают в обработчиках ПриОткрытии, ПослеЗаписи или в отдельной процедуре обновления:
&НаКлиенте
Процедура ОбновитьКартинкуСтатуса()
Если Объект.Проведен Тогда
Элементы.КнопкаСтатус.Картинка = БиблиотекаКартинок.Провести;
Иначе
Элементы.КнопкаСтатус.Картинка = БиблиотекаКартинок.ОтменитьПроведение;
КонецЕсли;
КонецПроцедуры
Вызывайте такую процедуру из всех точек, где состояние может измениться: при открытии формы, после записи, после обработки выбора. Если картинка зависит от данных, которые меняются только на сервере, обновление выполняйте в серверной процедуре — например, в ПослеЗаписиНаСервере.
- 1Определите событие, при котором меняется состояние (открытие, запись, выбор значения)
- 2Создайте процедуру ОбновитьКартинку с веткой Если/Иначе по условию
- 3Присвойте Элементы.ИмяКнопки.Картинка нужное значение в каждой ветке
- 4Проверьте, что Отображение кнопки допускает показ картинки
- 5Вызовите процедуру из всех релевантных обработчиков
- 6Протестируйте оба состояния на форме
Особенности управляемых и обычных форм
В управляемых формах помните про разделение контекста: БиблиотекаКартинок и ОбщиеКартинки доступны и на клиенте, и на сервере, а работа с файлами и хранилищем значений — только на сервере (файл сначала помещается во временное хранилище). Также в управляемой форме нельзя обратиться к элементу, которого нет в дереве элементов формы, — динамически созданные кнопки добавляют через Элементы.Добавить() в серверной процедуре.
В обычных формах ограничений меньше: весь код выполняется в одном контексте, обращение идёт через ЭлементыФормы, а файл можно прочитать напрямую через Новый ДвоичныеДанные(ИмяФайла). Однако обычные формы встречаются всё реже и поддерживаются в основном в старых конфигурациях.
Сравнение источников картинки
Подходит для типовых действий. Не требует хранения файлов, но набор иконок ограничен и зависит от версии платформы.
Подходит для фирменных иконок. Хранится в конфигурации, но увеличивает её размер и требует обновления конфигурации при замене.
Подходит, когда картинку выбирает пользователь или она хранится в данных. Гибко, но требует серверного кода и контроля размера файлов.
Типичные ошибки и как их исправить
Самая частая проблема — картинка назначена, но не видна на форме. Причины: у кнопки отображение «Надпись», картинка прозрачная на прозрачном фоне и сливается с интерфейсом, либо код выполняется раньше создания элементов формы. Проверяйте свойство Отображение в первую очередь.
Вторая группа ошибок — обращение по неправильному имени. В управляемой форме имя кнопки в дереве элементов может отличаться от имени команды. Откройте редактор формы и сверьте имя элемента точно, включая регистр не важен, но опечатки критичны.
Проверка результата
После изменений откройте форму в режиме предприятия и проверьте все состояния, при которых картинка должна меняться. Убедитесь, что иконка видна, не обрезана и соответствует состоянию объекта.
Как проверить результат
Иконка отображается сразу при открытии формы
Кнопка пустая или показывает только текст
Картинка меняется после записи/проведения документа
Иконка остаётся прежней до переоткрытия формы
Код выполняется без ошибок на всех клиентах
Ошибка доступа к файлу на тонком клиенте
Форма открывается без заметной задержки
Пауза при открытии из-за тяжёлой картинки
Если картинок под разные состояния много, удобно хранить соответствие «состояние → имя картинки» в структуре или соответствии и выбирать иконку одной строкой вместо длинной цепочки Если/Иначе. Такой код проще расширять при добавлении новых статусов.
Частые вопросы
Можно ли поменять картинку кнопки без изменения конфигурации?
Да, если изменение делается программно в расширении конфигурации или во внешней обработке. Расширение позволяет заимствовать форму и дописать код, меняющий свойство Картинка, не затрагивая основную конфигурацию — это безопасно для обновлений.
Почему картинка кнопки не отображается, хотя код выполняется без ошибок?
Чаще всего у кнопки свойство Отображение установлено в «Надпись». Установите «Картинка» или «НадписьКартинка» в конфигураторе либо программно через ОтображениеКнопки. Также проверьте, что сама картинка не пустая и не полностью прозрачная.
Как убрать картинку с кнопки программно?
Присвойте свойству пустую картинку: Элементы.ИмяКнопки.Картинка = Новый Картинка; — конструктор без параметров создаёт пустое изображение, и кнопка останется только с надписью.
Какие форматы изображений поддерживает свойство Картинка?
Платформа работает с распространёнными растровыми форматами: PNG, JPEG, BMP, GIF. Для иконок кнопок лучше использовать PNG с прозрачным фоном небольшого размера — он корректно смотрится на любой теме интерфейса.
Можно ли менять картинку кнопки командной панели динамически?
Да, кнопки командной панели — такие же элементы формы. Обратитесь к элементу по его имени в дереве элементов формы (не по имени команды) и присвойте свойству Картинка новое значение в нужном обработчике.
Работает ли смена картинки на веб-клиенте?
Картинки из библиотеки и общих картинок работают везде. Загрузка из файла тоже возможна, но только через помещение файла во временное хранилище с последующей серверной обработкой — прямой доступ к диску пользователя на веб-клиенте запрещён.
Что важно запомнить
Картинка кнопки меняется через свойство Картинка элемента формы: из БиблиотекаКартинок или ОбщиеКартинки — одной строкой, из файла или хранилища — через двоичные данные и серверный код. Всегда проверяйте свойство Отображение кнопки и тестируйте все состояния, при которых иконка должна меняться.