Разработка и Конфигурация · 11 мин
Как сгруппировать строки в табличном документе 1С
Как сгруппировать строки в табличном документе 1С: методы НачатьГруппуСтрок и ЗакончитьГруппуСтрок, уровни группировки, итоги по группам, типичные ошибки и примеры кода.
Группировка строк в табличном документе 1С — это способ объединить несколько строк в сворачиваемый блок с кнопкой «плюс/минус», как в отчётах. Такой приём используется при программном формировании печатных форм и отчётов: пользователь видит сначала только заголовки групп и итоги, а детальные строки раскрывает по необходимости.
Группировка создаётся программно — при выводе табличного документа методами НачатьГруппуСтрок() и ЗакончитьГруппуСтрок(). Важно понимать: это визуальная структура готового документа, а не группировка данных в запросе. Данные нужно отсортировать и сгруппировать заранее (в запросе или при обходе выборки), а методы табличного документа лишь оформляют вывод.
Ниже разобраны оба подхода — ручное формирование групп при выводе и автоматическая группировка через макет с итогами, а также способ быстро добавить группировку в уже готовый документ методом СводнаяГруппировкаСтрок.
Что такое группировка строк и когда она нужна
Группировка строк — это иерархическая структура внутри табличного документа. Сгруппированные строки можно свернуть и развернуть кнопкой в левой части документа, а также управлять видимостью уровней через меню «Таблица — Группировка» или соответствующие кнопки панели. Типичный пример — отчёт «Продажи по контрагентам», где строки документов свернуты внутри групп по контрагентам.
Группировка уместна, когда документ содержит много однотипных строк и пользователю нужна сначала сводная картина. Она не меняет содержимое ячеек и не пересчитывает итоги автоматически — если нужна сумма по группе, её надо вычислить и вывести отдельной строкой (обычно заголовком или подвалом группы).
Ограничение: группировка работает только в табличном документе, сформированном программно. В уже открытом произвольном документе пользователь тоже может сворачивать строки, но только если разработчик заложил эту структуру при выводе.
Базовый способ: НачатьГруппуСтрок и ЗакончитьГруппуСтрок
Основная пара методов — НачатьГруппуСтрок(ИмяГруппы, Открыта) и ЗакончитьГруппуСтрок(). Первый параметр — произвольное имя группы (пригодится для отладки и поиска), второй — булево признак, будет ли группа развёрнута при показе документа. Если параметр опустить, группа по умолчанию открыта.
Последовательность действий простая: выводите строку-заголовок группы (например, контрагент и сумма итога), вызываете НачатьГруппуСтрок(), выводите детальные строки циклом, затем вызываете ЗакончитьГруппуСтрок(). Всё, что выведено между этими вызовами, попадёт внутрь группы.
ТабДок.Вывести(Макет.ПолучитьОбласть("ГруппаКонтрагент"), 1);
ТабДок.НачатьГруппуСтрок("Детали", Ложь);
Пока ВыборкаДетали.Следующий() Цикл
ТабДок.Вывести(Макет.ПолучитьОбласть("Строка"), 2);
КонецЦикла;
ТабДок.ЗакончитьГруппуСтрок();
Обратите внимание на второй параметр метода Вывести() — уровень. Он используется при автоматической группировке и при выводе иерархии; при ручном управлении группами он не обязателен, но его согласованное использование упрощает чтение кода.
- 1Сформируйте запрос с итогами по нужному полю (ИТОГИ ПО ...) или отсортируйте данные по группировочному признаку
- 2Выведите строку-заголовок группы с наименованием и итогом
- 3Вызовите ТабДок.НачатьГруппуСтрок("Имя", Ложь) — группа будет свёрнута при показе
- 4В цикле выведите детальные строки группы
- 5Вызовите ТабДок.ЗакончитьГруппуСтрок() и перейдите к следующей группе
- 6Откройте документ и проверьте сворачивание кнопками уровней
Вложенные группы и уровни
Группы можно вкладывать друг в друга, создавая многоуровневую структуру: например, «Склад → Номенклатурная группа → Документ». Для этого вызывайте НачатьГруппуСтрок() повторно внутри уже открытой группы и закрывайте группы в обратном порядке — как скобки в выражении.
Критично соблюдать парность: каждому НачатьГруппуСтрок() должен соответствовать свой ЗакончитьГруппуСтрок(). Если закрыть группу раньше времени или забыть закрыть, структура «поедет»: детальные строки окажутся не в той группе, а кнопки уровней будут работать непредсказуемо. Ошибки времени выполнения при этом может и не быть — документ просто отобразится неверно.
ВыборкаСклады = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклады.Следующий() Цикл
ТабДок.Вывести(ОбластьСклад);
ТабДок.НачатьГруппуСтрок("Группы", Ложь);
ВыборкаГруппы = ВыборкаСклады.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаГруппы.Следующий() Цикл
ТабДок.Вывести(ОбластьГруппа);
ТабДок.НачатьГруппуСтрок("Документы", Ложь);
// вывод детальных строк
ТабДок.ЗакончитьГруппуСтрок();
КонецЦикла;
ТабДок.ЗакончитьГруппуСтрок();
КонецЦикла;
Автоматическая группировка при выводе областей
Если структура отчёта регулярная, можно не управлять группами вручную, а передать уровень вторым параметром метода Вывести() или Присоединить(). Табличный документ сам построит группы по смене уровней: строки с уровнем 2, следующие после строки уровня 1, попадут внутрь группы. При возврате к уровню 1 предыдущая группа автоматически закрывается.
Именно так работает типовой вывод отчётов: заголовок группы выводится с уровнем 1, детали — с уровнем 2. Этот подход сокращает код и исключает ошибки парности, но требует аккуратного и последовательного назначения уровней всем областям макета.
Для уже сформированного документа есть метод СводнаяГруппировкаСтрок() — он строит группировку по значениям в указанной колонке постфактум. Это удобно, когда документ сформирован «плоско», а сворачиваемая структура нужна без переписывания логики вывода.
Сравнение вариантов
Полный контроль над именами и состоянием групп; больше кода и риск нарушить парность
Компактный код, автоматическое закрытие групп; требует дисциплины в назначении уровней всем областям
Быстрая группировка готового документа по колонке; не подходит для сложной вложенной логики и итогов
Итоги по группам
Сама по себе группировка не считает суммы. Итог по группе нужно получить на уровне данных — удобнее всего через конструкцию ИТОГИ ПО в запросе и обход выборки методом ПоГруппировкам. Тогда на каждой итерации внешнего цикла у вас есть агрегированные значения (суммы, количества), которые выводятся в заголовок группы.
Распространённый приём — выводить итог и в заголовке, и в подвале группы: заголовок виден, когда группа свёрнута, подвал — когда развёрнута. Для подвала просто выведите итоговую область после цикла детальных строк, но до ЗакончитьГруппуСтрок() — тогда подвал сворачивается вместе с деталями, либо после закрытия группы, чтобы он оставался видимым.
Если итог нужен в свёрнутом виде, выводите его в строке заголовка группы — она остаётся видимой при сворачивании. Строки внутри группы при сворачивании скрываются полностью, включая подвал.
Проверка результата и типичные ошибки
Проверить результат можно визуально: откройте сформированный документ и пощёлкайте кнопки уровней группировки (цифры 1, 2, 3 в левой верхней части) и значки «плюс/минус» у групп. Уровень 1 должен показывать только заголовки групп с итогами, максимальный уровень — все строки.
Также убедитесь, что сумма итогов по всем группам сходится с общим итогом документа, и что внутри каждой группы находятся строки только этой группы — «переезжание» строки в соседнюю группу почти всегда означает ошибку в порядке вызова методов или в сортировке данных.
Как проверить результат
Уровень 1 показывает только заголовки групп, уровни раскрывают детали постепенно
Часть строк видна на любом уровне или уровни не переключаются
Внутри каждой группы строки только её значения группировки
Строки одной группы попадают в соседнюю — нарушена сортировка или порядок закрытия групп
Сумма итогов групп равна общему итогу документа
Итоги не сходятся — ошибка в запросе с ИТОГИ ПО или в обходе выборки
Ограничения и когда группировка не подходит
Группировка строк — свойство конкретного экземпляра табличного документа. При сохранении документа в файл формата MXL структура групп сохраняется, но при выгрузке в Excel сворачиваемость может быть утеряна или преобразована в группировку Excel — поведение зависит от способа сохранения и версии платформы.
Если пользователю нужна интерактивная аналитика с перестройкой группировок на лету, табличный документ — не лучший инструмент. В этом случае используйте СКД (систему компоновки данных): она сама строит группировки, итоги и позволяет менять структуру отчёта в пользовательском режиме без изменения кода. Ручная группировка табличного документа оправдана для жёстких печатных форм и отчётов с фиксированной структурой.
Частые вопросы
Можно ли сгруппировать строки в уже открытом табличном документе вручную, без кода?
Нет, в пользовательском режиме создать новую группировку строк в произвольном табличном документе нельзя — структура задаётся программно при формировании. Пользователь может только сворачивать и разворачивать существующие группы.
Чем группировка строк отличается от группировки в запросе?
Группировка в запросе (СГРУППИРОВАТЬ ПО, ИТОГИ ПО) агрегирует данные и считает суммы. Группировка строк табличного документа — только визуальное сворачивание выведенных строк. Обычно они применяются вместе: запрос готовит данные и итоги, документ оформляет их вывод.
Как сделать, чтобы все группы были свёрнуты при открытии документа?
Передайте вторым параметром метода НачатьГруппуСтрок значение Ложь — группа будет создана свёрнутой. Альтернативно после формирования можно программно изменить состояние, перебрав группы, но параметр при создании — самый простой способ.
Сохранится ли группировка при сохранении в Excel?
Зависит от способа сохранения и версии платформы: при сохранении в формат Excel группировка может преобразоваться в группировку листа Excel, а может быть потеряна. Если сворачиваемая структура критична для получателя, проверьте результат на тестовом файле или передавайте документ в формате MXL.
Как вывести итог, видимый и в свёрнутом, и в развёрнутом состоянии?
Выведите итог в строке заголовка группы — она остаётся видимой при сворачивании. Если нужен и подвал в развёрнутом виде, выведите итоговую область ещё раз после детальных строк внутри группы.
Сколько уровней вложенности групп допустимо?
Жёсткого практического лимита для типовых отчётов нет — реальных сценариев с 2–4 уровнями достаточно. Ориентируйтесь на удобство чтения: глубокая вложенность затрудняет навигацию, и в таких случаях лучше рассмотреть отчёт на СКД.
Что важно запомнить
Группировка строк создаётся парой НачатьГруппуСтрок/ЗакончитьГруппуСтрок или уровнями при Вывести(). Данные и итоги готовьте заранее запросом с ИТОГИ ПО — группировка сама ничего не считает. Соблюдайте парность вызовов и проверяйте результат кнопками уровней.