Как программно создать группу колонок в табличной части и добавить в нее элементы

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

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

Понимание архитектуры управляемой формы

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

  1. Создание реквизита формы (регистрация места в памяти для хранения данных).
  2. Создание элемента формы (визуальное отображение этого реквизита на экране).

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

Этап 1: Программное добавление реквизита

Рассмотрим ситуацию, когда нам необходимо добавить в таблицу Таб колонку Вес. Сначала создадим описание типа данных и зарегистрируем новый реквизит. Для этого используется метод ИзменитьРеквизиты. Этот метод является «тяжелым» для системы, поэтому, если вам нужно добавить несколько колонок, соберите их все в один массив и вызовите метод один раз.


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

// Описываем тип данных: Число (15, 3)
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3));

// Создаем объект РеквизитФормы
// Параметры: Имя, Тип, Путь, Заголовок
НовыйРеквизит = Новый РеквизитФормы("Вес", ОписаниеТипаЧисло, "Объект.Таб", "Вес, т.");
МассивДобавляемыхРеквизитов.Добавить(НовыйРеквизит);

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

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

Этап 2: Создание группы колонок

Теперь выясним, как создать контейнер для наших будущих колонок. В таблицах 1С для этого используется специальный тип элемента — ГруппаКолонокФормы. Выясним причину, почему это важно: обычная ГруппаФормы не обладает свойствами, необходимыми для корректного отображения внутри таблицы.


// Добавляем группу в элементы формы
// Параметры: Имя, Тип, Родитель
ИмяГруппы = "ГруппаПараметрыВеса";
НоваяГруппа = Элементы.Добавить(ИмяГруппы, Тип("ГруппаКолонокФормы"), Элементы.Таб);

// Настраиваем свойства группы
НоваяГруппа.Заголовок = "Информация о весе";
НоваяГруппа.ОтображатьВШапке = Истина; // Позволяет видеть заголовок группы над колонками
НоваяГруппа.Группировка = ГруппировкаКолонок.Горизонтальная; 

Свойство Группировка определяет, как будут располагаться колонки внутри группы:

Этап 3: Размещение колонки внутри созданной группы

Это ключевой момент нашего разбора. Чтобы положить колонку в группу, необходимо при создании элемента формы (колонки) в качестве третьего параметра (Родитель) передать объект созданной группы. Проанализируем пример:


// Создаем элемент формы - Поле
// Здесь Элементы[ИмяГруппы] - это наша только что созданная группа
НоваяКолонка = Элементы.Добавить("ТабВес", Тип("ПолеФормы"), Элементы[ИмяГруппы]);

// Указываем путь к ранее созданному реквизиту
НоваяКолонка.ПутьКДанным = "Объект.Таб.Вес"; 

// Настраиваем вид поля
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.Заголовок = "Чистый вес";

Если группа уже была создана ранее, мы можем найти её в коллекции элементов по имени: Элементы.Найти("ИмяВашейГруппы"). Если же колонка уже существует на форме, но её нужно переместить в группу, используем метод Элементы.Переместить.

Важные нюансы и типичные ошибки

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

  1. Соблюдение последовательности: Всегда сначала выполняйте ИзменитьРеквизиты, и только потом — Элементы.Добавить. Если вы попытаетесь создать элемент формы и привязать его к несуществующему ПутьКДанным, система выдаст исключение.
  2. Уникальность имен: Имена реквизитов и элементов формы должны быть уникальными в пределах всей формы. Хорошей практикой является добавление префикса к программно создаваемым элементам.
  3. Проверка существования: Перед созданием элемента рекомендуется проверить, не был ли он создан ранее (например, при повторном нажатии кнопки пользователем). Проанализируем пример проверки:

Если Элементы.Найти("ПрограммнаяГруппа") = Неопределено Тогда
    // Код создания группы
КонецЕсли;

Управление положением элементов

Иногда недостаточно просто добавить колонку в конец группы. Если требуется вставить колонку в определенное место (например, между «Номенклатурой» и «Количеством»), рассмотрим использование метода Переместить:


// Перемещаем колонку "Вес" в группу перед колонкой "Сумма"
Элементы.Переместить(Элементы.ТабВес, Элементы.ГруппаПараметрыВеса, Элементы.ТабСумма);

Параметры метода Переместить:

Удаление динамических элементов

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


// 1. Удаляем элемент интерфейса
ЭлементДляУдаления = Элементы.Найти("ТабВес");
Если ЭлементДляУдаления <> Неопределено Тогда
    Элементы.Удалить(ЭлементДляУдаления);
КонецЕсли;

// 2. Удаляем реквизит (данные)
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить("Объект.Таб.Вес");
ЭтаФорма.ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);

Важно: При вызове ИзменитьРеквизиты для удаления, массив передается во второй параметр метода (первый остается пустым или Неопределено). Для изучения готовой реализации таких механизмов подойдёт обработка-пример динамического добавления и удаления элементов формы.

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

← На главную