Как реализовать трехуровневую шапку в табличном поле в обычных формах 1С

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

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

Анализ ограничений стандартного объекта ТабличноеПоле

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

Выясним причину, по которой три уровня и более работают нестабильно. Платформа 1С 8.x в режиме обычных форм проектировалась с расчетом на двухслойные шапки. При попытке добавить третий уровень через свойство Положение, визуальная связь между "дедушкой", "отцом" и "сыном" (уровнями иерархии) теряется. Главная проблема заключается в поведении границ: при изменении ширины родительской колонки, вложенные колонки третьего уровня часто не масштабируются пропорционально, что приводит к "разваливанию" всей структуры при интерактивном использовании пользователем.

Метод 1: Программная имитация иерархии через свойство Положение

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

Посмотрим на пример логики программного создания такой структуры:


// Пример настройки колонок для имитации многоуровневости
НоваяКолонка = ЭлементыФормы.ТабличноеПоле.Колонки.Добавить("Группа1");
НоваяКолонка.ТекстШапки = "Верхний уровень (Склад)";

ПодКолонка = ЭлементыФормы.ТабличноеПоле.Колонки.Добавить("ПодГруппа1");
ПодКолонка.ТекстШапки = "Второй уровень (Товары)";
ПодКолонка.Положение = ПоложениеКолонкиТабличногоПоля.НаСледующейСтроке;

ДетальнаяКолонка = ЭлементыФормы.ТабличноеПоле.Колонки.Добавить("Количество");
ДетальнаяКолонка.ТекстШапки = "Третий уровень (Остаток)";
ДетальнаяКолонка.Положение = ПоложениеКолонкиТабличногоПоля.ВТойЖеКолонке;

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

Метод 2: Использование Поля табличного документа

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

Рассмотрим алгоритм реализации:

  1. Разместим на форме элемент ПолеТабличногоДокумента.
  2. Сформируем макет шапки, где вручную объединим ячейки для создания трех уровней.
  3. Для вывода данных напишем программный цикл, который будет обходить выборку запроса или таблицу значений и заполнять строки документа.

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

Метод 3: Комбинированный подход (Синхронизированная шапка)

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

Для корректной работы нам потребуется синхронизировать эти объекты. Проанализируем, какие события необходимо обрабатывать:


// Примерная схема синхронизации ширины колонок
Процедура ПриИзмененииШириныКолонки(Колонка)
    // Находим соответствующую область в табличном документе сверху
    // и устанавливаем ей аналогичную ширину
    ЭлементыФормы.ПолеТабДокШапка.Область(, НомерКолонки).ШиринаКолонки = Колонка.Ширина;
КонецПроцедуры

Также необходимо синхронизировать горизонтальную прокрутку. Это сложная задача для обычных форм, требующая иногда использования внешних компонент или API Windows для перехвата событий скроллинга. Тем не менее, это единственный способ получить "честное" поведение таблицы с крайне сложной шапкой в ОФ.

Практические советы по оформлению

Если вы решили остановиться на стандартном ТабличномПоле, попробуйте минимизировать визуальный хаос. Используйте программную установку ширины колонок при открытии формы, чтобы уровни выровнялись. Помните, что свойство УстановитьПривязки для колонок в ОФ работает специфично, и лучше всего жестко фиксировать ширину подчиненных колонок, если это возможно по бизнес-логике.

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

← На главную