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