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