Как вывести реквизиты иерархических групп в отчете СКД рядом с их наименованием

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

При разработке отчетов в Системе компоновки данных (СКД) программисты часто сталкиваются со специфическим поведением механизмов иерархии. Если отчет строится в виде таблицы, где в строках выводятся элементы справочника с иерархией (например, Центры финансовой ответственности или Статьи затрат), а в колонках — другой справочник, возникает потребность отобразить специфические данные, относящиеся только к группам. Поскольку СКД формирует дерево иерархии динамически на финальных этапах компоновки, прямое соединение групп с данными в запросе часто не дает нужного визуального результата: либо данные дублируются для всех дочерних элементов, либо они отображаются в виде отдельных колонок-ресурсов, которые "размножаются" под каждой группировкой колонок.

В этой статье мы подробно разберем, как обойти эти ограничения и вывести информацию из регистров сведений или дополнительные реквизиты групп в одной строке с самой группой, не создавая лишних колонок в кросс-таблице.

Причина возникновения проблемы

Проанализируем ситуацию: когда мы выбираем тип группировки "Иерархия", СКД самостоятельно вычисляет родительские узлы. Если в запросе мы попытаемся соединить таблицу данных с родителем справочника, данные будут получены корректно на уровне строк запроса, но при отрисовке отчета они попадут в область детальных записей. Если же мы назначим эти данные ресурсом, СКД по умолчанию будет выводить их в области итогов. В кросс-таблицах любой ресурс стремится отобразиться под каждой вышестоящей группировкой колонок, что превращает отчет в "простыню" с повторяющимися числами.

Метод 1: Использование «финта» с подменой текста в условном оформлении

Рассмотрим наиболее эффективный метод, предложенный опытными разработчиками. Суть его заключается в том, чтобы использовать существующее, но малозначимое поле группировки в качестве "контейнера" для вывода нужных нам данных.

  1. Подготовка поля в наборе данных: В запросе или в вычисляемых полях подготовим наше целевое значение (например, ПланИзРегистра).
  2. Добавление технического поля в группировку: В настройках СКД выберем нужную группировку строк (ЦФО). Перейдем в "Выбранные поля" этой конкретной группировки (не всего отчета!).
  3. Добавим в список выбранных полей реквизит, который гарантированно есть у группы, но не несет важной визуальной нагрузки, например, ЦФО.Родитель или ЦФО.Код.
  4. Настройка заголовка: Чтобы пользователь видел понятное название колонки, установим для этого технического поля заголовок, соответствующий нашим данным (например, "План по группе").
  5. Настройка условного оформления: Это ключевой этап. В настройках той же группировки перейдем на вкладку "Условное оформление" и добавим новый элемент:
    • Оформляемые поля: Выбираем наше техническое поле (ЦФО.Родитель).
    • Условие: Указываем ЦФО.ЭтоГруппа = Истина.
    • Свойство "Текст": Нажимаем на кнопку выбора и выбираем поле компоновки данных — наш ресурс или вычисляемое поле с данными (ПланИзРегистра).

Выясним, что это дает: СКД выведет колонку рядом с наименованием группы. Для элементов (где ЭтоГруппа = Ложь) поле останется пустым или будет содержать стандартное значение, а для групп система подменит текст на значение нашего ресурса. При этом колонка будет одна, и она не будет дублироваться в каждой колонке кросс-таблицы.

Метод 2: Вычисление данных через функцию ВычислитьВыражение

Разберем ситуацию, когда данные нужно получить динамически, основываясь на иерархических итогах. Посмотрим на пример использования функции ВычислитьВыражение в вычисляемых полях.

Мы можем создать вычисляемое поле ПланВГруппах и назначить ему выражение, которое будет собирать максимум или сумму только для иерархических уровней:

ВычислитьВыражение("Максимум(План)", "ЦФО", "Иерархия")

Затем в ресурсах мы назначаем этому полю выражение без агрегатных функций (просто ПланВГруппах). Чтобы скрыть значения на уровне элементов, проанализируем ситуацию с использованием системных полей. Мы можем добавить условие в само вычисляемое поле:


Выбор 
    Когда ЭтоГруппа Тогда ВычислитьВыражение("Сумма(План)", "ЦФО") 
    Иначе 0 
Конец

Это позволит четко разделить, где должны отображаться цифры, а где — нет.

Метод 3: Организация собственной иерархии через связи наборов данных

Если стандартная иерархия не позволяет гибко обращаться к реквизитам групп, мы можем рассмотреть вариант создания "Собственной иерархии". Для этого в СКД создаются два набора данных:

  1. Набор 1 (Источник): Выбирает основные данные и все элементы справочника.
  2. Набор 2 (Иерархия): Выбирает те же элементы, но предназначен для построения связей.

Свяжем их на вкладке "Связи наборов данных". В качестве условия связи укажем Источник.Ссылка = Иерархия.Родитель. В параметре "Условие связи" укажем корень иерархии. Преимущество этого метода в том, что в наборе данных для иерархии мы можем напрямую прописать ЛЕВОЕ СОЕДИНЕНИЕ с любыми регистрами по ссылке группы. СКД будет считать группу таким же полноценным объектом данных, как и элемент, и позволит выводить любые ее реквизиты без дополнительных ухищрений в условном оформлении.

Работа с позиционированием колонок

Проанализируем жалобу на то, что отключение автопозиции ресурсов "все ломает". Если мы хотим, чтобы наш "План" или любой другой реквизит группы отображался строго в конце таблицы, после всех динамических колонок статей, выполним следующие шаги:

  1. В структуре отчета создадим Группировку по выбранным полям (это группировка без указания поля).
  2. Расположим ее на том же уровне, что и группировку колонок со статьями.
  3. В выбранные поля этой новой группировки перенесем наш ресурс.
  4. В настройках отчета установим "Расположение реквизитов" в значение "Отдельно".

Таким образом, мы получим четкую структуру: сначала иерархия строк, затем динамический блок колонок (статьи), и в самом конце — фиксированная колонка с данными групп.

Важные замечания по использованию системных полей

При реализации этих методов важно помнить о поле ЭтоГруппа. В запросе 1С оно всегда доступно для иерархических справочников. Мы рекомендуем всегда включать его в набор данных. Это позволяет не только настраивать условное оформление, но и управлять видимостью данных через формат. Например, если мы хотим скрыть нули у элементов, мы можем использовать выражение формата:

ЧЗ=0; ЧН=' '

В сочетании с условием ЭтоГруппа = Ложь это даст чистый и профессиональный вид отчета, где заполнены только итоговые строки групп.

Рассмотренные подходы позволяют обойти жесткие рамки динамической иерархии СКД и создавать сложные аналитические отчеты, где данные групп визуально обогащены информацией из внешних регистров или специфических реквизитов.

← На главную