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

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

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

Почему стандартный подход не работает?

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


ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Настройка отбора (например, если поле заполнено)
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ИмяРеквизита");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;

// Настройка оформления
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Роса);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);

// Указание поля
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ИмяПоляФормы");

Проблема заключается в приоритете системного оформления. Когда платформа 1С отрисовывает элемент с выключенной доступностью, графический движок накладывает стандартный слой визуализации «неактивного состояния». Этот слой имеет более высокий приоритет, чем пользовательские настройки ЦветФона. Это сделано для соблюдения стандартов UX, чтобы пользователь всегда мог визуально отличить интерактивные элементы от заблокированных. Однако в бизнес-приложениях часто требуется именно цветовое акцентирование внимания на важных, но защищенных от редактирования данных.

Способ 1: Использование фонового цвета группы

Проанализируем наиболее стабильный и визуально чистый метод — использование контейнера (Группы). Если мы не можем изменить фон самого поля, мы можем изменить фон «подложки», на которой оно расположено. Выясним, как это реализовать по шагам:

  1. Создадим на форме новую Группу - обычную группу (без отображения заголовка).
  2. Поместим наше поле ввода внутрь этой группы.
  3. У самой группы установим свойство ЦветФона в нужный нам цвет (например, желтый для привлечения внимания).
  4. У поля ввода, находящегося внутри, установим свойство ЦветФона в значение Авто или выберем прозрачный стиль.
  5. Теперь, когда мы программно установим для поля Доступность = Ложь, системный серый цвет поля будет накладываться на цвет фона группы, создавая нужный оттенок, либо (в зависимости от версии платформы) прозрачные части поля позволят увидеть цвет группы.

Важный нюанс: чтобы поле полностью сливалось с группой, проверьте настройки Рамка у поля ввода. Иногда установка рамки в значение Нет помогает добиться идеального визуального эффекта.

Способ 2: Использование режима «Только просмотр» и цвета текста

Как показывает практика, свойство ТолькоПросмотр ведет себя менее агрессивно по отношению к оформлению, чем полная потеря доступности. Рассмотрим подробнее: при ТолькоПросмотр = Истина поле все еще может принимать фокус, и платформа позволяет применять к нему ЦветТекста.

Если ваша задача — просто выделить заблокированное поле, попробуйте изменить тактику: вместо фона меняйте цвет шрифта. Посмотрим на пример кода:


// Вместо полной блокировки
Элементы.МоёПоле.ТолькоПросмотр = Истина;
// В этом режиме установка цвета текста обычно отрабатывает корректно
Элементы.МоёПоле.ЦветТекста = WebЦвета.Красный;

В некоторых релизах платформы 8.3 (особенно начиная с 8.3.15) даже при ТолькоПросмотр фон может игнорироваться, но текст остается настраиваемым, что позволяет сохранить информативность интерфейса.

Способ 3: Подмена элементов формы (Переключатель видимости)

Если требования к дизайну жесткие и нам необходимо видеть яркий фон у недоступного поля, мы можем использовать метод «двойника». Разберем этот алгоритм:

  1. Разместим на форме два элемента, связанных с одним и тем же реквизитом.
    • Элемент А: Поле ввода (обычное, доступное).
    • Элемент Б: Декорация (Надпись) или Поле ввода, которое всегда находится в режиме ТолькоПросмотр и имеет жестко заданный ЦветФона.
  2. Пропишем логику переключения видимости в процедуре ПриЧтенииНаСервере или при изменении связанных данных.

Пример программной реализации переключения:


&НаСервере
Процедура ОбновитьСостояниеПолей(НужноЗаблокировать)
    
    // Активное поле для редактирования
    Элементы.ПолеВводаРедактирование.Видимость = НЕ НужноЗаблокировать;
    
    // Поле-декорация для отображения цветом
    Элементы.ПолеВводаОтображение.Видимость = НужноЗаблокировать;
    Элементы.ПолеВводаОтображение.ЦветФона  = WebЦвета.Золотистый;
    
КонецПроцедуры

Преимущество этого метода в том, что декорации (тип ПолеФормы с видом ПолеНадписи) практически не ограничивают разработчика в выборе цветов и шрифтов.

Способ 4: Имитация недоступности через события

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

  1. Установим Доступность = Истина и ТолькоПросмотр = Ложь.
  2. Зададим желаемый ЦветФона.
  3. Для запрета редактирования используем свойства КнопкаВыбора = Ложь, КнопкаСпискаВыбора = Ложь и КнопкаОчистки = Ложь.
  4. В событиях поля ПриИзменении, НачалоВыбора, АвтоПодбор пропишем отказ от обработки или возврат старого значения.

Пример обработки события для имитации блокировки:


&НаКлиенте
Процедура ИмяПоляНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    Если МоеУсловиеБлокировки Тогда
        СтандартнаяОбработка = Ложь; // Запрещаем открытие формы выбора
    КонецЕсли;
КонецПроцедуры

Этот метод требует больше кода, но он позволяет сохранить «живой» цвет фона поля ввода, так как для платформы элемент остается активным.

Выводы и рекомендации

Подводя итог нашему анализу, можно выделить следующие правила работы с оформлением в 1С 8.3:

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

← На главную