Разработка и Конфигурация · 11 мин
1С: как программно добавить группу колонок на форму
Как программно добавить группу колонок на форму в 1С: ГруппаФормы, ГруппировкаКолонок, примеры кода для таблицы формы, типичные ошибки и проверка результата.
Группа колонок на управляемой форме 1С нужна, когда несколько колонок таблицы должны объединяться под общим заголовком — например, «Количество» и «Цена» под шапкой «По документу». Если структура колонок известна заранее, группу создают в конфигураторе, но когда состав колонок зависит от данных (динамические отчёты, произвольные периоды, наборы показателей), группу приходится добавлять программно — в модуле формы.
Программное создание выполняется через коллекцию Элементы.Добавить() с типом Тип("ГруппаФормы") и последующей настройкой свойства Группировка. Важно понимать, что группа колонок — это не визуальный декоративный элемент, а полноценный контейнер: дочерние колонки добавляются с указанием родителя, и платформа сама строит объединённый заголовок.
Материал рассчитан на разработчиков, работающих с управляемыми формами (толстый и тонкий клиент, веб-клиент). Примеры приведены на встроенном языке 1С и применимы к типовым механизмам платформы без привязки к конкретной конфигурации.
Когда группу колонок нужно создавать программно
Статическое проектирование в конфигураторе перестаёт работать, когда набор колонок определяется в момент выполнения. Типичные ситуации: пользователь выбирает список показателей, колонки формируются по периодам (месяцы, кварталы), структура таблицы строится по результатам запроса с динамическими полями.
Второй случай — универсальные обработки и отчёты собственной разработки, где одна форма обслуживает разные наборы данных. Создавать под каждый вариант отдельную форму нерационально, поэтому колонки и их группы генерируются кодом при создании формы или при изменении настроек.
Третий сценарий — доработка типовой формы без снятия её с поддержки: дополнительные колонки и их группировку добавляют в расширении конфигурации или в обработчике ПриСозданииНаСервере через программный интерфейс формы.
Базовый код: создание группы колонок
Минимальный рабочий пример — добавление группы с двумя колонками в таблицу формы. Код выполняется на сервере, обычно в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаём группу колонок
ГруппаКолонок = Элементы.Добавить("ГруппаДанныеДокумента", Тип("ГруппаФормы"), Элементы.Товары);
ГруппаКолонок.Вид = ВидГруппыФормы.ГруппаКолонок;
ГруппаКолонок.Группировка = ГруппировкаКолонок.Горизонтальная;
ГруппаКолонок.Заголовок = "По документу";
ГруппаКолонок.ОтображатьЗаголовок = Истина;
// Первая колонка внутри группы
КолонкаКоличество = Элементы.Добавить("ТоварыКоличество", Тип("ПолеФормы"), ГруппаКолонок);
КолонкаКоличество.Вид = ВидПоляФормы.ПолеВвода;
КолонкаКоличество.ПутьКДанным = "Товары.Количество";
// Вторая колонка внутри группы
КолонкаЦена = Элементы.Добавить("ТоварыЦена", Тип("ПолеФормы"), ГруппаКолонок);
КолонкаЦена.Вид = ВидПоляФормы.ПолеВвода;
КолонкаЦена.ПутьКДанным = "Товары.Цена";
КонецПроцедуры
Ключевые моменты кода: третий параметр метода Добавить() задаёт родителя — для группы это таблица формы, для колонок — сама группа. Свойство ПутьКДанным связывает колонку с реквизитом таблицы значений или динамического списка, и без него колонка отобразится пустой.
- 1Убедитесь, что реквизиты таблицы (колонки данных) уже существуют в реквизитах формы
- 2Создайте группу: Элементы.Добавить(Имя, Тип("ГруппаФормы"), Элементы.ИмяТаблицы)
- 3Установите Вид = ГруппаКолонок и нужную Группировку
- 4Добавьте дочерние колонки с родителем-группой и заполните ПутьКДанным
- 5Откройте форму и проверьте объединённый заголовок и вывод данных
Варианты группировки колонок и их отличия
Свойство Группировка определяет, как платформа отрисует объединённые колонки. Выбор влияет не только на внешний вид, но и на поведение при вводе данных.
| Значение группировки | Как выглядит | Когда применять |
|---|---|---|
| Горизонтальная | Общий заголовок над колонками, каждая колонка — отдельная ячейка | Классическая шапка «Количество / Цена / Сумма» |
| Вертикальная | Колонки выводятся одна под другой внутри одной ячейки строки | Экономия ширины таблицы при узких полях |
| ВЯчейке | Несколько полей в одной ячейке строки рядом | Компактный вывод связанных значений (например, количество и единица измерения) |
Для группировки ВЯчейке заголовок группы обычно скрывают (ОтображатьЗаголовок = Ложь), а подписи полей отключают через свойство ПоложениеЗаголовка каждой колонки, иначе ячейка получится перегруженной.
Выбор вида группировки
Стандартный вариант для шапок таблиц; требует достаточной ширины формы
Подходит для мобильного клиента и узких форм; занимает больше высоты строки
Максимально компактно, но затрудняет сортировку и редактирование отдельных полей
Добавление группы в динамически формируемую таблицу
Когда колонки создаются по данным запроса или настройкам пользователя, сначала программно добавляют реквизиты формы, затем — элементы. Порядок принципиален: нельзя привязать колонку к несуществующему реквизиту.
&НаСервере
Процедура СформироватьКолонки(МассивПоказателей)
// 1. Добавляем реквизиты таблицы
ДобавляемыеРеквизиты = Новый Массив;
Для Каждого Показатель Из МассивПоказателей Цикл
ДобавляемыеРеквизиты.Добавить(
Новый РеквизитФормы("Колонка" + Показатель.Код,
Новый ОписаниеТипов("Число"), "ТаблицаДанных", Показатель.Наименование));
КонецЦикла;
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// 2. Создаём группу и колонки
Группа = Элементы.Добавить("ГруппаПоказатели", Тип("ГруппаФормы"), Элементы.ТаблицаДанных);
Группа.Вид = ВидГруппыФормы.ГруппаКолонок;
Группа.Группировка = ГруппировкаКолонок.Горизонтальная;
Группа.Заголовок = "Показатели";
Для Каждого Показатель Из МассивПоказателей Цикл
Колонка = Элементы.Добавить("Колонка" + Показатель.Код, Тип("ПолеФормы"), Группа);
Колонка.Вид = ВидПоляФормы.ПолеВвода;
Колонка.ПутьКДанным = "ТаблицаДанных.Колонка" + Показатель.Код;
КонецЦикла;
КонецПроцедуры
При повторном формировании (пользователь изменил набор показателей) старые элементы нужно удалить через Элементы.Удалить(), а реквизиты — через ИзменитьРеквизиты() с массивом удаляемых. Иначе получите дубли имён и ошибку «Элемент с таким именем уже существует».
Настройка отображения: заголовки, ширина, фиксация
После создания группы полезно настроить её визуальные свойства. Заголовок группы задаётся свойством Заголовок, видимость шапки — ОтображатьЗаголовок и ОтображатьВШапке. Для группировки «ВЯчейке» заголовок чаще скрывают, для «Горизонтальная» — наоборот, показывают, иначе смысл объединения теряется.
Ширину отдельных колонок регулируют свойствами Ширина и РастягиватьПоГоризонтали. Если колонки внутри группы должны иметь фиксированную ширину, задайте её явно — иначе платформа распределит пространство автоматически, и при ресайзе формы колонки «поплывут».
Для широких таблиц полезно свойство таблицы ФиксацияСлева / ФиксацияСправа и свойство колонки ФиксацияВТаблице: важные группы (например, «Номенклатура») остаются видимыми при горизонтальной прокрутке, а добавленные программно группы показателей прокручиваются.
Типичные ошибки и ограничения
Самая частая ошибка — неверный родитель при добавлении. Если колонку добавить с родителем-таблицей вместо группы, она выйдет за пределы объединённой шапки. Если группу добавить с родителем-формой, а не таблицей, платформа выдаст ошибку о недопустимом виде группы для данного родителя.
Вторая группа проблем — попытка изменить состав колонок в клиентском обработчике. Методы Элементы.Добавить() и ИзменитьРеквизиты() доступны только на сервере; в тонком клиенте вызывайте серверную процедуру. Также нельзя добавлять элементы в обработчике ПриОткрытии — форма к этому моменту уже построена, используйте ПриСозданииНаСервере или отдельную серверную процедуру, вызываемую после открытия.
Ограничения: программно созданные элементы не сохраняются между сеансами — при каждом открытии формы код должен выполняться заново. Кроме того, для динамического списка с произвольным запросом добавлять колонки можно только к полям, реально присутствующим в выборке запроса.
Проверка результата
После внедрения кода откройте форму и проверьте три вещи: наличие объединённого заголовка над колонками, корректный вывод данных в каждой колонке и поведение при изменении размера окна. Если данные не выводятся — почти всегда проблема в ПутьКДанным.
Дополнительно проверьте сценарий повторного формирования: измените настройки, вызывающие пересоздание колонок, и убедитесь, что старые элементы удалены, а данные таблицы не потеряны. Полезно также проверить форму в веб-клиенте, если он используется: отрисовка групп колонок там может отличаться по ширине.
Как проверить результат
Общий заголовок виден и объединяет нужные колонки
Заголовка нет или колонки выведены рядом без объединения — проверьте Вид и Группировку
Значения соответствуют реквизитам таблицы
Пустые ячейки — неверный ПутьКДанным или реквизит не добавлен
Колонки пересоздаются без ошибок, данные сохранены
Ошибка дублирования имени или потеря введённых данных
Что важно запомнить
Группа колонок создаётся через Элементы.Добавить() с видом ГруппаКолонок и нужной группировкой, колонки добавляются с родителем-группой и обязательным ПутьКДанным. Все изменения — только на сервере, реквизиты добавляются до элементов, при пересоздании старые элементы удаляются.
Частые вопросы
Можно ли добавить группу колонок в уже существующую шапку, созданную в конфигураторе?
Да. Найдите существующую группу через Элементы.Найти("ИмяГруппы") и передайте её как родителя при добавлении новых колонок. Новые колонки появятся внутри существующего объединённого заголовка.
Почему группа создаётся, но заголовок не отображается?
Проверьте три свойства: ОтображатьЗаголовок у группы должно быть Истина, у таблицы должна быть включена шапка, а для группировки «ВЯчейке» заголовок группы платформа по умолчанию не показывает — используйте «Горизонтальная».
Как программно переместить существующую колонку в новую группу?
Используйте Элементы.Переместить(Элементы.ИмяКолонки, ГруппаКолонок). Колонка переместится внутрь группы без пересоздания, все её настройки и привязка к данным сохранятся.
Можно ли вкладывать группы колонок друг в друга?
Да, многоуровневые шапки поддерживаются: внутрь группы колонок можно добавить другую группу колонок с горизонтальной группировкой, получив двухуровневый заголовок. Главное — корректно задавать родителя на каждом уровне.
Работает ли этот подход в обычных формах?
Нет. Описанные механизмы (Элементы.Добавить, ГруппаФормы, ГруппировкаКолонок) относятся к управляемым формам. В обычных формах состав колонок табличного поля изменяется через коллекцию Колонки табличного поля, и там действуют другие объекты и свойства.
Почему после ИзменитьРеквизиты пропали данные таблицы?
Метод ИзменитьРеквизиты пересоздаёт состав реквизитов формы, и значения удалённых или переименованных реквизитов теряются. Перед вызовом выгрузите таблицу в значение (РеквизитФормыВЗначение или Выгрузить()), а после — загрузите обратно, сопоставив колонки по именам.