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

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

В процессе разработки на платформе "1С:Предприятие 8" часто возникает задача программного создания элементов формы, включая таблицы и их колонки. Одна из таких задач — настройка условного оформления для визуального выделения данных по определенным правилам. Сложность может возникнуть, когда нужно оформить не отдельную ячейку, а целую группу колонок. Давайте разберемся, как это сделать правильно.

Проанализируем ситуацию: на форме программно создается таблица (ТаблицаФормы), данные для которой — реквизит формы типа ТаблицаЗначений. Некоторые колонки этой таблицы объединяются в группу колонок (ВидГруппыФормы.ГруппаКолонок). Задача — изменить цвет фона ячеек в этой группе, если значения в двух колонках строки не совпадают. Для решения задачи построения структуры такой таблицы подойдёт пример программного вывода произвольной таблицы значений на управляемую форму.

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

Анализ исходного кода и выявление ошибки

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

Сначала создаются реквизиты формы и сама таблица с группой колонок "Количество".


    МассивТипаВыбора = Новый Массив;
    МассивТипаВыбора.Добавить(Тип("ТаблицаЗначений"));
    ОписаниеТипаВыбора = Новый ОписаниеТипов(МассивТипаВыбора);
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы("ПредметыЛизинга", ОписаниеТипаВыбора, "", "ТЗН"));
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Наименование", ОбщегоНазначения.ОписаниеТипаСтрока(100));
    ТЗ.Колонки.Добавить("КоличествоБП2", ОбщегоНазначения.ОписаниеТипаЧисло(10, 3));
    ТЗ.Колонки.Добавить("КоличествоБП3", ОбщегоНазначения.ОписаниеТипаЧисло(10, 3)); 
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,"ПредметыЛизинга"));
    КонецЦикла;
    
    ИзменитьРеквизиты(МассивРеквизитов);
    ТаблицаПолейВыбора = Элементы.Добавить("ТЗН", Тип("ТаблицаФормы"));
    ТаблицаПолейВыбора.ПутьКДанным = "ПредметыЛизинга";
    
    НовыйЭлемент = Элементы.Добавить("Наименование", Тип("ПолеФормы"), ТаблицаПолейВыбора);
    НовыйЭлемент.ПутьКДанным = "ПредметыЛизинга.Наименование";
    
    Группа = Элементы.Добавить("Количество",Тип("ГруппаФормы"),ТаблицаПолейВыбора);
    Группа.Вид = ВидГруппыФормы.ГруппаКолонок;
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        Если СтрНайти(Колонка.Имя,"К") = 1 Тогда
            НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
            НовыйЭлемент.ПутьКДанным = "ПредметыЛизинга." + Колонка.Имя;
            Элементы.Переместить(НовыйЭлемент,Группа,Группа);
        КонецЕсли;
    КонецЦикла;

Далее идет код настройки условного оформления. Условие: поле КоличествоБП2 не равно полю КоличествоБП3. Если условие выполняется, нужно раскрасить фон поля КоличествоБП3.


    //УО
    НовыйЭлементУО = УсловноеОформление.Элементы.Добавить();
    
    НастройкаОтбора = НовыйЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НастройкаОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПредметыЛизинга.КоличествоБП2");
    НастройкаОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
    НастройкаОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПредметыЛизинга.КоличествоБП3");
    
    ОформлениеЦветФона = НовыйЭлементУО.Оформление.Элементы.Найти("ЦветФона");
    ОформлениеЦветФона.Значение = WebЦвета.ЛососьСветлый;
    ОформлениеЦветФона.Использование = Истина;
    
    ОформляемоеПоле = НовыйЭлементУО.Поля.Элементы.Добавить();
    // Ключевая ошибка здесь!
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ПредметыЛизингаКоличествоБП3");

Внимательно посмотрим на последнюю строку. Путь к полю указан как "ПредметыЛизингаКоличествоБП3". Это неверно. Система компоновки данных, на которой основано условное оформление, ожидает путь в формате "ИмяРеквизитаТаблицы.ИмяКолонки". В данном случае имя реквизита — "ПредметыЛизинга", а имя колонки — "КоличествоБП3". Между ними обязательно должна быть точка. Чтобы исключить ошибки при ручном составлении путей к данным, можно использовать обработку для автоматической декомпиляции условного оформления.

Правильное решение: оформляем каждое поле в группе

Теперь, когда мы выяснили причину, исправим код и решим поставленную задачу. Нам нужно, чтобы при срабатывании условия окрашивались обе колонки в группе: КоличествоБП2 и КоличествоБП3. Для этого необходимо добавить два оформляемых поля в элемент условного оформления.

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

  1. Создаем новый элемент условного оформления, как и раньше.
  2. Задаем условие (отбор). Условие остается прежним: значения в колонках не равны.
  3. Настраиваем само оформление — цвет фона.
  4. Добавляем в коллекцию оформляемых полей все нужные нам колонки, указывая для каждой правильный путь через точку.

Вот исправленный и дополненный фрагмент кода:


// Создаем элемент УО и настраиваем отбор и оформление (код без изменений)
НовыйЭлементУО = УсловноеОформление.Элементы.Добавить();
    
НастройкаОтбора = НовыйЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НастройкаОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПредметыЛизинга.КоличествоБП2");
НастройкаОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
НастройкаОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПредметыЛизинга.КоличествоБП3");
    
ОформлениеЦветФона = НовыйЭлементУО.Оформление.Элементы.Найти("ЦветФона");
ОформлениеЦветФона.Значение = WebЦвета.ЛососьСветлый;
ОформлениеЦветФона.Использование = Истина;
    
// --- Правильная настройка оформляемых полей ---

// Добавляем первое поле из группы
ОформляемоеПоле1 = НовыйЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле1.Поле = Новый ПолеКомпоновкиДанных("ПредметыЛизинга.КоличествоБП2");

// Добавляем второе поле из группы
ОформляемоеПоле2 = НовыйЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле2.Поле = Новый ПолеКомпоновкиДанных("ПредметыЛизинга.КоличествоБП3");

Теперь при выполнении условия ПредметыЛизинга.КоличествоБП2 <> ПредметыЛизинга.КоличествоБП3 будут окрашены ячейки в обеих колонках, что визуально выделит всю группу.

Важное замечание про доступные поля

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

Если вы столкнулись с тем, что оформление не применяется даже с правильными путями, убедитесь, что реквизиты формы были созданы до настройки условного оформления (с помощью метода ИзменитьРеквизиты). Корректное указание путей к данным в объекте ПолеКомпоновкиДанных, как мы сделали выше, является ключевым фактором, чтобы система смогла сопоставить настройку с реальными данными на форме.

Альтернативный вариант: оформление всей строки

Если задача не требует выделять именно группу колонок, а допустимо выделить всю строку, можно использовать упрощенный подход. Для этого достаточно не добавлять вообще никаких полей в коллекцию НовыйЭлементУО.Поля.Элементы. Если эта коллекция пуста, то при срабатывании условия оформление применится ко всей строке таблицы.

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

Подводя итог, запомним главное правило: для оформления группы колонок нужно в настройках условного оформления перечислить каждое поле, входящее в эту группу, с указанием полного и корректного пути к данным: "ИмяРеквизитаТаблицы.ИмяКолонки".

← На главную