Как в СКД посчитать количество строк в группировке?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с необходимостью вывести количество строк, входящих в ту или иную группировку — для этого пригодится консоль СКД для тестирования выражений и ресурсов. Например, нужно узнать, сколько заказов сделал конкретный контрагент или сколько позиций номенклатуры содержится в документе. Несмотря на кажущуюся простоту, задача имеет несколько нюансов, связанных с агрегацией данных и порядком расчета ресурсов.

В этой статье мы подробно разберем все способы решения этой задачи, проанализируем типичные ошибки, такие как «Использование вложенных агрегатных функций не допускается», и выясним, какой метод лучше подходит для различных сценариев.

Способ 1. Использование вычисляемого поля и ресурса

Это классический метод, который подходит для большинства стандартных отчетов. Разберем его по шагам:

  1. Перейдем на закладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новое поле, назовем его, например, КоличествоСтрок.
  3. В колонке «Выражение» укажем простое число 1. Важно: здесь мы не пишем никаких функций типа Количество(), просто константу.
  4. Перейдем на закладку Ресурсы.
  5. Перенесем наше поле КоличествоСтрок в список ресурсов.
  6. В поле «Выражение» для этого ресурса выберем функцию Сумма(КоличествоСтрок).
  7. В колонке «Рассчитывать по...» укажем те группировки, в которых нам нужно видеть итог (например, Контрагент).

Таким образом, для каждой детальной записи СКД будет брать «единичку», а на уровне группировки просто просуммирует их, что фактически даст нам количество строк.

Разбор ошибки «Использование вложенных агрегатных функций не допускается»

Проанализируем ситуацию, возникшую у автора темы. Ошибка (Количество((Количество(1)))) возникает тогда, когда разработчик пытается совместить расчет в вычисляемом поле и в ресурсах. Если вы на закладке «Вычисляемые поля» написали Количество(1), а затем в «Ресурсах» выбрали Сумма(КоличествоСтрок), СКД пытается применить агрегат к агрегату. Запомните правило: агрегатные функции (Сумма, Количество, Среднее) должны определяться только на закладке «Ресурсы».

Способ 2. Использование системных полей нумерации

Если ваша задача — просто визуально отобразить количество строк или пронумеровать их, можно воспользоваться встроенными возможностями СКД без создания дополнительных полей. Рассмотрим системные поля:

Чтобы вывести общее количество строк группировки в ее заголовке, мы можем в ресурсах для нужного поля прописать выражение:


Максимум(СистемноеПоле.НомерПоПорядкуВГруппировке)

Поскольку номер последней строки в группе всегда совпадает с их общим количеством, функция Максимум вернет нам искомое число.

Способ 3. Продвинутый расчет через «ВычислитьВыражение»

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


ВычислитьВыражение("Количество(ИмяПоля)", "ИмяГруппировки", "Движения")

Разберем параметры этой функции:

Этот метод считается наиболее гибким, так как он позволяет обращаться к любым срезам данных внутри компоновки.

Способ 4. Подсчет уникальных значений (Различные)

Часто путают количество физических строк в выборке и количество уникальных объектов. Например, если в детальных записях у нас товары, а мы хотим посчитать количество уникальных заказов у контрагента. В этом случае в ресурсах нужно использовать ключевое слово Различные:


Количество(Различные СсылкаНаЗаказ)

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

Способ 5. Условный подсчет строк

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


Сумма(Выбор Когда СуммаОборот > 1000 Тогда 1 Иначе 0 Конец)

В данном случае мы суммируем «единицы» только для тех строк, где сумма оборота превышает 1000. Это позволяет в одной таблице вывести и общее количество строк, и количество «крупных» сделок в разных колонках.

Способ 6. Пользовательские поля (без изменения схемы)

Если вам нужно добавить подсчет строк в уже существующий отчет, а доступа к конфигуратору нет, можно воспользоваться пользовательскими полями в режиме «1С:Предприятие»:

  1. Зайдите в настройки отчета (кнопка «Настройки»).
  2. Перейдите на вкладку Пользовательские поля.
  3. Нажмите «Добавить — Новое поле-выражение».
  4. В поле «Выражение детальных записей» поставьте 1.
  5. В поле «Выражение итоговых записей» укажите Сумма(ИмяЭтогоПоля) или просто выберите тип агрегации «Сумма».

Это решение идентично Способу 1, но реализуется силами пользователя прямо в интерфейсе программы.

Важные нюансы и отличия Количество(1) от Количество(Поле)

Проанализируем разницу в работе этих функций, чтобы избежать логических ошибок в отчетах:

1. Количество(*) или Количество(1) — учитывает абсолютно все записи, которые попали в результат запроса, даже если все поля в строке содержат NULL.

2. Количество(ИмяПоля) — подсчитывает только те записи, в которых указанное поле заполнено (не равно NULL). Если у вас в группировке есть пустые значения в ключевых колонках, результат будет меньше, чем при использовании Количество(1).

Рекомендация: Для простого подсчета строк в 99% случаев безопаснее использовать Количество(1) или суммирование константы 1, чтобы не потерять строки с незаполненными реквизитами.

Мы рассмотрели основные и дополнительные методы подсчета строк в СКД. Выбор конкретного способа зависит от ваших задач: для простых итогов достаточно вычисляемого поля, для сложных иерархических отчетов лучше использовать ВычислитьВыражение, а для оперативной настройки подойдут пользовательские поля.

← На главную