При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести количество детальных записей или уникальных объектов внутри каждой группы. Начинающие разработчики нередко пытаются решить эту задачу исключительно через вкладку Вычисляемые поля, сталкиваясь с неверными числовыми значениями или ошибками доступности полей. Разберем причины такого поведения платформы и детально изучим надежные способы подсчета строк.
Прежде чем переходить к настройкам, проанализируем внутреннюю механику работы СКД. Вычисляемые поля рассчитываются построчно для каждой отдельной детальной записи выборки еще до того, как система применит группировку строк. Попытка вызвать агрегатную функцию в вычисляемом поле без привязки к контексту группировки либо выдает общий итог по всей таблице, либо приводит к синтаксической ошибке.
Кроме того, разработчики нередко сталкиваются с ситуацией, когда поле запроса (например, СтудГруп или Ссылка) оказывается полностью недоступным в списке вычисляемых полей. Рассмотрим основные причины этой проблемы:
Наиболее правильный и производительный способ подсчета строк в СКД — использование механизма Ресурсы. В отличие от вычисляемых полей, ресурсы изначально предназначены для вычисления агрегатов на уровне группировок и итогов. Разберем по шагам, как настроить расчет:
Студент) либо создать вычисляемое поле-заглушку.Количество()
Если требуется рассчитать число неповторяющихся ссылок внутри группы, используем конструкцию:
Количество(Различные Студент)СтудГруп). Если оставить поле пустым для детальных записей или общих итогов, СКД не будет выводить число строк там, где это не требуется.Если в схеме компоновки данных используется сложная структура группировок и вывод стандартного ресурса перегружает отчет, применим классический прием с единичным полем в запросе. Разберем этот вариант подробнее:
ВЫБРАТЬ
Студенты.Ссылка КАК Студент,
Студенты.Группа КАК СтудГруп,
1 КАК КоличествоСтрок
ИЗ
Справочник.Студенты КАК Студенты
КоличествоСтрок.Сумма(КоличествоСтрок)В ситуациях, когда требуется получить количество строк программным выражением для вывода в пользовательские поля или заголовки группировок, используем специализированные системные функции ВычислитьВыражение и ВычислитьВыражениеСГруппировкойМассив.
Посмотрим на пример синтаксиса для расчета количества записей текущей группировки:
ВычислитьВыражение("Количество()", "СтудГруп")
Если же перед нами стоит задача сложить уникальные количества элементов подчиненных групп на уровне вышестоящего итога, воспользуемся вычислением по массиву:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Количество(Различные Студент)", "СтудГруп"))
Если в конфигурации используется версия платформы 1С:Предприятие 8.3.20 и выше, подсчет можно перенести напрямую в СУБД с помощью аналитических (оконных) функций запроса. Проанализируем пример такого запроса:
ВЫБРАТЬ
Студенты.Ссылка КАК Студент,
Студенты.Группа КАК СтудГруп,
КОЛИЧЕСТВО(*) OVER (ПАРТИЦИЯ ПО Студенты.Группа) КАК КоличествоВГруппе
ИЗ
Справочник.Студенты КАК Студенты
Поле КоличествоВГруппе будет рассчитано на уровне базы данных и станет доступно для вывода в любой детальной строке или группировке без необходимости дополнительной настройки вкладки ресурсов СКД.
Чтобы скрыть вывод итоговых количеств в ненужных строках или подвалах отчета, не обязательно создавать пустые области в пользовательских макетах. Достаточно использовать стандартные возможности компоновки:
Начало, Конец или Нет).Ложь или зададим пустой текст отображения.