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

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

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

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

Шаг 1: Подготовка массива реквизитов и создание структуры данных

Прежде чем выводить что-то на экран, мы должны создать структуру данных в контексте формы. Обычный объект ТаблицаЗначений в коде не виден интерфейсу напрямую — его нужно преобразовать в реквизит формы. Для этого мы используем метод ИзменитьРеквизиты(). Рассмотрим, как правильно подготовить массив новых реквизитов.


// 1. Создаем массив для новых реквизитов
МассивРеквизитов = Новый Массив;

// 2. Описываем саму таблицу
// Указываем тип "ТаблицаЗначений"
МассивТиповТЗ = Новый Массив;
МассивТиповТЗ.Добавить(Тип("ТаблицаЗначений"));
ОписаниеТипаТЗ = Новый ОписаниеТипов(МассивТиповТЗ);

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

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

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

Важный нюанс: Обратите внимание на третий параметр конструктора РеквизитФормы. Указывая там имя основной таблицы (в нашем случае "ПредметыЛизинга"), мы сообщаем платформе, что данные колонки принадлежат именно этой таблице значений, а не являются отдельными реквизитами формы.

Шаг 2: Программное создание элементов интерфейса

После того как структура данных создана, необходимо отобразить её пользователю. Мы создадим саму таблицу формы и основные поля ввода. Проанализируем процесс добавления элементов:


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

// Создаем обычную колонку "Наименование"
НовыйЭлемент = Элементы.Добавить("Наименование", Тип("ПолеФормы"), ТаблицаПолейВыбора);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ПредметыЛизинга.Наименование";

На данном этапе мы получили стандартную таблицу. Теперь перейдем к реализации сдвоенных колонок.

Шаг 3: Создание группы колонок и перемещение элементов

Чтобы колонки визуально объединились под общей "шапкой", нам необходимо создать специальный элемент формы — ГруппаФормы с видом ГруппаКолонок. Затем мы воспользуемся методом Переместить, чтобы вложить созданные колонки в эту группу.

Разберем алгоритм группировки по шагам:

  1. Создаем группу внутри таблицы.
  2. Устанавливаем для группы вид ВидГруппыФормы.ГруппаКолонок.
  3. Создаем элементы колонок (поля ввода) внутри таблицы.
  4. Перемещаем поля ввода внутрь группы.

// Создаем группу для объединения колонок "Количество"
ГруппаКоличество = Элементы.Добавить("ГруппаКоличество", Тип("ГруппаФормы"), ТаблицаПолейВыбора);
ГруппаКоличество.Вид = ВидГруппыФормы.ГруппаКолонок;
ГруппаКоличество.Заголовок = "Сведения о количестве"; // Общая шапка
ГруппаКоличество.ОтображатьЗаголовок = Истина;

// Создаем первую колонку для группы
Колонка1 = Элементы.Добавить("КоличествоБП2", Тип("ПолеФормы"), ТаблицаПолейВыбора);
Колонка1.Вид = ВидПоляФормы.ПолеВвода;
Колонка1.ПутьКДанным = "ПредметыЛизинга.КоличествоБП2";

// Создаем вторую колонку для группы
Колонка2 = Элементы.Добавить("КоличествоБП3", Тип("ПолеФормы"), ТаблицаПолейВыбора);
Колонка2.Вид = ВидПоляФормы.ПолеВвода;
Колонка2.ПутьКДанным = "ПредметыЛизинга.КоличествоБП3";

// Перемещаем колонки в группу
Элементы.Переместить(Колонка1, ГруппаКоличество);
Элементы.Переместить(Колонка2, ГруппаКоличество);

Благодаря использованию ГруппаКолонок, элементы внутри неё будут располагаться горизонтально под общим заголовком группы. Если вам нужно расположить данные одно под другим в рамках одной ячейки, следует изменить свойство группы Группировка на ГруппировкаКолонок.Вертикальная.

Шаг 4: Настройка Условного Оформления для динамических колонок

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

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


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

// 1. Настраиваем само оформление (например, цвет фона)
ОформлениеЦвет = ЭлементУО.Оформление.Элементы.Найти("ЦветФона");
ОформлениеЦвет.Значение = WebЦвета.ЛососьСветлый;
ОформлениеЦвет.Использование = Истина;

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

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

Если оформление должно применяться ко всей строке, то в коллекцию Поля можно ничего не добавлять или добавить саму таблицу (в нашем примере — "ТЗН").

Практические советы по работе с динамическими таблицами

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

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

← На главную