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

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

Как сгруппировать комментарий в 1С: запрос, консоль и отчёт

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

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

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

Что значит «сгруппировать комментарий» и когда это нужно

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

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

Важно понимать: группировка работает по точному совпадению строки. Комментарии «Оплата поставщику» и «Оплата поставщику » с пробелом в конце — это две разные группы. Если нужна группировка по «похожим» значениям, сначала нормализуйте строку функцией СОКРЛ или выделите подстроку.

Группировка комментария в запросе через СГРУППИРОВАТЬ ПО

Базовый запрос, который считает, сколько реализаций имеет каждый комментарий, выглядит так:

ВЫБРАТЬ

РеализацияТоваровУслуг.Комментарий КАК Комментарий,

КОЛИЧЕСТВО(РеализацияТоваровУслуг.Ссылка) КАК КоличествоДокументов

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Проведен

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

РеализацияТоваровУслуг.Комментарий

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

КоличествоДокументов УБЫВ

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

Если нужно оставить в результате только комментарии, встречающиеся более одного раза (поиск дублей), добавьте секцию ИМЕЮЩИЕ:

ИМЕЮЩИЕ

КОЛИЧЕСТВО(РеализацияТоваровУслуг.Ссылка) > 1

Секция ИМЕЮЩИЕ фильтрует уже сгруппированные строки, в отличие от ГДЕ, которая отбирает записи до группировки. Путать их — частая ошибка: условие по агрегатной функции в ГДЕ вызовет ошибку.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Комментарий, КОЛИЧЕСТВО(Ссылка) КАК КоличествоДокументов
|ИЗ Документ.РеализацияТоваровУслуг
|ГДЕ Проведен
|СГРУППИРОВАТЬ ПО Комментарий";
Результат = Запрос.Выполнить().Выгрузить();

Работа с пустыми и похожими комментариями

Пустой комментарий — это не NULL, а пустая строка. Все документы без комментария попадут в одну группу с пустым значением, и часто она оказывается самой большой. Чтобы исключить её, добавьте условие до группировки: ГДЕ РеализацияТоваровУслуг.Комментарий <> "".

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

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

Типичные ошибки
01
Условие по агрегатной функции помещено в ГДЕ вместо ИМЕЮЩИЕ — запрос падает с ошибкой
02
Поле добавлено в выборку, но не в СГРУППИРОВАТЬ ПО и не в агрегат — ошибка компоновки запроса
03
Ожидание, что пустые комментарии будут отдельными группами — все пустые строки сворачиваются в одну
04
Группировка по СОКРЛ(Комментарий) без фильтра по периоду — тяжёлый запрос на большой базе

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

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

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

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

Порядок действий в консоли запросов
  1. 1
    Откройте консоль запросов и выберите таблицу документа через конструктор
  2. 2
    Добавьте в выборку поле Комментарий и агрегат КОЛИЧЕСТВО(Ссылка)
  3. 3
    На закладке «Группировка» конструктора перенесите Комментарий в группируемые поля
  4. 4
    Добавьте условие ГДЕ Проведен и, при необходимости, отбор непустых комментариев
  5. 5
    Выполните запрос и проверьте, что сумма количеств по группам равна числу документов в выборке без группировки

Проверка результата и ограничения

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

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

На больших таблицах группировка по текстовому полю не использует индексы эффективно. Если запрос выполняется десятки секунд, сузьте выборку по дате и организации до группировки — это сократит объём обрабатываемых строк на порядки.

Контрольные точки

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

Сумма агрегатов по группам
Норма

Равна итогу запроса без группировки

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

Меньше итога — лишнее условие ГДЕ; больше — размножение строк из-за соединения

Группа с пустым комментарием
Норма

Одна строка с ожидаемым количеством

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

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

Время выполнения
Норма

Секунды на отфильтрованном периоде

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

Десятки секунд и более — нет фильтра по периоду

FAQ

Можно ли сгруппировать по части комментария, а не по всей строке?

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

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

В выборку добавлено поле, которое не входит в СГРУППИРОВАТЬ ПО и не обёрнуто в агрегатную функцию. Либо добавьте его в группировку, либо примените к нему СУММА, КОЛИЧЕСТВО, МАКСИМУМ или другую агрегатную функцию.

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

Добавьте условие ГДЕ Комментарий <> "" до секции группировки. Пустой комментарий в 1С — пустая строка, а не NULL, поэтому проверка на NULL здесь не нужна.

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

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

Почему одинаковые по виду комментарии попали в разные группы?

Группировка идёт по точному совпадению строк: различаются пробелы в конце, регистр букв или невидимые символы. Примените СОКРЛ к полю или очистите данные, чтобы значения совпали.

Итог

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

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