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

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

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

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

Первый способ, который мы рассмотрим, — это использование встроенного механизма автогруппировки. Этот метод удобен тем, что структура дерева колонок формируется непосредственно в процессе вывода областей макета. Давайте проанализируем, как работают методы НачатьАвтогруппировкуКолонок и ЗакончитьАвтогруппировкуКолонок.

Когда мы вызываем метод Вывести или Присоединить, у них есть параметры, отвечающие за уровень группировки. Рассмотрим пример кода, где мы последовательно присоединяем области и указываем их уровень:


ТабДокумент.НачатьАвтогруппировкуКолонок();

// Выводим первую область (начало строки)
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок|Колонка1");
ТабДокумент.Вывести(ОбластьМакета);

// Присоединяем области с указанием уровня группировки
// Уровень 2 означает, что колонка будет вложена в уровень 1
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок|Колонка2");
ТабДокумент.Присоединить(ОбластьМакета, 2, "Группа1", Истина); 

ОбластьМакета = Макет.ПолучитьОбласть("Заголовок|Колонка3");
ТабДокумент.Присоединить(ОбластьМакета, 2, "Группа1", Истина);

// Возвращаемся на уровень 1, чтобы закрыть группировку
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок|Итого");
ТабДокумент.Присоединить(ОбластьМакета, 1, , Ложь);

ТабДокумент.ЗакончитьАвтогруппировкуКолонок();

Важный нюанс: как показывает практика, метод НачатьАвтогруппировкуКолонок иногда может вести себя непредсказуемо при сложных вложенностях. Если уровни «схлопываются» не так, как ожидалось, рекомендуется переходить к более явному управлению группами.

Способ 2: Явное управление группами через НачатьГруппуКолонок

Если автоматический режим не дает нужного результата, мы можем использовать методы НачатьГруппуКолонок и ЗакончитьГруппуКолонок. Это позволяет более жестко контролировать границы иерархии. Проанализируем ситуацию: нам нужно создать группу, внутри которой будут находиться несколько колонок.

Рассмотрим последовательность действий:

  1. Вызываем метод НачатьГруппуКолонок перед выводом тех колонок, которые должны сворачиваться.
  2. Выводим области макета методом Присоединить.
  3. Завершаем группу методом ЗакончитьГруппуКолонок.

// Выводим основную колонку
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка|Основная"));

// Начинаем группировку для зависимых колонок
ТабДок.НачатьГруппуКолонок("Подробности", Истина);

ТабДок.Присоединить(Макет.ПолучитьОбласть("Шапка|ДопИнфо1"));
ТабДок.Присоединить(Макет.ПолучитьОбласть("Шапка|ДопИнфо2"));

// Закрываем группу
ТабДок.ЗакончитьГруппуКолонок();

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

Способ 3: Группировка в уже сформированном документе (метод Сгруппировать)

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

Синтаксис метода выглядит так: Область(Строка1, Колонка1, Строка2, Колонка2).Сгруппировать(). Однако для колонок мы можем опустить индексы строк, чтобы воздействовать на всю вертикаль. Посмотрим на пример:


// Группируем колонки с 3-й по 5-ю
НомерПервойКолонки = 3;
НомерПоследнейКолонки = 5;
ТабДок.Область(, НомерПервойКолонки, , НомерПоследнейКолонки).Сгруппировать("Детализация");

Если вам нужно создать несколько уровней вложенности, просто вызывайте метод последовательно для разных диапазонов. Например, сначала сгруппируйте колонки 2–10 (1 уровень), а затем внутри них — колонки 3–5 (2 уровень). Платформа 1С поддерживает до 7 уровней вложенности, чего обычно более чем достаточно для любого финансового или управленческого отчета. Для контроля достоверности данных в итоговых документах можно автоматически сравнивать бухгалтерские и налоговые проводки между проверяемыми базами.

Тонкая настройка визуализации группировок

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

Положение кнопок управления. По умолчанию «плюсики» располагаются справа от группы. Если вы хотите, чтобы они находились слева (перед данными), используйте свойство ОтображатьКнопкиГруппировокСлева. Установив его в значение Истина, вы сделаете интерфейс более привычным для тех, кто часто работает в Excel.

Управление состоянием групп. Мы можем программно свернуть или развернуть все группировки до определенного уровня с помощью метода ПоказатьУровеньГруппировокКолонок(Уровень). Например:


// Свернуть все колонки до самого верхнего уровня
ТабДок.ПоказатьУровеньГруппировокКолонок(0);

// Развернуть дерево до второго уровня вложенности
ТабДок.ПоказатьУровеньГруппировокКолонок(2);

Очистка перед переформированием. При динамическом формировании отчета крайне важно очищать старые группировки, иначе при каждом нажатии кнопки «Сформировать» они будут накладываться друг на друга. Для этого используем метод УдалитьГруппировки. Обратите внимание на параметры: первый отвечает за строки, второй — за колонки.


// Удаляем только группировки колонок, оставляя строки нетронутыми
ТабДок.УдалитьГруппировки(Ложь, Истина);

Особенности работы с СКД (Системой компоновки данных)

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

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

Использование именованных областей макета — самый безопасный способ. Если вы назначите имена колонкам в макете, то сможете обращаться к ним через ТабДок.Область("ИмяОбласти").Лево и ТабДок.Область("ИмяОбласти").Право. Это защитит ваш код от поломок при изменении структуры макета (например, при добавлении новых технических колонок в середину таблицы).

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

← На главную