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