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

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

Как сгруппировать строки в макете 1С

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

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

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

Важно понимать, что группировка строк табличного документа — это не то же самое, что группировка в запросе или в СКД. В запросе и СКД группируются данные до вывода, а в табличном документе группируются уже выведенные строки исключительно для удобства просмотра.

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

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

Типичные сценарии применения:

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

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

Интерактивная группировка в готовом документе

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

После группировки слева появится полоса уровня с кнопкой свёртки. Повторная группировка внутри уже сгруппированного диапазона создаёт вложенный уровень. Кнопки с цифрами уровней в левом верхнем углу поля группировки позволяют свернуть или развернуть все группы до выбранного уровня одним действием.

Чтобы разгруппировать строки, выделите их и нажмите «Разгруппировать». Учтите: интерактивная группировка существует только в текущем сеансе просмотра документа — при повторном формировании макета она не сохранится, если не реализована программно.

Ручная группировка строк
  1. 1
    Сформируйте табличный документ и выделите смежные строки за заголовки слева
  2. 2
    Нажмите кнопку «Сгруппировать» на панели инструментов или в контекстном меню
  3. 3
    Проверьте, что слева появилась полоса уровня с кнопкой свёртки
  4. 4
    Для вложенной группы выделите строки внутри существующей группы и повторите действие
  5. 5
    Для отмены выделите группу и нажмите «Разгруппировать»

Программная группировка методом Сгруппировать

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

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

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

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

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

// Группируем выведенные строки
ТабДок.Сгруппировать(НачалоГруппы, ТабДок.ВысотаТаблицы);

Ключевой приём — запоминать ВысотаТаблицы + 1 до вывода строк, а после вывода передавать в метод текущее значение ВысотаТаблицы. Если группировать по именованным областям, можно использовать метод Область() и свойства области Верх и Низ, но вариант с высотой таблицы проще и надёжнее при выводе в цикле.

Метод Сгруппировать вызывается уже после вывода строк, поэтому порядок действий строгий: сначала вывод, потом группировка. Попытка сгруппировать строки, которых ещё нет в документе, приведёт к ошибке или некорректному диапазону.

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

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

Типовой шаблон для двух уровней (например, группа товаров внутри группы склада):

  • перед циклом по складам запомните начало внешней группы;
  • внутри, перед циклом по товарам склада, запомните начало внутренней группы;
  • после вывода товаров вызовите Сгруппировать для внутреннего диапазона;
  • после завершения склада вызовите Сгруппировать для внешнего диапазона.

Для управления отображением после формирования используется метод Уровень(НомерУровня). Вызов ТабДок.Уровень(1) свернёт документ до первого уровня — пользователь увидит только заголовки групп, а детали сможет раскрыть вручную. Это особенно полезно для объёмных печатных форм, которые по умолчанию должны открываться в компактном виде.

bsl
// Вложенная группировка: склад -> товары
Пока ВыборкаСклады.Следующий() Цикл
    НачалоСклада = ТабДок.ВысотаТаблицы + 1;
    ТабДок.Вывести(ОбластьСклад);

    НачалоТоваров = ТабДок.ВысотаТаблицы + 1;
    Пока ВыборкаТовары.Следующий() Цикл
        ТабДок.Вывести(ОбластьТовар);
    КонецЦикла;
    ТабДок.Сгруппировать(НачалоТоваров, ТабДок.ВысотаТаблицы);

    ТабДок.Сгруппировать(НачалоСклада, ТабДок.ВысотаТаблицы);
КонецЦикла;

// Сворачиваем до первого уровня
ТабДок.Уровень(1);

Группировка при выводе через СКД и построитель отчётов

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

Чтобы итоги групп выводились в отдельных строках и группы можно было сворачивать, проверьте расположение итогов в настройках группировки (обычно «Начало и конец» или «Начало»). Расположение «Начало» даёт классический вид: строка заголовка группы, под ней сворачиваемые детальные записи.

Программно уровень свёртки результата СКД задаётся так же — методом Уровень() у итогового табличного документа после вывода результата компоновки. Это позволяет показать пользователю отчёт сразу в свёрнутом виде.

Способы группировки

Интерактивная (вручную)

Подходит для разового анализа готового документа. Не сохраняется при переформировании.

Программная, метод Сгруппировать

Для печатных форм и макетов, выводимых в цикле. Требует контроля номеров строк.

Группировка в СКД

Для отчётов: группировка задаётся настройками, уровни создаются автоматически.

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

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

Типичные ошибки
01
Вызов Сгруппировать до вывода строк — диапазон указывает на пустую область, группа не создаётся
02
Использование ВысотаТаблицы без +1 для начала группы — в группу попадает лишняя строка шапки предыдущего блока
03
Группировка несмежных диапазонов одним вызовом — структура уровней становится непредсказуемой
04
Ожидание, что группировка сохранится при повторном формировании — интерактивные группы создаются заново только программно
05
Попытка свернуть документ методом Уровень до того, как созданы группы — метод не даёт видимого эффекта
Контрольные точки

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

Полоса группировки слева от строк
Норма

Полоса видна, кнопка свёртки работает

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

Полосы нет — проверьте номера строк в вызове Сгруппировать

Сворачивание группы
Норма

Скрываются все строки диапазона, кроме первой

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

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

Вложенные уровни
Норма

Кнопки уровней сворачивают группы постепенно

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

Все группы сворачиваются разом — нарушена вложенность диапазонов

Ограничения и рекомендации

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

Практические рекомендации: выводите в первую строку группы осмысленный заголовок (именно она останется видимой при свёртке), не делайте больше трёх-четырёх уровней вложенности — глубокая структура неудобна, и всегда сворачивайте документ методом Уровень() уже после полного формирования, а не в процессе вывода областей.

Итог

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

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

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

Можно ли сгруппировать колонки, а не строки?

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

Почему метод Сгруппировать не создаёт группу?

Чаще всего причина в неверных номерах строк: диапазон пуст, указывает на ещё не выведенные строки или состоит из одной строки. Проверьте значения ВысотаТаблицы до и после вывода областей и убедитесь, что группируемый диапазон содержит минимум две строки.

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

После полного формирования табличного документа вызовите метод Уровень() с нужным номером уровня, например ТабДок.Уровень(1). Все группы свернутся до указанного уровня, и пользователь увидит только заголовки групп.

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

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

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

Группировка в запросе агрегирует данные — считает суммы и объединяет записи до вывода. Группировка в табличном документе лишь визуально объединяет уже выведенные строки и никаких вычислений не выполняет. Для итогов по группам используйте запрос или СКД.

Можно ли разгруппировать строки программно?

Да, используется метод Разгруппировать с теми же параметрами диапазона, что и у Сгруппировать. Он удаляет группировку для указанных строк, не затрагивая сами данные документа.