При формировании печатных форм и отчетов в платформе 1С:Предприятие часто возникает необходимость структурировать выводимые данные. Группировка строк позволяет сделать отчеты более читаемыми, предоставляя пользователю возможность сворачивать и разворачивать детальные данные по иерархии (например, скрывать список товаров внутри группы склада или контрагента). В этой статье мы подробно разберем, как правильно реализовать группировку строк в табличном документе, проанализируем частые ошибки начинающих разработчиков и рассмотрим три эффективных способа решения этой задачи.
Очень часто при реализации автоматической группировки разработчики сталкиваются с неприятным поведением системы: после применения группировок "пропадает" (скрывается) шапка таблицы или заголовок документа. Проанализируем, почему это происходит.
Рассмотрим стандартный механизм работы платформы. Когда мы вызываем метод НачатьАвтогруппировкуСтрок(), табличный документ переходит в режим отслеживания уровней вложенности выводимых областей. Если мы выводим область шапки таблицы внутри этого интервала без указания явного уровня (или присваиваем ей тот же уровень, что и строкам данных), 1С считает шапку частью сворачиваемой группы. При первом же свертывании группы строк шапка скрывается вместе с детальными записями.
Чтобы избежать этой проблемы, необходимо строго соблюдать правила вывода:
НачатьАвтогруппировкуСтрок(), если они не должны принимать участие в группировке.Ниже мы разберем по шагам три основных способа создания структуры в табличном документе 1С.
Этот способ является наиболее гибким и часто используется при выводе иерархических данных, например, результатов запроса с итогами. При автогруппировке платформа сама строит дерево группировок на основе переданных уровней вложенности.
Для реализации этого метода мы используем связку методов НачатьАвтогруппировкуСтрок() и ЗакончитьАвтогруппировкуСтрок(), а при выводе областей задействуем расширенный синтаксис метода Вывести().
Синтаксис метода Вывести() для автогруппировки выглядит следующим образом:
ТабДок.Вывести(Область, Уровень, ИмяГруппы, Открыта)
Где:
Рассмотрим пример программного кода, в котором мы сначала выводим шапку, а затем программно группируем строки табличной части:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПримера");
// 1. Выводим шапку ДО начала автогруппировки, чтобы она не скрывалась
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// 2. Включаем режим автоматической группировки
ТабДок.НачатьАвтогруппировкуСтрок();
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Допустим, у нас есть плоская таблица данных, разделенная по складам
Для Каждого ТекСтрока Из СсылкаНаДокумент.Товары Цикл
// Выводим группировочную строку (Склад) - Уровень 1
Если ЭтоНовыйСклад Тогда
ОбластьСтрока.Параметры.Склад = ТекСтрока.Склад;
ТабДок.Вывести(ОбластьСтрока, 1, "ГруппаСкладов", Истина);
КонецЕсли;
// Выводим детальную строку (Номенклатура) - Уровень 2
ОбластьСтрока.Параметры.Заполнить(ТекСтрока);
ТабДок.Вывести(ОбластьСтрока, 2, "Детали", Истина);
КонецЦикла;
// 3. Завершаем автогруппировку
ТабДок.ЗакончитьАвтогруппировкуСтрок();
Если структура вашего документа относительно проста (например, один уровень группировки) и вам не хочется высчитывать уровни вложенности в методе Вывести(), можно применить ручную группировку интервалами. Этот метод очень нагляден и отлично подходит для создания простых печатных форм с разделами.
Для этого используются парные методы табличного документа НачатьГруппуСтрок() и ЗакончитьГруппуСтрок(). Все строки, которые будут выведены между этими вызовами, автоматически объединятся в одну группу.
Разберем пример реализации ручной группировки:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПримера");
// Выводим шапку таблицы
ОбластьШапка = Макет.ПолучитьОбласть("ФДСШапка");
ТабДок.Вывести(ОбластьШапка);
// Открываем группу строк на верхнем уровне
ТабДок.НачатьГруппуСтрок("ГруппаФДС", Истина);
ОбластьДанные = Макет.ПолучитьОбласть("ФДС");
Для Каждого ТекСтрока Из ФДС Цикл
ОбластьДанные.Параметры.Заполнить(ТекСтрока);
// При ручной группировке метод Вывести() вызывается в стандартном виде
ТабДок.Вывести(ОбластьДанные);
КонецЦикла;
// Закрываем ранее открытую группу строк
ТабДок.ЗакончитьГруппуСтрок();
При таком подходе вам не нужно беспокоиться о нумерации уровней. Главное — следить за тем, чтобы каждый вызов НачатьГруппуСтрок() сопровождался соответствующим вызовом ЗакончитьГруппуСтрок().
Иногда структура печатной формы становится понятна только после того, как весь документ уже сформирован. В таких ситуациях мы можем применить группировку к уже готовому табличному документу, используя метод Сгруппировать() для конкретной области строк.
Для реализации этого способа нам понадобится фиксировать номера строк начала и окончания выводимой группы. Текущий номер строки в процессе заполнения можно узнать с помощью свойства ВысотаТаблицы табличного документа.
Проанализируем пример кода:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПримера");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Запоминаем строку начала группировки (текущая высота + 1)
СтрокаНачала = ТабДок.ВысотаТаблицы + 1;
Для Каждого ТекСтрока Из ДанныеДляПечати Цикл
ОбластьСтрока.Параметры.Заполнить(ТекСтрока);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Запоминаем строку окончания группировки
СтрокаОкончания = ТабДок.ВысотаТаблицы;
// Если в группе есть строки, выполняем группировку post-factum
Если СтрокаОкончания >= СтрокаНачала Тогда
// Получаем область строк и группируем их
ТабДок.Область(СтрокаНачала, , СтрокаОкончания, ).Сгруппировать("ИмяГруппы", Истина);
КонецЕсли;
Этот способ предоставляет максимальный контроль над границами группировок, так как вы оперируете точными номерами строк табличного документа.
Чтобы группировки выглядели красиво и удобно для пользователя, мы рекомендуем настроить дополнительные свойства объекта ТабличныйДокумент:
1. Отображение кнопок управления группировками (плюсы и минусы):
По умолчанию кнопки свертывания/развертывания могут быть скрыты. Чтобы они отображались на экране, обязательно установите свойство:
ТабДок.ОтображатьГруппировкиСтрок = Истина;
2. Расположение кнопок свертки:
Вы можете управлять тем, с какой стороны будут находиться кнопки сворачивания — сверху группы или снизу. Стандартно в бухгалтерских отчетах их располагают снизу:
ТабДок.ГруппировкиСтрокСверху = Ложь;
3. Управление начальным уровнем отображения:
Если вы хотите, чтобы при открытии печатной формы все детальные строки были свернуты, а пользователь видел только общие итоги первого уровня, используйте метод:
ТабДок.ПоказатьУровеньГруппировокСтрок(0);
Примечание: Индексация уровней в данном методе начинается с 0 (самый верхний уровень свернут).
Применяя эти несложные настройки и выбрав подходящий метод группировки (автоматический, ручной или программный по номерам строк), мы сможем создавать функциональные, интерактивные и интуитивно понятные печатные формы для пользователей любых конфигураций 1С.