Как программно установить автоцвет (цвет по умолчанию) для элемента формы в 1С?

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

При активной разработке интерфейсов в 1С:Предприятии часто возникает необходимость динамически изменять оформление элементов управления. Например, мы хотим подсветить поле ввода красным цветом при ошибке заполнения, а после исправления вернуть его к стандартному системному виду. Казалось бы, задача тривиальная. Однако при попытке программно вернуть элементу "автоцвет" разработчики часто сталкиваются с неприятной ошибкой платформы: "Поле объекта недоступно для записи (Вид)". В этой статье мы подробно разберем, почему возникает эта ошибка, как работает механизм цветов в 1С и как правильно сбрасывать оформление элементов формы к значениям по умолчанию. При необходимости просматривать и менять параметры элементов непосредственно в режиме «Предприятие» пригодится обработка для редактирования свойств открытых форм.

Выясняем причину ошибки: почему свойство «Вид» недоступно для записи?

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


// Данный код вызовет ошибку!
ЭлементыФормы.Номенклатура.ЦветФонаПоля.Вид = ВидЦвета.АвтоЦвет;

При выполнении этой строки платформа 1С выдает ошибку рантайма. Причина кроется в архитектуре встроенного языка 1С:Предприятия. Объект Цвет спроектирован как неизменяемый (immutable). Это значит, что после того, как объект был создан, мы не можем изменить его внутренние свойства — такие как Вид, составляющие RGB (красный, зеленый, синий) или привязку к стилю. Свойство Вид доступно исключительно для чтения.

Чтобы изменить цвет элемента формы, мы не должны пытаться модифицировать свойства существующего объекта Цвет. Вместо этого нам необходимо создать новый экземпляр объекта Цвет с требуемыми параметрами и целиком присвоить его свойству элемента управления. Для удобного визуального подбора точных оттенков при формировании цвета пригодится инструмент для подбора цвета в интерфейсе 1С.

Способ 1. Сброс цвета с помощью пустого конструктора (Рекомендуемый способ)

Рассмотрим самый простой, быстрый и надежный способ вернуть элементу формы цвет по умолчанию. Для этого мы воспользуемся особенностью инициализации объекта Цвет через пустой конструктор. Разберем по шагам, как это работает.

Когда мы вызываем конструктор без параметров, платформа автоматически создает объект цвета с видом ВидЦвета.АвтоЦвет. Присвоив этот объект элементу формы, мы заставим платформу сбросить локальное оформление и использовать системные настройки.

Посмотрим на пример кода для обычных форм:


// Сброс цвета фона поля к автоцвету
ЭлементыФормы.Номенклатура.ЦветФонаПоля = Новый Цвет;

Для большей наглядности мы можем расписать этот процесс через промежуточную переменную, хотя на практике предпочтительнее использовать однострочный вариант:


// Альтернативный многострочный вариант
НовыйЦвет = Новый Цвет; // Создается цвет с Вид = ВидЦвета.АвтоЦвет
ЭлементыФормы.Номенклатура.ЦветФонаПоля = НовыйЦвет;

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

Способ 2. Использование цветов стиля оформления

Другой вариант решения задачи — это явное назначение цвета из предопределенной палитры стилей конфигурации. В платформе 1С существует глобальный контекст ЦветаСтиля, который содержит системные настройки цветов интерфейса (например, цвет фона поля, цвет текста кнопки и т.д.).

Рассмотрим пример использования цветов стиля:


// Присвоение стандартного цвета стиля для фона поля ввода
ЭлементыФормы.Номенклатура.ЦветФонаПоля = ЦветаСтиля.ЦветФонаПоля;

Этот подход также отлично работает и визуально возвращает элемент к стандартному виду. Однако здесь есть важный нюанс, связанный с типами форм и клиент-серверной архитектурой, который мы проанализируем далее.

Различия между обычными и управляемыми формами (Важно для 1С 8.3)

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

  1. Обращение к коллекции элементов: Вместо ЭлементыФормы в управляемом приложении используется коллекция Элементы. Например, обращение к цвету фона поля будет выглядеть так: Элементы.Номенклатура.ЦветФона.
  2. Доступность ЦветаСтиля на клиенте: Использование конструкции ЦветаСтиля.ЦветФонаПоля на клиенте в управляемом приложении вызовет ошибку компиляции. Глобальный контекст ЦветаСтиля доступен только на стороне сервера, в толстом клиенте или в режиме внешнего соединения. В тонком клиенте и веб-клиенте напрямую обратиться к стилям на клиенте нельзя — возникнет ошибка компиляции.

Именно поэтому для управляемых форм в тонком клиенте использование конструкции Новый Цвет является единственным правильным и самым эффективным решением, не требующим лишних контекстных вызовов сервера:


&НаКлиенте
Процедура ОчиститьОформлениеПоля()
    // Корректный сброс цвета фона поля в управляемой форме на клиенте
    Элементы.Номенклатура.ЦветФона = Новый Цвет;
КонецПроцедуры

Механизм работы «АвтоЦвета» под капотом платформы

Давайте разберемся, как именно ведет себя платформа 1С, когда мы устанавливаем свойству элемента значение ВидЦвета.АвтоЦвет (то есть присваиваем пустой Новый Цвет). Платформа не просто выбирает фиксированный серый или белый цвет, а производит динамический расчет:

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

Лучшие практики (Best Practices) при работе с цветом в 1С

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

  1. Избегайте жесткого кодирования RGB-значений. Конструкции вида Новый Цвет(255, 230, 230) крайне нежелательны в коде. Если пользователь переключится на темную тему оформления или настроит индивидуальную контрастность в операционной системе, жестко прописанные цвета сделают текст нечитаемым.
  2. Используйте Элементы стиля. Если вам необходимо программно выделить элемент определенным цветом (например, цветом ошибки или цветом успешного завершения), используйте предопределенные элементы стиля:
    
    // Пример использования элемента стиля
    Элементы.Номенклатура.ЦветФона = ЭлементыСтиля.ЦветФонаОшибки;
    
  3. Применяйте Условное оформление для списков и таблиц. Если вам нужно динамически раскрашивать строки табличной части или динамического списка в управляемых формах, рекомендуется отказаться от обхода строк в цикле и ручной установки цвета. Используйте механизм условного оформления формы. Это работает на уровне платформы, не нагружает клиентскую часть и автоматически возвращает цвет к «авто» при изменении данных.

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

← На главную