Как динамически изменить цвет фона поля ввода при выборе значения в обычной форме 1С?

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

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

Однако разработчики часто сталкиваются с ситуацией, когда код изменения цвета срабатывает при открытии формы, но отказывается менять цвет непосредственно в момент интерактивного выбора или редактирования данных в обработчике события ПриИзменении. Разберем причину этого поведения и рассмотрим правильный способ управления цветом полей.

Выясним причину проблемы: ЦветФона против ЦветФонаПоля

Проанализируем, почему код с установкой свойства ЦветФона не дает визуального результата при изменении значения в поле ввода обычного приложения.

Элемент управления типа ПолеВвода на обычной форме состоит из нескольких визуальных областей: общей рамки элемента и внутренней области редактирования текста. Свойство ЦветФона задает цвет контейнера элемента, а непосредственно внутреннюю область текстового поля окрашивает свойство ЦветФонаПоля.

Когда мы устанавливаем свойство ЦветФона динамически из кода процедуры ПриИзменении, значение свойства в объекте меняется, но визуально внутреннее поле ввода продолжает перекрываться стандартным цветом текстовой области. Именно поэтому в отладчике свойство может содержать нужный цвет, хотя на экране поле кажется обычным.

Разберем решение: правильное управление цветом

Для корректной динамической подсветки поля ввода необходимо обращаться к свойству ЦветФонаПоля элемента управления. При необходимости вернуть стандартный цвет элементу, ему присваивается конструктор Новый Цвет или системное значение ЦветаСтиля.ЦветФонаПоля.

Рассмотрим практический пример. Создадим вспомогательную процедуру оформления поля ввода контрагента и вызовем ее в обработчиках ПриОткрытии и ПриИзменении:


Процедура ВыделитьКонтрагента(ТекущийКонтрагент)

    Если ЛояльныйКлиент(ТекущийКонтрагент) Тогда
        // Задаем цвет внутреннего фона поля
        ЭлементыФормы.Контрагент.ЦветФонаПоля = WebЦвета.БледноЗеленый;
    Иначе
        // Сбрасываем цвет поля к системному значению по умолчанию
        ЭлементыФормы.Контрагент.ЦветФонаПоля = Новый Цвет;
    КонецЕсли;

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

Процедура ПриОткрытии()
    ВыделитьКонтрагента(ЗаполнениеДокумента.Контрагент);
КонецПроцедуры

Процедура КонтрагентПриИзменении(Элемент)
    ВыделитьКонтрагента(ЭлементыФормы.Контрагент.Значение);
КонецПроцедуры

Если требуется изменить не только область текста, но и всю рамку вокруг поля, допускается одновременное изменение двух свойств — ЦветФона и ЦветФонаПоля.

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

Рассмотрим несколько важный нюансов, которые могут влиять на отображение цвета элемента управления:

  1. Фокус ввода активного элемента: Поверьте, находится ли курсор внутри редактируемого элемента. В момент взаимодействия с полем операционная система может перекрывать пользовательский цвет системным фокусом выделения текста. Цвет проявится полностью в момент перехода на следующее поле.
  2. Режимы "ТолькоПросмотр" и "Доступность": Если у элемента установлены свойства ТолькоПросмотр = Истина или Доступность = Ложь, платформа игнорирует заданные настройки цвета и отрисовывает элемент стандартным системным серым цветом.
  3. Цвет текста: Если сплошная яркая заливка элемента ухудшает читаемость текста, вместо фона можно регулировать свойство ЦветТекстаПоля.

Альтернативный вариант: Индикаторы состояния

Яркая цветная заливка больших элементов формы может утомлять пользователя при постоянной работе с документами. На практике хорошим решением является добавление отдельного графического или текстового индикатора рядом с полем ввода.

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

← На главную