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

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

Как группировать данные в 1С 8

Как группировать данные в 1С 8: ГруппировкиПо в запросах, итоги, настройка группировок в СКД и отчётах. Примеры кода, ошибки и проверка результата.

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

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

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

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

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

ВЫБРАТЬ

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

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

КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Регистратор) КАК ЧислоДокументов

ИЗ

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

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

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

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

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

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

Группировка по периодам и вычисляемым выражениям

Группировать можно не только по полям таблицы, но и по выражениям. Самый частый случай — свёртка по периоду: функция НАЧАЛОПЕРИОДА(Период, МЕСЯЦ) приводит все даты месяца к одному значению, и строки объединяются. Аналогично работают ДЕНЬ, КВАРТАЛ, ГОД, НЕДЕЛЯ.

Второй типичный сценарий — группировка по условию через ВЫБОР. Например, разделить контрагентов на крупных и мелких по сумме: сначала во вложенном запросе считается сумма по каждому, затем внешний запрос группирует по результату конструкции ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ.

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

ИТОГИ ПО вместо группировки: когда что выбрать

Конструкция ИТОГИ ПО решает похожую задачу, но иначе: детальные строки сохраняются, а итоговые добавляются к ним как отдельные записи при обходе результата. Это удобно для печатных форм и отчётов вида «номенклатура внутри контрагента», где нужны и детали, и подытоги.

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

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

Маршрут решения

Как выбрать действие

Нужны только суммы или количество по группамИспользуйте СГРУППИРОВАТЬ ПО с агрегатными функциями
Нужны детальные строки вместе с подытогамиПрименяйте ИТОГИ ПО или группировки в СКД
Данные уже собраны в таблицу значений в кодеСверните её методом Свернуть()
Группировку должен менять пользователь без доработокДелайте отчёт на СКД с настраиваемыми группировками

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

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

Внутри каждой группировки есть собственные вкладки: «Выбранные поля», «Отбор», «Сортировка», «Условное оформление». Это позволяет, например, показывать одни ресурсы на уровне группы и другие — на уровне детальных записей. Ресурсы (суммируемые поля) задаются на вкладке «Ресурсы» схемы: там указывается выражение Сумма(СуммаОборот) и группировки, по которым ресурс рассчитывается.

Группировка пользователем в режиме предприятия

Если отчёт построен на СКД, пользователь может менять группировки самостоятельно: кнопка «Настройки» (или «Ещё — Изменить вариант»), вкладка «Структура» или «Группировка». Добавьте нужное поле, перетащите его выше или ниже для смены порядка уровней и сформируйте отчёт заново. Чтобы настройка была доступна, разработчик должен оставить группировки в пользовательских настройках.

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

Свёртка таблицы значений в коде

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

ТаблицаПродаж.Свернуть("Контрагент, Склад", "Сумма, Количество");

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

Группировка в динамических списках

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

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

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

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

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

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

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

Итоговая сумма по отчёту
Норма

Совпадает с суммой без группировки по тем же отборам

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

Сумма выросла — вероятно размножение строк соединением

Количество строк результата
Норма

Равно числу уникальных комбинаций полей группировки

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

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

Пустые группы
Норма

Все группы имеют осмысленные значения

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

Есть группа с пустым ключом — проверьте NULL после соединения

FAQ

Как сгруппировать запрос по месяцам?

Используйте функцию НАЧАЛОПЕРИОДА(ПолеДаты, МЕСЯЦ) одновременно в списке выборки и в СГРУППИРОВАТЬ ПО. Все записи одного месяца свернутся в одну строку, а агрегатные функции посчитают суммы внутри месяца. Добавьте УПОРЯДОЧИТЬ ПО тому же выражению для хронологического вывода.

Почему запрос с группировкой выдаёт ошибку «Поле не входит в группу»?

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

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

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

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

Если отчёт сделан на СКД: откройте «Настройки» или «Ещё — Изменить вариант», добавьте или перетащите поля группировки в структуре и сформируйте отчёт заново. Если вариант отчёта заблокирован разработчиком, пользовательские настройки группировок будут недоступны — это ограничение конкретного отчёта.

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

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

Можно ли сгруппировать таблицу значений без запроса?

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

Итог

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

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