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