При разработке управляемых форм часто возникает задача визуального выделения реквизитов: например, подсветить незаполненные поля красным фоном, а корректно заполненные — зеленым. Однако при попытке настроить такое поведение через стандартный механизм УсловноеОформление формы разработчики сталкиваются с тем, что цвет текста или шрифт меняются корректно, а цвет фона одиночного поля ввода игнорируется платформой. Проанализируем, почему возникает такое поведение и как правильно реализовать подобную логику.
Разберем внутренние механизмы платформы 1С:Предприятие 8.3 при работе с условным оформлением управляемых форм. Механизм УсловноеОформление формы проектировался преимущественно для табличных элементов интерфейса: динамических списков, табличных частей и таблиц значений. При применении его к одиночным полям ввода шапки формы действуют строгие ограничения:
Шрифт, ЦветТекста, Текст, Видимость, Доступность и ТолькоПросмотр. Свойство ЦветФона через условное оформление применяется только к ячейкам и строкам таблиц.ТолькоПросмотр = Истина или Доступность = Ложь, индивидуальный цвет фона также не будет отображаться.Рассмотрим основной способ решения задачи — прямое управление свойством ЦветФона элемента формы через встроенный язык. Для этого нам не требуется условное оформление, изменение цвета выполняется непосредственно в событиях формы.
Разберем по шагам реализацию обработчиков на клиенте и сервере:
ПриИзменении, чтобы интерфейс мгновенно реагировал на действия пользователя без лишних серверных вызовов.ПриСозданииНаСервере или ПриЧтенииНаСервере.Посмотрим на пример программной реализации:
&НаКлиенте
Процедура ОбновитьЦветПоля(ИмяПоля, ЗначениеПоля)
Элемент = Элементы[ИмяПоля];
Если ПустаяСтрока(ЗначениеПоля) Тогда
// Подсвечиваем незаполненное поле светло-красным цветом
Элемент.ЦветФона = Новый Цвет(255, 200, 200);
Иначе
// Подсвечиваем заполненное поле светло-зеленым цветом
Элемент.ЦветФона = Новый Цвет(200, 255, 200);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Первичная инициализация цвета фона при открытии формы
ОбновитьЦветПоля("ПолеВвода1", Объект.ПолеВвода1);
ОбновитьЦветПоля("ПолеВвода2", Объект.ПолеВвода2);
КонецПроцедуры
&НаКлиенте
Процедура ПолеВвода1ПриИзменении(Элемент)
ОбновитьЦветПоля("ПолеВвода1", Объект.ПолеВвода1);
КонецПроцедуры
Если требуется вернуть стандартный системный цвет элемента формы, свойству ЦветФона можно присвоить значение по умолчанию: Элементы.ИмяПоля.ЦветФона = Новый Цвет; или использовать системный цвет ЦветаСтиля.ЦветФонаПоля.
Если необходимо сохранить декларативную настройку без написания программного кода, проанализируем альтернативные параметры оформления, которые гарантированно поддерживаются для полей ввода:
Шрифт.Выясним, какие стандартные механизмы валидации предоставляет платформа 1С для выделения незаполненных полей без переопределения цветов вручную:
АвтоОтметкаНезаполненного: при установке в значение Истина платформа автоматически выделяет пустое поле стандартной красной пунктирной рамкой.ПроверкаЗаполнения: установка значения Выдавать ошибку активирует проверку при записи объекта и автоматически подсвечивает обязательные поля.Декорация - надпись с текстом ошибки или предупреждающей иконкой, управляя его видимостью в зависимости от заполненности данных.