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