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