К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

Как сгруппировать строки в табличном документе 1С: методы НачатьГруппуСтрок и ЗакончитьГруппуСтрок, уровни группировки, итоги по группам, типичные ошибки и примеры кода.

Группировка строк в табличном документе 1С — это способ объединить несколько строк в сворачиваемый блок с кнопкой «плюс/минус», как в отчётах. Такой приём используется при программном формировании печатных форм и отчётов: пользователь видит сначала только заголовки групп и итоги, а детальные строки раскрывает по необходимости.

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

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

Что такое группировка строк и когда она нужна

Группировка строк — это иерархическая структура внутри табличного документа. Сгруппированные строки можно свернуть и развернуть кнопкой в левой части документа, а также управлять видимостью уровней через меню «Таблица — Группировка» или соответствующие кнопки панели. Типичный пример — отчёт «Продажи по контрагентам», где строки документов свернуты внутри групп по контрагентам.

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

Ограничение: группировка работает только в табличном документе, сформированном программно. В уже открытом произвольном документе пользователь тоже может сворачивать строки, но только если разработчик заложил эту структуру при выводе.

Базовый способ: НачатьГруппуСтрок и ЗакончитьГруппуСтрок

Основная пара методов — НачатьГруппуСтрок(ИмяГруппы, Открыта) и ЗакончитьГруппуСтрок(). Первый параметр — произвольное имя группы (пригодится для отладки и поиска), второй — булево признак, будет ли группа развёрнута при показе документа. Если параметр опустить, группа по умолчанию открыта.

Последовательность действий простая: выводите строку-заголовок группы (например, контрагент и сумма итога), вызываете НачатьГруппуСтрок(), выводите детальные строки циклом, затем вызываете ЗакончитьГруппуСтрок(). Всё, что выведено между этими вызовами, попадёт внутрь группы.

ТабДок.Вывести(Макет.ПолучитьОбласть("ГруппаКонтрагент"), 1);

ТабДок.НачатьГруппуСтрок("Детали", Ложь);

Пока ВыборкаДетали.Следующий() Цикл

ТабДок.Вывести(Макет.ПолучитьОбласть("Строка"), 2);

КонецЦикла;

ТабДок.ЗакончитьГруппуСтрок();

Обратите внимание на второй параметр метода Вывести() — уровень. Он используется при автоматической группировке и при выводе иерархии; при ручном управлении группами он не обязателен, но его согласованное использование упрощает чтение кода.

Порядок действий
  1. 1
    Сформируйте запрос с итогами по нужному полю (ИТОГИ ПО ...) или отсортируйте данные по группировочному признаку
  2. 2
    Выведите строку-заголовок группы с наименованием и итогом
  3. 3
    Вызовите ТабДок.НачатьГруппуСтрок("Имя", Ложь) — группа будет свёрнута при показе
  4. 4
    В цикле выведите детальные строки группы
  5. 5
    Вызовите ТабДок.ЗакончитьГруппуСтрок() и перейдите к следующей группе
  6. 6
    Откройте документ и проверьте сворачивание кнопками уровней

Вложенные группы и уровни

Группы можно вкладывать друг в друга, создавая многоуровневую структуру: например, «Склад → Номенклатурная группа → Документ». Для этого вызывайте НачатьГруппуСтрок() повторно внутри уже открытой группы и закрывайте группы в обратном порядке — как скобки в выражении.

Критично соблюдать парность: каждому НачатьГруппуСтрок() должен соответствовать свой ЗакончитьГруппуСтрок(). Если закрыть группу раньше времени или забыть закрыть, структура «поедет»: детальные строки окажутся не в той группе, а кнопки уровней будут работать непредсказуемо. Ошибки времени выполнения при этом может и не быть — документ просто отобразится неверно.

ВыборкаСклады = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаСклады.Следующий() Цикл

ТабДок.Вывести(ОбластьСклад);

ТабДок.НачатьГруппуСтрок("Группы", Ложь);

ВыборкаГруппы = ВыборкаСклады.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаГруппы.Следующий() Цикл

ТабДок.Вывести(ОбластьГруппа);

ТабДок.НачатьГруппуСтрок("Документы", Ложь);

// вывод детальных строк

ТабДок.ЗакончитьГруппуСтрок();

КонецЦикла;

ТабДок.ЗакончитьГруппуСтрок();

КонецЦикла;

Автоматическая группировка при выводе областей

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

Именно так работает типовой вывод отчётов: заголовок группы выводится с уровнем 1, детали — с уровнем 2. Этот подход сокращает код и исключает ошибки парности, но требует аккуратного и последовательного назначения уровней всем областям макета.

Для уже сформированного документа есть метод СводнаяГруппировкаСтрок() — он строит группировку по значениям в указанной колонке постфактум. Это удобно, когда документ сформирован «плоско», а сворачиваемая структура нужна без переписывания логики вывода.

Сравнение вариантов

Ручные НачатьГруппуСтрок/ЗакончитьГруппуСтрок

Полный контроль над именами и состоянием групп; больше кода и риск нарушить парность

Уровни при Вывести()

Компактный код, автоматическое закрытие групп; требует дисциплины в назначении уровней всем областям

СводнаяГруппировкаСтрок

Быстрая группировка готового документа по колонке; не подходит для сложной вложенной логики и итогов

Итоги по группам

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

Распространённый приём — выводить итог и в заголовке, и в подвале группы: заголовок виден, когда группа свёрнута, подвал — когда развёрнута. Для подвала просто выведите итоговую область после цикла детальных строк, но до ЗакончитьГруппуСтрок() — тогда подвал сворачивается вместе с деталями, либо после закрытия группы, чтобы он оставался видимым.

Если итог нужен в свёрнутом виде, выводите его в строке заголовка группы — она остаётся видимой при сворачивании. Строки внутри группы при сворачивании скрываются полностью, включая подвал.
ПЗ
Практическое замечание

Проверка результата и типичные ошибки

Проверить результат можно визуально: откройте сформированный документ и пощёлкайте кнопки уровней группировки (цифры 1, 2, 3 в левой верхней части) и значки «плюс/минус» у групп. Уровень 1 должен показывать только заголовки групп с итогами, максимальный уровень — все строки.

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

Контрольные точки

Как проверить результат

Кнопки уровней группировки
Норма

Уровень 1 показывает только заголовки групп, уровни раскрывают детали постепенно

Тревожный признак

Часть строк видна на любом уровне или уровни не переключаются

Состав групп
Норма

Внутри каждой группы строки только её значения группировки

Тревожный признак

Строки одной группы попадают в соседнюю — нарушена сортировка или порядок закрытия групп

Итоги
Норма

Сумма итогов групп равна общему итогу документа

Тревожный признак

Итоги не сходятся — ошибка в запросе с ИТОГИ ПО или в обходе выборки

Типичные ошибки
01
Забытый ЗакончитьГруппуСтрок — вся нижележащая часть документа попадает внутрь последней группы
02
Вывод детальных строк без сортировки данных по группировочному полю — одна группа разваливается на несколько одноимённых
03
Ожидание автоматического подсчёта сумм — группировка не считает итоги, их нужно получать в запросе
04
Смешение ручного управления группами и уровней в Вывести() без системы — структура становится непредсказуемой

Ограничения и когда группировка не подходит

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

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

Частые вопросы

Можно ли сгруппировать строки в уже открытом табличном документе вручную, без кода?

Нет, в пользовательском режиме создать новую группировку строк в произвольном табличном документе нельзя — структура задаётся программно при формировании. Пользователь может только сворачивать и разворачивать существующие группы.

Чем группировка строк отличается от группировки в запросе?

Группировка в запросе (СГРУППИРОВАТЬ ПО, ИТОГИ ПО) агрегирует данные и считает суммы. Группировка строк табличного документа — только визуальное сворачивание выведенных строк. Обычно они применяются вместе: запрос готовит данные и итоги, документ оформляет их вывод.

Как сделать, чтобы все группы были свёрнуты при открытии документа?

Передайте вторым параметром метода НачатьГруппуСтрок значение Ложь — группа будет создана свёрнутой. Альтернативно после формирования можно программно изменить состояние, перебрав группы, но параметр при создании — самый простой способ.

Сохранится ли группировка при сохранении в Excel?

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

Как вывести итог, видимый и в свёрнутом, и в развёрнутом состоянии?

Выведите итог в строке заголовка группы — она остаётся видимой при сворачивании. Если нужен и подвал в развёрнутом виде, выведите итоговую область ещё раз после детальных строк внутри группы.

Сколько уровней вложенности групп допустимо?

Жёсткого практического лимита для типовых отчётов нет — реальных сценариев с 2–4 уровнями достаточно. Ориентируйтесь на удобство чтения: глубокая вложенность затрудняет навигацию, и в таких случаях лучше рассмотреть отчёт на СКД.

Итог

Что важно запомнить

Группировка строк создаётся парой НачатьГруппуСтрок/ЗакончитьГруппуСтрок или уровнями при Вывести(). Данные и итоги готовьте заранее запросом с ИТОГИ ПО — группировка сама ничего не считает. Соблюдайте парность вызовов и проверяйте результат кнопками уровней.