К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно поменять картинку у кнопки 1С

Способы программно изменить картинку кнопки в 1С 8.3: свойство Картинка, библиотека картинок, картинка из файла и из хранилища. Примеры кода и типичные ошибки.

Картинка кнопки в 1С — это свойство Картинка элемента формы, которое можно изменить как в конфигураторе, так и программно в коде на встроенном языке. Программное изменение нужно, когда внешний вид кнопки должен зависеть от логики: состояния документа, прав пользователя, режима работы формы или результата проверки данных.

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

Важный нюанс: у кнопок командной панели, кнопок формы и декораций-картинок разные свойства и ограничения. Прежде чем менять картинку, убедитесь, что вы обращаетесь к правильному элементу и что для него задано корректное отображение (например, ОтображениеКнопки.Картинка или НадписьКартинка).

Где в 1С хранится картинка кнопки и как к ней обратиться

У каждой кнопки формы (элемент типа «Кнопка» или команда в командной панели) есть свойство Картинка типа Картинка. В конфигураторе оно задаётся в палитре свойств элемента формы, а программно доступно через коллекцию Элементы (управляемые формы) или ЭлементыФормы (обычные формы).

Обращение выглядит так: Элементы.КнопкаПечать.Картинка. Если кнопка находится в командной панели или подменю, обращаться к ней всё равно нужно по имени элемента формы, а не по имени команды — это частая причина ошибки «Поле объекта не обнаружено».

Способ 1. Установить картинку из библиотеки картинок платформы

Самый простой и надёжный вариант — использовать готовые картинки платформы. Они не требуют добавления файлов в конфигурацию и одинаково выглядят у всех пользователей.

// Управляемая форма, клиентская процедура

&НаКлиенте

Процедура УстановитьКартинкуКнопки(Команда)

Элементы.КнопкаПечать.Картинка = БиблиотекаКартинок.Печать;

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

Для обычной формы код аналогичен, только коллекция называется ЭлементыФормы:

// Обычная форма

ЭлементыФормы.КнопкаПечать.Картинка = БиблиотекаКартинок.Печать;

Посмотреть доступные имена картинок можно в конфигураторе: откройте палитру свойств любой кнопки, нажмите кнопку выбора в поле «Картинка» и перейдите на вкладку «Из библиотеки». Там же видно внешний вид каждой иконки в текущей версии платформы.

Способ 2. Установить свою картинку из общих картинок конфигурации

Если стандартных иконок недостаточно, добавьте изображение в ветку «Общие → Общие картинки» конфигуратора. Загруженная картинка хранится внутри конфигурации и доступна всем пользователям без дополнительных файлов.

Программно общая картинка подключается так же, как библиотечная, только через коллекцию ОбщиеКартинки:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Элементы.КнопкаЗагрузить.Картинка = ОбщиеКартинки.ЗагрузкаИзФайла;

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

Для управляемых форм дополнительно проверьте свойство Отображение кнопки: если стоит «Надпись», картинка не будет видна. Установите ОтображениеКнопки.Картинка или ОтображениеКнопки.НадписьКартинка программно либо в конфигураторе:

Элементы.КнопкаЗагрузить.Отображение = ОтображениеКнопки.НадписьКартинка;

Способ 3. Загрузить картинку из файла или двоичных данных

Когда изображение выбирает пользователь или оно хранится в базе (например, в реквизите типа «ХранилищеЗначения»), картинку создают из двоичных данных. Для управляемых форм загрузка файла с клиента делается через временное хранилище:

&НаКлиенте

Процедура ЗагрузитьКартинку(Команда)

НачатьПомещениеФайла(

Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),

, , Истина, УникальныйИдентификатор);

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

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, Доп) Экспорт

Если Результат Тогда

УстановитьКартинкуНаСервере(Адрес);

КонецЕсли;

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

&НаСервере

Процедура УстановитьКартинкуНаСервере(Адрес)

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

Элементы.КнопкаЛоготип.Картинка = Новый Картинка(ДвоичныеДанные);

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

Если картинка хранится в базе, двоичные данные извлекают из хранилища значения на сервере и точно так же передают в конструктор Новый Картинка(). Платформа корректно обрабатывает распространённые растровые форматы (PNG, JPEG, BMP, GIF); для иконок кнопок предпочтителен PNG с прозрачным фоном.

Динамическая смена картинки по условию

Типовая задача — менять иконку в зависимости от состояния объекта: например, показывать зелёный флажок для проведённого документа и серый — для непроведённого. Логику размещают в обработчиках ПриОткрытии, ПослеЗаписи или в отдельной процедуре обновления:

&НаКлиенте

Процедура ОбновитьКартинкуСтатуса()

Если Объект.Проведен Тогда

Элементы.КнопкаСтатус.Картинка = БиблиотекаКартинок.Провести;

Иначе

Элементы.КнопкаСтатус.Картинка = БиблиотекаКартинок.ОтменитьПроведение;

КонецЕсли;

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

Вызывайте такую процедуру из всех точек, где состояние может измениться: при открытии формы, после записи, после обработки выбора. Если картинка зависит от данных, которые меняются только на сервере, обновление выполняйте в серверной процедуре — например, в ПослеЗаписиНаСервере.

Порядок действий для смены картинки по условию
  1. 1
    Определите событие, при котором меняется состояние (открытие, запись, выбор значения)
  2. 2
    Создайте процедуру ОбновитьКартинку с веткой Если/Иначе по условию
  3. 3
    Присвойте Элементы.ИмяКнопки.Картинка нужное значение в каждой ветке
  4. 4
    Проверьте, что Отображение кнопки допускает показ картинки
  5. 5
    Вызовите процедуру из всех релевантных обработчиков
  6. 6
    Протестируйте оба состояния на форме

Особенности управляемых и обычных форм

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

В обычных формах ограничений меньше: весь код выполняется в одном контексте, обращение идёт через ЭлементыФормы, а файл можно прочитать напрямую через Новый ДвоичныеДанные(ИмяФайла). Однако обычные формы встречаются всё реже и поддерживаются в основном в старых конфигурациях.

Сравнение источников картинки

БиблиотекаКартинок

Подходит для типовых действий. Не требует хранения файлов, но набор иконок ограничен и зависит от версии платформы.

Общие картинки конфигурации

Подходит для фирменных иконок. Хранится в конфигурации, но увеличивает её размер и требует обновления конфигурации при замене.

Файл или хранилище значений

Подходит, когда картинку выбирает пользователь или она хранится в данных. Гибко, но требует серверного кода и контроля размера файлов.

Типичные ошибки и как их исправить

Самая частая проблема — картинка назначена, но не видна на форме. Причины: у кнопки отображение «Надпись», картинка прозрачная на прозрачном фоне и сливается с интерфейсом, либо код выполняется раньше создания элементов формы. Проверяйте свойство Отображение в первую очередь.

Вторая группа ошибок — обращение по неправильному имени. В управляемой форме имя кнопки в дереве элементов может отличаться от имени команды. Откройте редактор формы и сверьте имя элемента точно, включая регистр не важен, но опечатки критичны.

Типичные ошибки
01
Обращение Элементы.ИмяКоманды вместо имени элемента формы — ошибка «Поле объекта не обнаружено»
02
Отображение кнопки оставлено «Надпись» — картинка назначена, но визуально отсутствует
03
Чтение файла с диска в клиентской процедуре управляемой формы без временного хранилища — ошибка безопасности тонкого/веб-клиента
04
Использование картинки из библиотеки, отсутствующей в старой версии платформы — падение кода у части пользователей
05
Загрузка крупных изображений без сжатия — медленное открытие формы

Проверка результата

После изменений откройте форму в режиме предприятия и проверьте все состояния, при которых картинка должна меняться. Убедитесь, что иконка видна, не обрезана и соответствует состоянию объекта.

Контрольные точки

Как проверить результат

Видимость картинки на кнопке
Норма

Иконка отображается сразу при открытии формы

Тревожный признак

Кнопка пустая или показывает только текст

Смена по условию
Норма

Картинка меняется после записи/проведения документа

Тревожный признак

Иконка остаётся прежней до переоткрытия формы

Работа на тонком и веб-клиенте
Норма

Код выполняется без ошибок на всех клиентах

Тревожный признак

Ошибка доступа к файлу на тонком клиенте

Скорость открытия формы
Норма

Форма открывается без заметной задержки

Тревожный признак

Пауза при открытии из-за тяжёлой картинки

Если картинок под разные состояния много, удобно хранить соответствие «состояние → имя картинки» в структуре или соответствии и выбирать иконку одной строкой вместо длинной цепочки Если/Иначе. Такой код проще расширять при добавлении новых статусов.
ПЗ
Практическое замечание

Частые вопросы

Можно ли поменять картинку кнопки без изменения конфигурации?

Да, если изменение делается программно в расширении конфигурации или во внешней обработке. Расширение позволяет заимствовать форму и дописать код, меняющий свойство Картинка, не затрагивая основную конфигурацию — это безопасно для обновлений.

Почему картинка кнопки не отображается, хотя код выполняется без ошибок?

Чаще всего у кнопки свойство Отображение установлено в «Надпись». Установите «Картинка» или «НадписьКартинка» в конфигураторе либо программно через ОтображениеКнопки. Также проверьте, что сама картинка не пустая и не полностью прозрачная.

Как убрать картинку с кнопки программно?

Присвойте свойству пустую картинку: Элементы.ИмяКнопки.Картинка = Новый Картинка; — конструктор без параметров создаёт пустое изображение, и кнопка останется только с надписью.

Какие форматы изображений поддерживает свойство Картинка?

Платформа работает с распространёнными растровыми форматами: PNG, JPEG, BMP, GIF. Для иконок кнопок лучше использовать PNG с прозрачным фоном небольшого размера — он корректно смотрится на любой теме интерфейса.

Можно ли менять картинку кнопки командной панели динамически?

Да, кнопки командной панели — такие же элементы формы. Обратитесь к элементу по его имени в дереве элементов формы (не по имени команды) и присвойте свойству Картинка новое значение в нужном обработчике.

Работает ли смена картинки на веб-клиенте?

Картинки из библиотеки и общих картинок работают везде. Загрузка из файла тоже возможна, но только через помещение файла во временное хранилище с последующей серверной обработкой — прямой доступ к диску пользователя на веб-клиенте запрещён.

Итог

Что важно запомнить

Картинка кнопки меняется через свойство Картинка элемента формы: из БиблиотекаКартинок или ОбщиеКартинки — одной строкой, из файла или хранилища — через двоичные данные и серверный код. Всегда проверяйте свойство Отображение кнопки и тестируйте все состояния, при которых иконка должна меняться.