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