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