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