Как объединить колонки и сделать многоуровневую шапку в табличном поле 1С?

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

При разработке интерфейсов в 1С часто возникает задача визуального объединения колонок таблицы под одним общим заголовком — так, как это обычно делается в табличных документах или Excel. Например, требуется отобразить общую верхнюю шапку «Нормированная зарплата», а под ней расположить две подчиненные колонки: «Тшт» и «ООТиЗ». Разберем подробно, какими способами можно решить эту задачу в обычных формах, а также рассмотрим особенности управляемого интерфейса и альтернативные варианты реализации.

Реализация составной шапки в обычных формах (Табличное поле)

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

  1. Создание фиктивной колонки-шапки. Добавим в табличное поле новую колонку, которая будет выступать общим заголовком. Укажем для нее текст шапки (например, Нормированная зарплата). Данные для этой колонки указывать не нужно.
  2. Настройка взаимного расположения колонок. В палитре свойств колонок табличного поля настроим свойство Положение:
    1. Для колонки-шапки (НормированнаяЗарплата) устанавливаем свойство Положение в значение НоваяКолонка.
    2. Для первой подчиненной колонки (Тшт) устанавливаем свойство Положение в значение НаСледующейСтроке. Это сдвинет ее под колонку-шапку.
    3. Для второй подчиненной колонки (ООТиЗ) устанавливаем свойство Положение в значение ВТойЖеКолонке. В результате обе подчиненные колонки окажутся на второй строке непосредственно под общей шапкой.
  3. Скрытие пустой ячейки данных в строках. Так как фиктивная колонка-шапка занимает верхний уровень ячейки во всей строке таблицы, в режиме данных над подчиненными колонками появится пустая неиспользуемая область. Чтобы скрыть эту область и сделать отображение гармоничным, используем событие табличного поля ПриПолученииДанных.

Посмотрим на программную реализацию обработчика события ПриПолученииДанных:


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

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

Возможные проблемы и особенности поведения в режиме «1С:Предприятие»

Иногда после выполнения указанных настроек конфигуратор отображает шапку объединенной, а в режиме «1С:Предприятие» структура сбивается или выглядит стандартно. Выясним основные причины такого поведения и способы их устранения:

  1. Сохраненные пользовательские настройки формы. Если пользователь ранее открывал форму и менял ширину или видимость колонок, платформа сохраняет эти настройки в системном кэше. При последующих запусках сохраненный порядок колонок перетирает настройки, сделанные в конфигураторе. Для проверки и исправления следует сбросить настройки через меню «Все действия» / «Действия» → «Установить стандартные настройки».
  2. Вызов метода СоздатьКолонки(). Если при открытии формы или программном заполнении источника данных выполняется вызов ЭлементыФормы.ТабличноеПоле.СоздатьКолонки(), платформа пересоздает все колонки заново со стандартным положением НоваяКолонка, сбрасывая ручную группировку. Все настройки взаимного расположения колонок необходимо производить строго после инициализации структуры.
  3. Особенности работы с Деревом значений. Если источником данных для табличного поля является ДеревоЗначений, важно учитывать, что самая первая (крайняя левая) колонка отвечает за отрисовку иерархических отступов и пиктограмм разворачивания узлов. Попытка применить составное размещение или скрыть ячейку в первой колонке дерева нарушает механизм отображения узлов. Составные шапки в дереве значений следует применять только к колонкам, расположенным правее основной иерархической колонки.
  4. Увеличение высоты строк. При использовании многострочного размещения физическая высота строки таблицы увеличивается, так как платформа рассчитывает ее с учетом нескольких уровней ячеек.

Защита колонок от случайного изменения пользователем

Чтобы пользователи не нарушили структуру объединенной шапки интерактивными действиями, рекомендуется ограничить возможность перемещения колонок:

  1. У табличного поля установить свойство ИзменятьПозициюКолонок = Ложь или отключить свойство ИзменятьНастройкуКолонок.
  2. У созданной фиктивной колонки-шапки и зависимых колонок установить свойства ИзменятьПозицию = Ложь и ИзменятьВидимость = Ложь.
  3. Для фиктивной колонки отключить интерактивную сортировку, так как она не привязана к реальным данным.

Объединение колонок в Управляемых формах

В управляемом интерфейсе (1С:Предприятие 8.3) задача многоуровневых шапок решается штатным и более простым механизмом группировки:

  1. В дереве элементов формы в состав таблицы добавляется элемент Группа - Группа колонок.
  2. В свойствах созданной группы задается заголовок (например, Нормированная зарплата) и указывается свойство отображения заголовка.
  3. Подчиненные колонки (Тшт и ООТиЗ) просто перетаскиваются внутрь этой группы колонок.

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

Альтернативное решение: Поле табличного документа

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

← На главную