Почему не работает условное оформление цвета фона в закрытом периоде и как это исправить

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда настроенное Условное оформление (УО) идеально работает в новых или открытых для редактирования документах, но совершенно игнорируется в тех, что попали в «закрытый период». Особенно часто это проявляется при попытке изменить ЦветФона или ЦветТекста полей формы. В данной статье мы подробно разберем, почему это происходит, как платформа расставляет приоритеты при отрисовке интерфейса и какие альтернативные способы визуального выделения данных существуют.

Анализ проблемы: Приоритет системного оформления

Разберем ситуацию, с которой столкнулся автор темы. В коде формы прописана логика, которая должна окрашивать поле «Контрагент» в бирюзовый цвет, если по нему ведется электронный документооборот (ЭДО). Однако, как только дата документа оказывается меньше даты запрета редактирования, окрашивание исчезает, хотя условия в коде по-прежнему выполняются (возвращают Истина).

Проанализируем причину такого поведения. Когда документ попадает в закрытый период, типовые конфигурации (например, Бухгалтерия предприятия 3.0 или ERP) переводят форму в режим ТолькоПросмотр = Истина. На уровне платформы это означает следующее:

  1. Блокировка пользовательского фона: Для элементов управления (полей ввода), находящихся в режиме «Только просмотр» или «Доступность = Ложь», операционная система и платформа 1С принудительно устанавливают стандартный системный фон (обычно светло-серый). Это сделано для того, чтобы пользователь визуально сразу понимал: поле недоступно для изменения.
  2. Игнорирование свойств оформления: Свойство ЦветФона, заданное через УсловноеОформление или напрямую через свойства элемента, имеет более низкий приоритет, чем системный флаг ReadOnly.
  3. Особенности табличных частей: Интересно, что в списках и табличных частях условное оформление фона часто продолжает работать. Это связано с тем, что ячейки таблицы отрисовываются механизмом «сетки», где визуальный анализ данных важнее, чем индикация доступности конкретной ячейки. Для одиночных же полей на форме правила отрисовки более жесткие.

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

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

Рассмотрим пример кода, который решает задачу выделения контрагента через изменение шрифта:


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

В данном примере мы используем объект Шрифт, где четвертый параметр конструктора отвечает за жирность (Истина — жирный, Ложь — обычный). Этот метод гарантированно «пробивает» блокировку закрытого периода, так как изменение начертания не мешает восприятию поля как «только для чтения».

Способ 2: Программное добавление Условного оформления

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


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

Важный нюанс: При использовании УсловноеОформление для полей, которые могут быть заблокированы датой запрета, старайтесь комбинировать ЦветТекста и Шрифт. Даже если платформа перекрасит фон в серый, синий жирный текст на сером фоне будет отлично виден пользователю.

Рекомендации по работе с элементами в режиме «Только просмотр»

Выясним, какие еще есть способы визуально выделить информацию в формах, которые нельзя редактировать:

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

← На главную