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