Объединение повторяющихся значений
Во многих отчетах возникает необходимость обработать повторяющиеся значения, например, объединить несколько экземпляров компонента Текст (Text) в один, если эти экземпляры содержат повторяющиеся значения. Для этого необходимо воспользоваться свойством текстового компонента Обработка дубликатов (Processing Duplicates).
Основные режимы работы свойства
В таблице ниже представлены основные режимы для обработки дубликатов.
Наименование |
Описание |
Нет (None) |
Не выполнять обработку дубликатов. Все элементы выводятся в отчете без изменений, даже если содержат одинаковые данные. |
Соединить (Merge) |
Объединяет все соседние элементы с одинаковым содержимым в один общий блок. |
Спрятать (Hide) |
Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с повторяющимся содержимым. |
Удалить текст (Remove Text) |
Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с повторяющимся содержимым. |
Ниже представлен пример обработки повторяющихся текстовых значений:
None |
Merge |
Hide |
Remove text |
Item |
Item |
Item |
Item |
Item |
|
|
|
Item |
|
|
В большинстве случаев достаточно использования только этих основных режимов. Все дополнительные (расширенные) режимы обычно нужны в случае более сложной структуры отчета или дополнительных требований к обработке дубликатов.
Дополнительные (расширенные) режимы работы свойства
Расширенные режимы работы имеют в названии модификаторы «Global» и/или «BasedOnXXX». Рассмотрим эти режимы по порядку.
Режимы «Global»
По умолчанию повторяющиеся значения обрабатываются отдельно у каждого компонента, проверяются только его экземпляры (по имени). Если один под другим окажутся два текстбокса с одинаковыми текстовыми значениями, но при этом они будут экземплярами разных компонентов, то эти экземпляры объединяться не будут.
Однако в некоторых случаях, при сложной структуре отчета, бывает нужно обойти это ограничение. В этом случае нужно использовать режимы, в названии которых есть слово Global: Соединить глобально (Global Merge), Спрятать глобально (Global Hide), Удалить текст глобально (Global Remove Text). Работают эти режимы точно так же, как и описанные выше режимы, но при этом не учитываются имена компонентов.
Режимы «Based On Tag»
Довольно часто встречаются ситуации, когда повторяющиеся значения надо объединять не все подряд, а по какому-то критерию. Например, в таблице ниже приведены продажи предметов за несколько дней, и надо объединить одинаковые предметы только в пределах одного дня. Стандартные режимы объединяют все подряд только по содержимому текстбокса, не учитывая больше ничего. Поэтому в этом случае надо применять режимы, в названии которых есть слово BasedOnTag. В этих режимах при обработке учитывается не содержимое текстбокса, а только значение его поля Tag. А в поле Tag компонента можно задать сложное выражение, которое может учитывать многие критерии.
Date |
Items |
Expected |
Merge Based on Tag |
Merge |
1.05.2026 |
Item 1 |
Item 1 |
Item 1 |
Item 1 |
Item 2 |
Item 2 |
Item 2 |
Item 2 |
|
Item 2 |
||||
2.05.2026 |
Item 2 |
Item 2 |
Item 2 |
|
Item 1 |
Item 1 |
Item 1 |
Item 1 |
|
Item 1 |
||||
3.05.2026 |
Item 1 |
Item 1 |
Item 1 |
|
Item 1 |
Например, пусть в таблице выше во второй колонке выводится название предмета с помощью выражения {dataSource.ItemName}, а.в первой колонке выводится дата с помощью выражения {dataSource.Date}, и эта дата является критерием объединения значений. Тогда в поле Tag текстового компонента надо написать следующее выражение: {dataSource.ItemName}{dataSource.Date}, т.е. к выражению, которое должно выводиться в компоненте, добавляются выражения с критериями из предыдущих колонок. И в результате объединение работает правильно, только в пределах заданных критериев.
Режимы «Based On Value And Tag».
Теперь поговорим про самую трудную часть – режимы, в названии которых есть модификаторы BasedOnValueAndTag. Сначала необходимо пояснить, что все остальные режимы работают только в пост-процессинге отчета, т.е. сначала отчет строится целиком, и только потом движок пробегает по страницам отчета, ищет повторяющиеся значения и обрабатывает их. Поэтому после обработки положение компонентов и их размеры никак не изменяются.
Например, на картинке ниже в третьей колонке выводится описание категорий. Для некоторых категорий оно большое и занимает три строки текста. После простого объединения ячеек размеры ячеек никак не изменяются, каждая строка текста занимает столько же места, как и раньше, и общая высота объединенной ячейки будет большая.

Поэтому добавлены режимы, которые обрабатывают текстовые компоненты в два этапа. Первый этап – дополнительный, еще при расчете значения текстового компонента (в событии OnGetValue). На этом этапе при нахождении дубликата сразу очищается содержимое текстового компонента, что делает его высоту минимальной. И далее это сразу влияет на размеры текстового компонента и соответственно высоту строки. Второй этап, как и в других режимах, обрабатывает компоненты уже после построения всего отчета. На обоих этапах используется значение текстового компонента и значение его свойства Tag.
Информация |
Первый компонент из повторяющихся всегда имеет содержимое и его высота остается полной, уменьшается только высота повторяющихся компонентов. Это особенность движка, которую мы не можем изменить. Если требуется, чтобы высота первой строки тоже могла уменьшаться – необходимо применять другие методы, например изменить структуру отчета и использовать master-detail связь.
|
В таблице ниже представлен полный список режимов при обработке дубликатов.
Наименование |
Описание |
Нет (None) |
Не выполнять обработку дубликатов. Все элементы выводятся в отчете без изменений, даже если содержат одинаковые данные. |
Соединить (Merge) |
Объединяет все соседние элементы с одинаковым содержимым в один общий блок. |
Спрятать (Hide) |
Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с повторяющимся содержимым. |
Удалить текст (Remove Text) |
Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с повторяющимся содержимым. |
Соединить в зависимости от свойства Tag (Merge based on Tag) |
Объединяет все соседние элементы с одинаковым значением свойства Тег (Tag). |
Спрятать в зависимости от свойства Tag (Hide based on Tag) |
Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с одинаковым значением свойства Тег (Tag). |
Удалить в зависимости от свойства Tag (Remove Text based on Tag) |
Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с одинаковым значением свойства Тег (Tag). |
Соединить глобально (Global Merge) |
Объединяет дубликаты даже для разных компонентов. |
Спрятать глобально (Global Hide) |
Скрывает повторяющиеся элементы даже для разных компонентов. |
Удалить текст глобально (Global Remove Text) |
Удаляет текст у повторяющихся элементов даже для разных компонентов. |
Удалить текст в зависимости от значения (Remove based on Value Text) |
Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с повторяющимся содержимым. |
Соединить в зависимости от Значения и свойства Tag (Merge based on Value and Tag) |
Объединяет все соседние элементы с одинаковым содержимым и одинаковым значением свойства Тег (Tag). |
Спрятать в зависимости от Значения и свойства Tag (Hide based on Value and Tag) |
Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с одинаковым содержимым и значением свойства Тег (Tag). |
Удалить глобально текст в зависимости от значения (Global Remove based on Value Text) |
Очищает текст у повторяющихся элементов по значению тега даже для разных компонентов. |
Соединить глобально в зависимости от Значения и свойства Tag (Global Merge based on Value and Tag) |
Объединяет все соседние элементы с одинаковым значением свойства Тег (Tag) даже для разных компонентов. |
Спрятать глобально в зависимости от Значения и свойства Tag (Global Hide based on Value and Tag) |
Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с одинаковым значением свойства Тег (Tag) даже для разных компонентов. |