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

Отчеты и Аналитика · 10 мин

Как работает группировка в 1С

Как работает группировка в 1С: СГРУППИРОВАТЬ ПО в запросах, итоги, группировки в СКД и конструкторе отчётов. Примеры кода, ошибки и проверка результата.

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

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

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

Где в 1С применяется группировка

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

Второе место — система компоновки данных. В СКД группировка задаётся визуально: вы перетаскиваете поля в структуру отчёта, а платформа сама формирует итоговый запрос и макет. Пользователь может менять группировки прямо в режиме предприятия через настройки отчёта, не трогая код.

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

Группировка в запросе: СГРУППИРОВАТЬ ПО

В языке запросов 1С группировка задаётся секцией СГРУППИРОВАТЬ ПО после списка таблиц и условий. Правило строгое: в списке выборки могут быть либо поля, перечисленные в СГРУППИРОВАТЬ ПО, либо агрегатные функции. Если вы выбираете поле, которое не входит в группировку и не обёрнуто в агрегат, запрос не пройдёт проверку — конструктор выдаст ошибку ещё до выполнения.

Типичный пример — сумма продаж по контрагентам. Выбираются контрагент и сумма, группировка идёт по контрагенту, а сумма оборачивается в СУММА(). Если добавить в группировку период, получите продажи по контрагентам в разрезе месяцев — каждая комбинация «контрагент + месяц» станет отдельной строкой результата.

ВЫБРАТЬ

Продажи.Контрагент КАК Контрагент,

СУММА(Продажи.СуммаОборот) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Контрагент

УПОРЯДОЧИТЬ ПО

Сумма УБЫВ

Обратите внимание на функцию КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поле) — она считает число уникальных значений, например количество разных номенклатурных позиций в документах клиента. Обычное КОЛИЧЕСТВО(Поле) считает строки, где поле не NULL, что часто даёт не тот результат, который ожидал разработчик.

bsl
ВЫБРАТЬ Продажи.Контрагент, СУММА(Продажи.СуммаОборот) КАК Сумма ИЗ РегистрНакопления.Продажи.Обороты КАК Продажи СГРУППИРОВАТЬ ПО Продажи.Контрагент

ИТОГИ ПО: иерархические группировки в запросе

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

Обход такого результата выполняется методом Выбрать с параметром ОбходРезультатаЗапроса.ПоГруппировкам. На каждом уровне доступны и агрегированные значения итога, и вложенная выборка детальных записей. Это удобно для печатных форм и выгрузок, где нужны и подробности, и подытоги.

Практическое ограничение: запросы с ИТОГИ ПО возвращают больше данных и тяжелее для сервера, чем чистая группировка. Если детальные строки не нужны, используйте СГРУППИРОВАТЬ ПО — не заставляйте платформу передавать лишние записи. Секция ОБЩИЕ в ИТОГИ даёт общий итог по всей выборке без привязки к полю.

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

СГРУППИРОВАТЬ ПО

Сворачивает строки в одну на группу. Подходит, когда детали не нужны — быстрее и легче для сервера.

ИТОГИ ПО

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

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

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

Группировки в СКД и настройках отчёта

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

Ресурсы отчёта (суммы, количества) задаются на закладке «Ресурсы» схемы компоновки: там указывается выражение агрегирования, обычно Сумма(Поле). Если поле не добавлено в ресурсы, в группировке оно выведется как есть, и для детальных строк это нормально, но для итогов значение может быть пустым или неопределённым.

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

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

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

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

Самая частая ошибка — дублирование строк из-за соединения с таблицей, где на одну запись приходится несколько связанных. После ЛЕВОГО СОЕДИНЕНИЯ суммы при группировке завышаются кратно числу связанных строк. Лечится предварительной группировкой соединяемой таблицы во временную таблицу или пересмотром условия связи.

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

Типичные ошибки
01
Соединение с таблицей «один ко многим» перед группировкой — суммы задваиваются или завышаются кратно числу связанных строк.
02
Поле в списке выборки не входит в СГРУППИРОВАТЬ ПО и не обёрнуто в агрегат — запрос не выполняется.
03
КОЛИЧЕСТВО(Поле) вместо КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поле) — считаются строки, а не уникальные значения.
04
Группировка по ссылке вместо реквизита ссылки — вместо итога по виду номенклатуры получается строка на каждую позицию.
05
Отсутствие отбора по периоду — итоги считаются по всей истории и выглядят завышенными.

Производительность и ограничения

Группировка выполняется на сервере базы данных и обычно быстрее программного суммирования в цикле, но не бесплатна. На больших таблицах регистров группировка без отборов может занять заметное время и нагрузить СУБД. Поэтому правило простое: сначала максимально сузьте выборку условиями ГДЕ и параметрами виртуальных таблиц, потом группируйте.

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

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

Частые вопросы по группировке в 1С

Ниже собраны вопросы, которые чаще всего возникают при работе с группировками в запросах и отчётах.

Итог

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

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

Чем СГРУППИРОВАТЬ ПО отличается от ИТОГИ ПО?

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

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

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

Как посчитать количество уникальных значений в группе?

Используйте КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поле). Обычное КОЛИЧЕСТВО(Поле) считает все непустые строки, включая повторы, поэтому для подсчёта уникальных контрагентов, документов или товаров нужно ключевое слово РАЗЛИЧНЫЕ.

Можно ли группировать в отчёте без программирования?

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

Почему в итогах группировки поле пустое?

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

Что быстрее: группировка в запросе или суммирование в цикле?

Группировка в запросе выполняется на сервере СУБД и почти всегда быстрее перебора выборки в цикле с ручным накоплением сумм. Цикл оправдан только когда по ходу обхода нужна сложная логика, которую нельзя выразить в запросе.