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