При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с необходимостью вывести количество строк, входящих в ту или иную группировку — для этого пригодится консоль СКД для тестирования выражений и ресурсов. Например, нужно узнать, сколько заказов сделал конкретный контрагент или сколько позиций номенклатуры содержится в документе. Несмотря на кажущуюся простоту, задача имеет несколько нюансов, связанных с агрегацией данных и порядком расчета ресурсов.
В этой статье мы подробно разберем все способы решения этой задачи, проанализируем типичные ошибки, такие как «Использование вложенных агрегатных функций не допускается», и выясним, какой метод лучше подходит для различных сценариев.
Это классический метод, который подходит для большинства стандартных отчетов. Разберем его по шагам:
КоличествоСтрок.1. Важно: здесь мы не пишем никаких функций типа Количество(), просто константу.КоличествоСтрок в список ресурсов.Сумма(КоличествоСтрок).Таким образом, для каждой детальной записи СКД будет брать «единичку», а на уровне группировки просто просуммирует их, что фактически даст нам количество строк.
Проанализируем ситуацию, возникшую у автора темы. Ошибка (Количество((Количество(1)))) возникает тогда, когда разработчик пытается совместить расчет в вычисляемом поле и в ресурсах. Если вы на закладке «Вычисляемые поля» написали Количество(1), а затем в «Ресурсах» выбрали Сумма(КоличествоСтрок), СКД пытается применить агрегат к агрегату. Запомните правило: агрегатные функции (Сумма, Количество, Среднее) должны определяться только на закладке «Ресурсы».
Если ваша задача — просто визуально отобразить количество строк или пронумеровать их, можно воспользоваться встроенными возможностями СКД без создания дополнительных полей. Рассмотрим системные поля:
СистемноеПоле.НомерПоПорядкуВГруппировке — это поле автоматически инкрементируется для каждой строки внутри текущей группировки.СистемноеПоле.НомерПоПорядку — обеспечивает сквозную нумерацию по всему отчету.Чтобы вывести общее количество строк группировки в ее заголовке, мы можем в ресурсах для нужного поля прописать выражение:
Максимум(СистемноеПоле.НомерПоПорядкуВГруппировке)
Поскольку номер последней строки в группе всегда совпадает с их общим количеством, функция Максимум вернет нам искомое число.
Иногда требуется вывести количество строк подчиненной группировки, находясь в строке родительской группировки. В этом случае обычное суммирование может работать некорректно. Рассмотрим функцию ВычислитьВыражение. В поле «Выражение» ресурса можно написать следующее:
ВычислитьВыражение("Количество(ИмяПоля)", "ИмяГруппировки", "Движения")
Разберем параметры этой функции:
"Количество(ИмяПоля)" — агрегатная функция, которую мы хотим рассчитать."ИмяГруппировки" — область анализа данных."Движения" — ключевое слово, указывающее на необходимость обработки детальных записей.Этот метод считается наиболее гибким, так как он позволяет обращаться к любым срезам данных внутри компоновки.
Часто путают количество физических строк в выборке и количество уникальных объектов. Например, если в детальных записях у нас товары, а мы хотим посчитать количество уникальных заказов у контрагента. В этом случае в ресурсах нужно использовать ключевое слово Различные:
Количество(Различные СсылкаНаЗаказ)
Это выражение проигнорирует дублирующиеся ссылки на документы и выдаст точное количество заказов, независимо от того, сколько строк товаров в каждом из них.
Выясним, как посчитать количество строк, удовлетворяющих определенному условию, не накладывая при этом фильтр на весь отчет. Для этого в выражении ресурса мы можем использовать конструкцию Выбор. Посмотрим на пример:
Сумма(Выбор Когда СуммаОборот > 1000 Тогда 1 Иначе 0 Конец)
В данном случае мы суммируем «единицы» только для тех строк, где сумма оборота превышает 1000. Это позволяет в одной таблице вывести и общее количество строк, и количество «крупных» сделок в разных колонках.
Если вам нужно добавить подсчет строк в уже существующий отчет, а доступа к конфигуратору нет, можно воспользоваться пользовательскими полями в режиме «1С:Предприятие»:
1.Сумма(ИмяЭтогоПоля) или просто выберите тип агрегации «Сумма».Это решение идентично Способу 1, но реализуется силами пользователя прямо в интерфейсе программы.
Количество(1) от Количество(Поле)Проанализируем разницу в работе этих функций, чтобы избежать логических ошибок в отчетах:
1. Количество(*) или Количество(1) — учитывает абсолютно все записи, которые попали в результат запроса, даже если все поля в строке содержат NULL.
2. Количество(ИмяПоля) — подсчитывает только те записи, в которых указанное поле заполнено (не равно NULL). Если у вас в группировке есть пустые значения в ключевых колонках, результат будет меньше, чем при использовании Количество(1).
Рекомендация: Для простого подсчета строк в 99% случаев безопаснее использовать Количество(1) или суммирование константы 1, чтобы не потерять строки с незаполненными реквизитами.
Мы рассмотрели основные и дополнительные методы подсчета строк в СКД. Выбор конкретного способа зависит от ваших задач: для простых итогов достаточно вычисляемого поля, для сложных иерархических отчетов лучше использовать ВычислитьВыражение, а для оперативной настройки подойдут пользовательские поля.