Почему не работает программное условное оформление табличной части в расширении 1С?

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

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

Анализ первой причины: Особенности интерфейса «Такси»

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

Выясним причины игнорирования фона:

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

Решение: Как показывает практика (и подтверждается в ходе обсуждения на форуме), изменение параметра ЦветТекста или Шрифт работает гораздо стабильнее. Если ваша задача — выделить строку, попробуйте изменить цвет шрифта на красный или сделать его жирным.


// Пример надежного оформления через цвет текста
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,, Истина)); // Жирный

Разбор второй причины: Ошибки при сравнении «Поле против Поля»

Рассмотрим код, в котором сравниваются два реквизита одной строки: Объект.Товары.КоличествоУпаковок и Объект.Товары.Количество. Когда мы программно создаем ЭлементОтбораКомпоновкиДанных, критически важно правильно указать левое и правое значения.

Для сравнения двух полей документа оба значения должны быть объектами типа ПолеКомпоновкиДанных. Проанализируем правильный подход к созданию такого условия:


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

Важный нюанс: если одно из полей имеет неопределенный тип или содержит NULL (например, в новых строках до записи или при программном добавлении колонок), условие НеРавно может не сработать так, как вы ожидаете. Убедитесь, что типы данных в колонках совпадают (например, оба — Число).

Третья причина: Порядок вызова в расширениях (&Перед и &После)

Когда мы работаем с расширением, важно понимать, в какой момент выполняется наш код. Если мы используем аннотацию &Перед("ПриСозданииНаСервере"), то после нашего кода сработает стандартный обработчик основной конфигурации. В типовых решениях (УТ, ERP, КА) часто есть встроенные механизмы, которые очищают или переопределяют УсловноеОформление программно.

Посмотрим на алгоритм действий:

  1. Используйте &После("ПриСозданииНаСервере"). Это гарантирует, что ваше правило будет добавлено в коллекцию последним.
  2. Если в типовой форме есть специализированная процедура для установки оформления (например, УстановитьУсловноеОформление()), попробуйте подключиться к ней через &После.

Четвертая причина: Программно добавляемые реквизиты

Если реквизит КоличествоУпаковок добавляется на форму программно в этой же самой процедуре ПриСозданииНаСервере, платформа может не успеть связать его с механизмом условного оформления, если код оформления идет раньше создания элементов.

Рекомендация: Сначала полностью завершите формирование структуры формы (добавление реквизитов, добавление колонок таблицы, установка путей к данным), и только в самом конце процедуры приступайте к настройке УсловноеОформление.Элементы.Добавить().

Пятая причина: Оформление всей строки

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


// Чтобы закрасить всю строку, нужно перечислить все колонки
Для Каждого Колонка Из Элементы.Товары.ПодчиненныеЭлементы Цикл
    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Колонка.Имя);
    ОформляемоеПоле.Использование = Истина;
КонецЦикла;

Если вы укажете просто Новый ПолеКомпоновкиДанных("Товары"), платформа в некоторых версиях может проигнорировать это оформление для ячеек внутри таблицы.

Альтернативный метод: Использование вспомогательной колонки

Если стандартный механизм сравнения полей «капризничает», рассмотрим надежный «обходной путь», который часто используют опытные разработчики. Он заключается в переносе логики вычисления из УО в код 1С.

  1. Добавляем в таблицу скрытый реквизит типа Число (например, СостояниеОформления).
  2. В обработчике ПриИзменении количества или упаковок (а также при открытии формы) вычисляем условие на языке 1С.
  3. Если условие выполняется, ставим в СостояниеОформления значение 1, иначе — 0.
  4. В условном оформлении делаем максимально простую проверку: Объект.Товары.СостояниеОформления Равно 1.

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

Резюмируем: Если программное оформление не работает, первым делом замените ЦветФона на ЦветТекста. Если это помогло — значит, проблема была в особенностях отрисовки интерфейса. Если нет — проверяйте правильность создания ПолеКомпоновкиДанных и порядок выполнения процедур в расширении.

← На главную