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