Как сгруппировать строки в макете (табличном документе) 1С 8.2 / 8.3?

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

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

Выясняем причину: почему пропадает шапка таблицы?

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

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

Чтобы избежать этой проблемы, необходимо строго соблюдать правила вывода:

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

Ниже мы разберем по шагам три основных способа создания структуры в табличном документе 1С.

Способ 1. Автоматическая группировка строк (Автогруппировка)

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

Для реализации этого метода мы используем связку методов НачатьАвтогруппировкуСтрок() и ЗакончитьАвтогруппировкуСтрок(), а при выводе областей задействуем расширенный синтаксис метода Вывести().

Синтаксис метода Вывести() для автогруппировки выглядит следующим образом:

ТабДок.Вывести(Область, Уровень, ИмяГруппы, Открыта)

Где:

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


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПримера");

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

// 2. Включаем режим автоматической группировки
ТабДок.НачатьАвтогруппировкуСтрок();

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

// Допустим, у нас есть плоская таблица данных, разделенная по складам
Для Каждого ТекСтрока Из СсылкаНаДокумент.Товары Цикл
    
    // Выводим группировочную строку (Склад) - Уровень 1
    Если ЭтоНовыйСклад Тогда
        ОбластьСтрока.Параметры.Склад = ТекСтрока.Склад;
        ТабДок.Вывести(ОбластьСтрока, 1, "ГруппаСкладов", Истина);
    КонецЕсли;
    
    // Выводим детальную строку (Номенклатура) - Уровень 2
    ОбластьСтрока.Параметры.Заполнить(ТекСтрока);
    ТабДок.Вывести(ОбластьСтрока, 2, "Детали", Истина);
    
КонецЦикла;

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

Способ 2. Ручная группировка интервалами (Группы строк)

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

Для этого используются парные методы табличного документа НачатьГруппуСтрок() и ЗакончитьГруппуСтрок(). Все строки, которые будут выведены между этими вызовами, автоматически объединятся в одну группу.

Разберем пример реализации ручной группировки:


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПримера");

// Выводим шапку таблицы
ОбластьШапка = Макет.ПолучитьОбласть("ФДСШапка");
ТабДок.Вывести(ОбластьШапка);

// Открываем группу строк на верхнем уровне
ТабДок.НачатьГруппуСтрок("ГруппаФДС", Истина);

ОбластьДанные = Макет.ПолучитьОбласть("ФДС");
Для Каждого ТекСтрока Из ФДС Цикл
    ОбластьДанные.Параметры.Заполнить(ТекСтрока);
    // При ручной группировке метод Вывести() вызывается в стандартном виде
    ТабДок.Вывести(ОбластьДанные);
КонецЦикла;

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

При таком подходе вам не нужно беспокоиться о нумерации уровней. Главное — следить за тем, чтобы каждый вызов НачатьГруппуСтрок() сопровождался соответствующим вызовом ЗакончитьГруппуСтрок().

Способ 3. Программная группировка по номерам строк (Метод Сгруппировать)

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

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

Проанализируем пример кода:


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПримера");

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

// Запоминаем строку начала группировки (текущая высота + 1)
СтрокаНачала = ТабДок.ВысотаТаблицы + 1;

Для Каждого ТекСтрока Из ДанныеДляПечати Цикл
    ОбластьСтрока.Параметры.Заполнить(ТекСтрока);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

// Запоминаем строку окончания группировки
СтрокаОкончания = ТабДок.ВысотаТаблицы;

// Если в группе есть строки, выполняем группировку post-factum
Если СтрокаОкончания >= СтрокаНачала Тогда
    // Получаем область строк и группируем их
    ТабДок.Область(СтрокаНачала, , СтрокаОкончания, ).Сгруппировать("ИмяГруппы", Истина);
КонецЕсли;

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

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

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

1. Отображение кнопок управления группировками (плюсы и минусы):
По умолчанию кнопки свертывания/развертывания могут быть скрыты. Чтобы они отображались на экране, обязательно установите свойство:
ТабДок.ОтображатьГруппировкиСтрок = Истина;

2. Расположение кнопок свертки:
Вы можете управлять тем, с какой стороны будут находиться кнопки сворачивания — сверху группы или снизу. Стандартно в бухгалтерских отчетах их располагают снизу:
ТабДок.ГруппировкиСтрокСверху = Ложь;

3. Управление начальным уровнем отображения:
Если вы хотите, чтобы при открытии печатной формы все детальные строки были свернуты, а пользователь видел только общие итоги первого уровня, используйте метод:
ТабДок.ПоказатьУровеньГруппировокСтрок(0);
Примечание: Индексация уровней в данном методе начинается с 0 (самый верхний уровень свернут).

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

← На главную