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