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