Как реализовать сложную многоуровневую шапку таблицы с разной высотой строк в управляемых формах 1С?

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

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

Метод 1. Использование групп колонок в управляемой форме

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

Шаг 1. Создание структуры групп

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

  1. Группировка: Это свойство определяет, как будут располагаться элементы внутри группы. Если мы выберем Горизонтальная, колонки выстроятся в ряд. Если Вертикальная — колонки (или вложенные группы) встанут друг под другом.
  2. Отображение: Чтобы шапка не выглядела перегруженной лишними рамками, установим значение Нет или Сквозная. Это позволит скрыть границы самой группы, оставив только иерархический заголовок.

Шаг 2. Решение проблемы с разной высотой строк

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

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


// Программное создание колонки с увеличенной высотой заголовка
НоваяКолонка = Элементы.Добавить("КолонкаДанных", Тип("ПолеФормы"), ГруппаВторогоУровня);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Объект.ТабличнаяЧасть.Данные";

// Добавляем переносы строк для увеличения высоты ячейки шапки
НоваяКолонка.Заголовок = "Название" + Символы.ПС + "колонки в" + Символы.ПС + "три строки";

Шаг 3. Фиксация ширины колонок

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

Метод 2. Реализация через Табличный документ

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

Преимущества работы с Табличным документом:

  1. Возможность задать любую высоту и ширину для каждой конкретной ячейки.
  2. Поворот текста (свойство ОриентацияТекста).
  3. Сложное объединение ячеек в макете.
  4. Использование стандартных оформительских приемов 1С (шрифты, цвета, узоры).

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

Настройка интерактивности:

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


// Настройка области для ввода данных
ОбластьДляВвода = ТабДок.Область("R5C2:R10C10");
ОбластьДляВвода.Защита = Ложь; // Разрешаем редактирование в ячейках
ОбластьДляВвода.СодержитЗначение = Истина;
ОбластьДляВвода.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

// Настройка самого элемента управления на форме
Элементы.ТабличныйДокументНаФорме.ТолькоПросмотр = Ложь;
Элементы.ТабличныйДокументНаФорме.Редактирование = Истина;

Обработка изменений:

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


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

Сравнение подходов: что выбрать?

Выясним, какой метод оптимален для вашей задачи. Если вам требуется динамическое добавление колонок, стандартная сортировка, отборы и привычное поведение списка, то Метод 1 (Группы колонок) является приоритетным. Он сохраняет все преимущества Динамического списка или Табличной части.

Если же визуальная составляющая шапки критична (например, шахматка, сложные ведомости с вертикальным текстом), и количество строк в таблице не исчисляется тысячами, то Метод 2 (Табличный документ) предоставит вам полную свободу действий. Рассмотрим подробнее ситуацию с программным созданием сложной шапки в макете табличного документа:


&НаСервере
Процедура СформироватьСложнуюШапку()
    ТабДок = Объект.Результат;
    Макет = ПолучитьМакет("МакетШапки");
    
    // Выводим основную область
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ТабДок.Вывести(ОбластьШапка);
    
    // Фиксируем шапку, чтобы она не уходила при скроллинге
    ТабДок.ФиксацияСверху = ОбластьШапка.ВысотаТаблицы;
КонецПроцедуры

Программное управление элементами формы (Advanced)

Для продвинутых задач, когда колонки создаются динамически в зависимости от настроек пользователя, важно соблюдать строгую иерархию при вызове метода Элементы.Добавить(). Проанализируем ситуацию: если вы добавите колонку непосредственно в таблицу, она всегда будет в конце. Чтобы поместить её внутрь группы, вторым параметром нужно передать именно объект группы.


// 1. Создаем группу первого уровня (например, "Период")
ГруппаПериод = Элементы.Добавить("ГруппаПериод", Тип("ГруппаФормы"), Элементы.ТаблицаДанных);
ГруппаПериод.Вид = ВидГруппыФормы.ГруппаКолонок;
ГруппаПериод.Заголовок = "Январь 2024";

// 2. Создаем вложенную группу (например, "План/Факт")
ГруппаПлан = Элементы.Добавить("ГруппаПлан", Тип("ГруппаФормы"), ГруппаПериод);
ГруппаПлан.Вид = ВидГруппыФормы.ГруппаКолонок;
ГруппаПлан.Заголовок = "Плановые показатели";

// 3. Добавляем конкретную колонку в группу "План"
КолонкаСумма = Элементы.Добавить("КолонкаПланСумма", Тип("ПолеФормы"), ГруппаПлан);
КолонкаСумма.Вид = ВидПоляФормы.ПолеВвода;
КолонкаСумма.ПутьКДанным = "Объект.Данные.СуммаПлан";

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

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

← На главную