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