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

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

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

Выясним причину: почему вычисляемые поля дают неверный результат и не видят поля набора

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

Кроме того, разработчики нередко сталкиваются с ситуацией, когда поле запроса (например, СтудГруп или Ссылка) оказывается полностью недоступным в списке вычисляемых полей. Рассмотрим основные причины этой проблемы:

  1. Использование иерархических наборов данных: если набор данных используется для построения иерархии (в рекурсивной связи набора с самим собой), его поля изолированы и недоступны в контексте обычных вычисляемых полей.
  2. Связи между несколькими наборами данных: вычисляемые поля основного набора рассчитываются до выполнения связей с подчиненными наборами, поэтому поля зависимого источника в формулах вычисляемых полей не видны.
  3. Ограничение доступности: в запросе отключен признак Автозаполнение, либо на вкладке Наборы данных для конкретного поля снят флажок доступности в выражениях компоновки.

Способ 1. Штатный подсчет через механизм ресурсов

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

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

Способ 2. Добавление счетчика в текст запроса

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

  1. В тексте запроса набора данных добавим константу единицы с псевдонимом:
    
    ВЫБРАТЬ
        Студенты.Ссылка КАК Студент,
        Студенты.Группа КАК СтудГруп,
        1 КАК КоличествоСтрок
    ИЗ
        Справочник.Студенты КАК Студенты
    
  2. Перейдем на вкладку Ресурсы и добавим поле КоличествоСтрок.
  3. В поле выражения пропишем формулу суммирования: Сумма(КоличествоСтрок)
  4. В колонке Рассчитывать по... выберем только целевые группировки, исключив детальные записи. В результате система автоматически сложит единицы для каждой строки группы, сформировав точное количество элементов.

Способ 3. Вычисление количества с помощью функций СКД

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

Посмотрим на пример синтаксиса для расчета количества записей текущей группировки:

ВычислитьВыражение("Количество()", "СтудГруп")

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


Сумма(ВычислитьВыражениеСГруппировкойМассив("Количество(Различные Студент)", "СтудГруп"))

Способ 4. Оконные функции на стороне СУБД

Если в конфигурации используется версия платформы 1С:Предприятие 8.3.20 и выше, подсчет можно перенести напрямую в СУБД с помощью аналитических (оконных) функций запроса. Проанализируем пример такого запроса:


ВЫБРАТЬ
    Студенты.Ссылка КАК Студент,
    Студенты.Группа КАК СтудГруп,
    КОЛИЧЕСТВО(*) OVER (ПАРТИЦИЯ ПО Студенты.Группа) КАК КоличествоВГруппе
ИЗ
    Справочник.Студенты КАК Студенты

Поле КоличествоВГруппе будет рассчитано на уровне базы данных и станет доступно для вывода в любой детальной строке или группировке без необходимости дополнительной настройки вкладки ресурсов СКД.

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

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

  1. На вкладке Настройки выделим нужную группировку и в окне ее свойств настроим параметр Расположение итогов (установив значение Начало, Конец или Нет).
  2. Настроим Условное оформление: добавим оформление для ресурса подсчета, установив область применения В детальных записях, а в параметрах оформления укажем свойство Видимость = Ложь или зададим пустой текст отображения.
← На главную