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

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

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

В данной статье мы подробно разберем, как реализовать программное создание таблицы и настроить для нее Условное оформление, избежав типичных ошибок, с которыми сталкиваются разработчики.

Постановка задачи и анализ ситуации

Представим ситуацию: у нас есть объект (например, документ), в котором данные хранятся в одной структуре, но для отображения на форме нам нужно построить таблицу с произвольным количеством колонок (например, динамическое количество кругов в гонке). Мы используем метод ИзменитьРеквизиты для создания программного реквизита типа ТаблицаЗначений и метод Элементы.Добавить для создания визуальной таблицы. Наша цель — подсветить желтым фоном строку, где значение в колонке «Место» равно 1.

Шаг 1. Программное создание реквизитов и элементов формы

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

Рассмотрим пример кода, который формирует структуру таблицы:


// Массив для добавления новых реквизитов
МассивРеквизитов = Новый Массив;
// Добавляем саму таблицу
МассивРеквизитов.Добавить(Новый РеквизитФормы("Таб", Новый ОписаниеТипов("ТаблицаЗначений"), "", "Результаты"));

// Проходим по колонкам нашей исходной ТаблицыЗначений (ТабЗнач)
Для Каждого Колонка Из ТабЗнач.Колонки Цикл
    // Добавляем каждую колонку как подчиненный реквизит к "Таб"
    МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Таб", Колонка.Заголовок));
КонецЦикла;

// Применяем изменения структуры формы
ИзменитьРеквизиты(МассивРеквизитов);

// Теперь создаем визуальный элемент ТаблицаФормы
Таблица = Элементы.Добавить("Таб", Тип("ТаблицаФормы"), ЭтаФорма);
Таблица.ПутьКДанным = "Таб";

// Добавляем поля (колонки) на форму
Для Каждого Колонка Из ТабЗнач.Колонки Цикл
    НовыйЭлемент = Элементы.Добавить("Таб_" + Колонка.Имя, Тип("ПолеФормы"), Таблица);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = "Таб." + Колонка.Имя;
КонецЦикла;

Проанализируем этот блок: мы создали реквизит Таб и связали с ним элементы формы через свойство ПутьКДанным. Именно это свойство будет ключевым при настройке оформления.

Шаг 2. Настройка условного оформления программно

Когда мы настраиваем оформление в конфигураторе, платформа берет на себя сопоставление имен. В коде же мы должны быть предельно точны. Главная проблема, с которой сталкиваются разработчики — что именно писать в ПолеКомпоновкиДанных.

Важное правило: В левой части условия (отбор) и в списке оформляемых полей нужно указывать Путь к данным, а не имя элемента формы или имя исходной переменной ТаблицаЗначений.

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

  1. Добавляем новый элемент в коллекцию УсловноеОформление.
  2. Определяем условие (Отбор).
  3. Указываем параметры оформления (Цвет, Шрифт и т.д.).
  4. Определяем список полей, к которым применяется оформление.

Посмотрим на практическую реализацию:


// 1. Создаем новый элемент оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// 2. Настраиваем отбор: где Место = 1
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// ВАЖНО: Используем путь к данным реквизита формы
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Таб.Место"); 
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 1;
ЭлементОтбора.Использование = Истина;

// 3. Устанавливаем само оформление (например, желтый фон)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Желтый);

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

Разбор типичных ошибок

Проанализируем ситуацию из обсуждения, почему у автора не работало оформление. Он пробовал разные варианты:

Тонкости динамического оформления

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

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

2. Очистка старого оформления.
Поскольку процедура заполнения таблицы может вызываться несколько раз, необходимо очищать старые правила, иначе они будут дублироваться, что приведет к тормозам формы:

УсловноеОформление.Элементы.Очистить();

3. Использование сложных условий.
Вы можете использовать не только ВидСравненияКомпоновкиДанных.Равно, но и другие виды: Больше, ВСписке, Заполнено. Также можно группировать условия (И / ИЛИ), используя ГруппаЭлементовОтбораКомпоновкиДанных.

4. Работа с Табличными Частями документа.
Если ваша таблица — это не динамический реквизит, а стандартная табличная часть документа, путь в ПолеКомпоновкиДанных должен начинаться с Объект. Например: Новый ПолеКомпоновкиДанных("Объект.Товары.Количество").

Итоговый алгоритм действий

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

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

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

← На главную