К статье
Практический материал

Разработка и Конфигурация · 11 мин

1С: как программно добавить группу колонок на форму

Как программно добавить группу колонок на форму в 1С: ГруппаФормы, ГруппировкаКолонок, примеры кода для таблицы формы, типичные ошибки и проверка результата.

Группа колонок на управляемой форме 1С нужна, когда несколько колонок таблицы должны объединяться под общим заголовком — например, «Количество» и «Цена» под шапкой «По документу». Если структура колонок известна заранее, группу создают в конфигураторе, но когда состав колонок зависит от данных (динамические отчёты, произвольные периоды, наборы показателей), группу приходится добавлять программно — в модуле формы.

Программное создание выполняется через коллекцию Элементы.Добавить() с типом Тип("ГруппаФормы") и последующей настройкой свойства Группировка. Важно понимать, что группа колонок — это не визуальный декоративный элемент, а полноценный контейнер: дочерние колонки добавляются с указанием родителя, и платформа сама строит объединённый заголовок.

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

Когда группу колонок нужно создавать программно

Статическое проектирование в конфигураторе перестаёт работать, когда набор колонок определяется в момент выполнения. Типичные ситуации: пользователь выбирает список показателей, колонки формируются по периодам (месяцы, кварталы), структура таблицы строится по результатам запроса с динамическими полями.

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

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

Базовый код: создание группы колонок

Минимальный рабочий пример — добавление группы с двумя колонками в таблицу формы. Код выполняется на сервере, обычно в обработчике ПриСозданииНаСервере:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Создаём группу колонок

ГруппаКолонок = Элементы.Добавить("ГруппаДанныеДокумента", Тип("ГруппаФормы"), Элементы.Товары);

ГруппаКолонок.Вид = ВидГруппыФормы.ГруппаКолонок;

ГруппаКолонок.Группировка = ГруппировкаКолонок.Горизонтальная;

ГруппаКолонок.Заголовок = "По документу";

ГруппаКолонок.ОтображатьЗаголовок = Истина;

// Первая колонка внутри группы

КолонкаКоличество = Элементы.Добавить("ТоварыКоличество", Тип("ПолеФормы"), ГруппаКолонок);

КолонкаКоличество.Вид = ВидПоляФормы.ПолеВвода;

КолонкаКоличество.ПутьКДанным = "Товары.Количество";

// Вторая колонка внутри группы

КолонкаЦена = Элементы.Добавить("ТоварыЦена", Тип("ПолеФормы"), ГруппаКолонок);

КолонкаЦена.Вид = ВидПоляФормы.ПолеВвода;

КолонкаЦена.ПутьКДанным = "Товары.Цена";

КонецПроцедуры

Ключевые моменты кода: третий параметр метода Добавить() задаёт родителя — для группы это таблица формы, для колонок — сама группа. Свойство ПутьКДанным связывает колонку с реквизитом таблицы значений или динамического списка, и без него колонка отобразится пустой.

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

Варианты группировки колонок и их отличия

Свойство Группировка определяет, как платформа отрисует объединённые колонки. Выбор влияет не только на внешний вид, но и на поведение при вводе данных.

Значение группировкиКак выглядитКогда применять
ГоризонтальнаяОбщий заголовок над колонками, каждая колонка — отдельная ячейкаКлассическая шапка «Количество / Цена / Сумма»
ВертикальнаяКолонки выводятся одна под другой внутри одной ячейки строкиЭкономия ширины таблицы при узких полях
ВЯчейкеНесколько полей в одной ячейке строки рядомКомпактный вывод связанных значений (например, количество и единица измерения)

Для группировки ВЯчейке заголовок группы обычно скрывают (ОтображатьЗаголовок = Ложь), а подписи полей отключают через свойство ПоложениеЗаголовка каждой колонки, иначе ячейка получится перегруженной.

Выбор вида группировки

Горизонтальная

Стандартный вариант для шапок таблиц; требует достаточной ширины формы

Вертикальная

Подходит для мобильного клиента и узких форм; занимает больше высоты строки

В ячейке

Максимально компактно, но затрудняет сортировку и редактирование отдельных полей

Добавление группы в динамически формируемую таблицу

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

&НаСервере

Процедура СформироватьКолонки(МассивПоказателей)

// 1. Добавляем реквизиты таблицы

ДобавляемыеРеквизиты = Новый Массив;

Для Каждого Показатель Из МассивПоказателей Цикл

ДобавляемыеРеквизиты.Добавить(

Новый РеквизитФормы("Колонка" + Показатель.Код,

Новый ОписаниеТипов("Число"), "ТаблицаДанных", Показатель.Наименование));

КонецЦикла;

ИзменитьРеквизиты(ДобавляемыеРеквизиты);

// 2. Создаём группу и колонки

Группа = Элементы.Добавить("ГруппаПоказатели", Тип("ГруппаФормы"), Элементы.ТаблицаДанных);

Группа.Вид = ВидГруппыФормы.ГруппаКолонок;

Группа.Группировка = ГруппировкаКолонок.Горизонтальная;

Группа.Заголовок = "Показатели";

Для Каждого Показатель Из МассивПоказателей Цикл

Колонка = Элементы.Добавить("Колонка" + Показатель.Код, Тип("ПолеФормы"), Группа);

Колонка.Вид = ВидПоляФормы.ПолеВвода;

Колонка.ПутьКДанным = "ТаблицаДанных.Колонка" + Показатель.Код;

КонецЦикла;

КонецПроцедуры

При повторном формировании (пользователь изменил набор показателей) старые элементы нужно удалить через Элементы.Удалить(), а реквизиты — через ИзменитьРеквизиты() с массивом удаляемых. Иначе получите дубли имён и ошибку «Элемент с таким именем уже существует».

Настройка отображения: заголовки, ширина, фиксация

После создания группы полезно настроить её визуальные свойства. Заголовок группы задаётся свойством Заголовок, видимость шапки — ОтображатьЗаголовок и ОтображатьВШапке. Для группировки «ВЯчейке» заголовок чаще скрывают, для «Горизонтальная» — наоборот, показывают, иначе смысл объединения теряется.

Ширину отдельных колонок регулируют свойствами Ширина и РастягиватьПоГоризонтали. Если колонки внутри группы должны иметь фиксированную ширину, задайте её явно — иначе платформа распределит пространство автоматически, и при ресайзе формы колонки «поплывут».

Для широких таблиц полезно свойство таблицы ФиксацияСлева / ФиксацияСправа и свойство колонки ФиксацияВТаблице: важные группы (например, «Номенклатура») остаются видимыми при горизонтальной прокрутке, а добавленные программно группы показателей прокручиваются.

Типичные ошибки и ограничения

Самая частая ошибка — неверный родитель при добавлении. Если колонку добавить с родителем-таблицей вместо группы, она выйдет за пределы объединённой шапки. Если группу добавить с родителем-формой, а не таблицей, платформа выдаст ошибку о недопустимом виде группы для данного родителя.

Вторая группа проблем — попытка изменить состав колонок в клиентском обработчике. Методы Элементы.Добавить() и ИзменитьРеквизиты() доступны только на сервере; в тонком клиенте вызывайте серверную процедуру. Также нельзя добавлять элементы в обработчике ПриОткрытии — форма к этому моменту уже построена, используйте ПриСозданииНаСервере или отдельную серверную процедуру, вызываемую после открытия.

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

Типичные ошибки
01
Колонка добавлена с родителем-таблицей вместо группы — колонка оказывается вне общего заголовка
02
ПутьКДанным указывает на несуществующий реквизит — ошибка при открытии формы
03
Попытка добавить элементы на клиенте — метод недоступен, нужен серверный вызов
04
Повторное формирование без удаления старых элементов — ошибка дублирования имени
05
Забыт Вид = ГруппаКолонок — группа создаётся как обычная группа страниц и ломает layout

Проверка результата

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

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

Контрольные точки

Как проверить результат

Заголовок группы над колонками
Норма

Общий заголовок виден и объединяет нужные колонки

Тревожный признак

Заголовка нет или колонки выведены рядом без объединения — проверьте Вид и Группировку

Данные в колонках
Норма

Значения соответствуют реквизитам таблицы

Тревожный признак

Пустые ячейки — неверный ПутьКДанным или реквизит не добавлен

Повторное формирование
Норма

Колонки пересоздаются без ошибок, данные сохранены

Тревожный признак

Ошибка дублирования имени или потеря введённых данных

Итог

Что важно запомнить

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

Частые вопросы

Можно ли добавить группу колонок в уже существующую шапку, созданную в конфигураторе?

Да. Найдите существующую группу через Элементы.Найти("ИмяГруппы") и передайте её как родителя при добавлении новых колонок. Новые колонки появятся внутри существующего объединённого заголовка.

Почему группа создаётся, но заголовок не отображается?

Проверьте три свойства: ОтображатьЗаголовок у группы должно быть Истина, у таблицы должна быть включена шапка, а для группировки «ВЯчейке» заголовок группы платформа по умолчанию не показывает — используйте «Горизонтальная».

Как программно переместить существующую колонку в новую группу?

Используйте Элементы.Переместить(Элементы.ИмяКолонки, ГруппаКолонок). Колонка переместится внутрь группы без пересоздания, все её настройки и привязка к данным сохранятся.

Можно ли вкладывать группы колонок друг в друга?

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

Работает ли этот подход в обычных формах?

Нет. Описанные механизмы (Элементы.Добавить, ГруппаФормы, ГруппировкаКолонок) относятся к управляемым формам. В обычных формах состав колонок табличного поля изменяется через коллекцию Колонки табличного поля, и там действуют другие объекты и свойства.

Почему после ИзменитьРеквизиты пропали данные таблицы?

Метод ИзменитьРеквизиты пересоздаёт состав реквизитов формы, и значения удалённых или переименованных реквизитов теряются. Перед вызовом выгрузите таблицу в значение (РеквизитФормыВЗначение или Выгрузить()), а после — загрузите обратно, сопоставив колонки по именам.