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