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