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

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

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

Анализ проблемы и исходного кода

Рассмотрим ситуацию: нам необходимо добавить в существующую таблицу Товары новую колонку УчетВС, которая должна менять свой текст или цвет при определенном условии (например, если код ТН ВЭД входит в определенный список). Разберем типичный алгоритм, который на первый взгляд кажется верным, но содержит скрытую ошибку:


// 1. Добавление реквизита в структуру данных формы
МассивДобавляемыхРеквизитов = Новый Массив; 
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("УчетВС", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(2)), "Объект.Товары", "ВС")); 
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); 

// 2. Создание элемента формы (колонки)
НоваяКолонка = Элементы.Добавить("УчетВС", Тип("ПолеФормы"), Элементы.Товары); 
НоваяКолонка.ПутьКДанным = "Объект.Товары.УчетВС"; 
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;

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

Причина №1: Правила именования полей в системе компоновки данных

Проанализируем, как платформа 1С идентифицирует поля для условного оформления. Механизм УО работает через систему компоновки данных (СКД). Для реквизитов табличных частей имена полей компоновки строятся по строгому правилу: «ИмяТаблицы + ИмяРеквизита».

В нашем примере реквизит называется УчетВС, а таблица — Товары. Следовательно, внутреннее имя поля, которое ожидает платформа, — ТоварыУчетВС. Если при создании элемента формы методом Элементы.Добавить вы назвали колонку просто УчетВС, система оформления может не сопоставить это имя с полем данных, особенно если это происходит динамически на сервере.

Решение проблемы: Правильное создание элемента формы

Чтобы условное оформление «увидело» вашу колонку, необходимо явно задать имя элемента формы в соответствии с ожиданиями платформы. Если колонок много, пригодится программная модификация форм - текучий конструктор. Рассмотрим исправленный и рабочий вариант кода:


// Добавляем реквизит в данные формы
МассивДобавляемыхРеквизитов = Новый Массив; 
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("УчетВС", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(2)), "Объект.Товары", "ВС")); 
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); 

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

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


ЭлементОформления = УсловноеОформление.Элементы.Добавить();

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

// Установка условий и параметров оформления
ЭлементОформления.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", "ВС");	

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

Важные нюансы программной работы с условным оформлением

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

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

Пошаговый чек-лист для реализации

Проанализируем последовательность действий, гарантирующую работу УО:

  1. Вызываем ИзменитьРеквизиты для расширения структуры данных Объект.Товары.
  2. Создаем элемент формы через Элементы.Добавить. Задаем имя элемента по принципу ИмяТаблицы + ИмяРеквизита (это критически важно).
  3. Устанавливаем ПутьКДанным для нового элемента, указывая полный путь через Объект.
  4. Добавляем правило в коллекцию УсловноеОформление.Элементы.
  5. В оформляемых полях указываем Новый ПолеКомпоновкиДанных("ИмяСозданногоЭлемента").

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

← На главную