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

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

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

Однако в обычных формах (платформа 1С 8.0–8.2, а также 8.3 в режиме совместимости) попытка стандартного объединения колонок в табличном поле приводит к неприятному побочному эффекту: строки данных в табличном поле также разбиваются на два уровня. Высота каждой строки удваивается, под ячейкой-родителем в строках данных образуется пустое пространство, а интерфейс становится перегруженным и неэстетичным.

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

Решение для обычных форм: Настройка колонок и программное сжатие строки

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

Шаг 1. Настройка взаимного расположения колонок в конфигураторе

Откроем свойства колонок нашего табличного поля и настроим их положение относительно друг друга:

  1. Создадим колонку-родитель, которая будет служить общей шапкой (назовем ее Месяц). В ее свойствах установим значение свойства Положение (Position) в положение «Новая колонка».
  2. Для первой подчиненной колонки (План) укажем свойство Положение как «На следующей строке». Таким образом, она визуально переместится на второй ярус под колонку-родитель.
  3. Для последующих подчиненных колонок (Выпуск и Остаток) установим свойство Положение в значение «В той же колонке». Это выстроит их в один горизонтальный ряд на втором уровне, справа от колонки План.

После выполнения этих настроек в конфигураторе шапка примет желаемый двухуровневый вид. Однако запустив отладку, мы увидим, что высота всех строк данных увеличилась ровно в два раза. Это происходит потому, что платформа зарезервировала место под значение колонки Месяц внутри каждой строки.

Шаг 2. Программное скрытие лишнего уровня в строках данных

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

Проанализируем программный код, который решает эту задачу:


Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Скрываем ячейку общей родительской колонки внутри строки данных
    ОформлениеСтроки.Ячейки.Месяц.Видимость = Ложь;
EndProcedure

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

Важная деталь оптимизации: событие ПриПолученииДанных

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

Рассмотрим пример реализации через пакетную обработку строк:


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

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

Альтернативный вариант для обычных форм: Текстовый заголовок

Если нет желания писать программный код или изменять структуру колонок, можно воспользоваться простым «обходным» путем, который предложили участники обсуждения на форуме. Мы можем объединить названия уровней в одну строку текста внутри заголовка единственной колонки.

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

Современное решение: Управляемые формы (1С 8.2 / 8.3)

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

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

  1. Откройте форму в редакторе конфигуратора и перейдите на вкладку Элементы.
  2. В дереве элементов формы найдите ваше табличное поле (или таблицу формы). Нажмите правой кнопкой мыши и выберите команду Добавить -> Группа колонок (объект типа ГруппаФормы с видом ГруппаКолонок).
  3. В палитре свойств созданной группы колонок заполните следующие параметры:
    • Имя: ГруппаМесяц
    • Заголовок: Месяц
    • Группировка: установите значение «Горизонтальная» (чтобы вложенные колонки располагались слева направо в один ряд).
    • Отображать в шапке: установите флаг в значение Истина (Да).
  4. Перетащите мышью существующие элементы-колонки План, Выпуск и Остаток внутрь созданной группы ГруппаМесяц.

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

Использование поля табличного документа для сложной отчетности

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

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

← На главную