Почему в кросс-таблице СКД пропадают общие итоги по ресурсам и как это исправить

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

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

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

Почему компоновщик СКД «теряет» общие итоги?

Для понимания природы этой проблемы проанализируем внутреннее устройство компоновщика макета СКД. Когда мы строим кросс-таблицу, система компоновки рассчитывает итоги строго на пересечении группировок строк и колонок. Все ресурсы по умолчанию привязываются к этой двумерной сетке.

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

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

Способ 1. Использование фиктивной группировки колонок

Этот метод считается самым надежным и гибким. Его суть заключается в том, чтобы «обмануть» СКД: мы возвращаем все ресурсы обратно в структуру колонок таблицы (чтобы система правильно построила иерархию и рассчитала агрегаты), но визуально группируем их так, как нам нужно.

Выполним настройку по шагам:

  1. Перейдем на вкладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новое вычисляемое поле со следующими параметрами:
    • Путь к данным: ДопКолонка
    • Выражение: укажем пустую строку в кавычках: "" или значение NULL: NULL
    • Заголовок: оставим пустым или поставим пробел.
  3. Перейдем на вкладку Настройки и выберем наш вариант отчета с таблицей.
  4. В области Колонки таблицы добавим новую группировку по созданному полю ДопКолонка.
  5. Настроим выбранные поля для этой новой группировки:
    • Выделим добавленную группировку ДопКолонка и перейдем на ее вкладку Выбранные поля.
    • Снимем флаг Автополе, чтобы отключить автоматический вывод ресурсов.
    • Вручную перетащим в выбранные поля только те ресурсы, которые должны выводиться обособленно в начале отчета (например, Всех ОС, ОС по остаточной стоимости).
  6. Рядом с нашей фиктивной группировкой (на том же уровне колонок) разместим динамическую группировку колонок (например, Код налоговой льготы):
    • Аналогично перейдем в ее Выбранные поля.
    • Отключим Автополе.
    • Добавим туда только один целевой ресурс — Льгота.
  7. Вернемся в общие настройки отчета и установим параметр Автопозиция ресурсов в значение Использовать (или После всех полей).

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

Способ 2. Использование свойства «Дополнительная информация»

В современных версиях платформы 1С:Предприятие 8.3 реализован штатный механизм, позволяющий выводить отдельные колонки рядом с ресурсами кросс-таблицы без разрушения итоговых данных.

Рассмотрим, как настроить этот механизм:

  1. В структуре настроек отчета найдем область Колонки нашей таблицы.
  2. Добавим туда группировку (это могут быть детальные записи или группировка по конкретному нединамическому полю), в которой мы хотим отобразить наши обособленные ресурсы.
  3. Выделим эту группировку колонок и перейдем на вкладку Другие настройки (на уровне этой конкретной группировки, а не всего отчета!).
  4. Найдем параметр Вариант использования группировки.
  5. Установим для него значение Дополнительная информация.
  6. Перейдем на вкладку Выбранные поля для этой группировки, отключим автозаполнение и перетащим туда ресурсы, по которым пропадали итоги.

При таком подходе СКД понимает, что данная колонка не должна циклически размножаться при формировании кросс-таблицы. Она выводится как фиксированная «информационная» колонка, но при этом расчет вертикальных общих итогов по ней выполняется в штатном режиме.

Способ 3. Корректировка настроек на вкладке «Ресурсы»

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

Проверим и исправим настройки ресурсов:

  1. Откроем схему компоновки данных и перейдем на вкладку Ресурсы.
  2. Обратим внимание на колонку Рассчитывать по... для каждого из проблемных ресурсов.
  3. Если в этой колонке указаны конкретные группировки (например, только группировки строк или только Месяц), это означает, что на уровне общих итогов расчет производиться не должен.
  4. Чтобы исправить это, добавим для каждого проблемного ресурса еще одну строку в таблице ресурсов:
    • В поле Путь к данным выберем наш ресурс.
    • В поле Выражение укажем стандартную агрегатную функцию, например: Сумма(ВсехОС)
    • Поле Рассчитывать по... оставим абсолютно пустым. В терминах СКД это означает, что данное выражение будет применяться для расчета ресурса по всем группировкам по умолчанию, включая уровень «Общие итоги». Также можно явно выбрать предопределенное значение Общие итоги.

Способ 4. Визуальная маскировка через условное оформление

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

Разберем этот прием по шагам:

  1. Оставим настройки расположения ресурсов по умолчанию (Автопозиция ресурсов = Использовать). При этом наши обособленные ресурсы продублируются во всех колонках (например, под каждым кодом льготы).
  2. Перейдем в настройки отчета на вкладку Условное оформление.
  3. Добавим новое правило оформления:
    • В окне Оформление найдем свойство Текст и установим в него значение «пробел» (один символ пробела в кавычках) или зададим формат для скрытия значений.
    • Вкладка Условие: зададим условие, при котором оформление должно срабатывать. Нам нужно скрыть значения только внутри динамических колонок. Например, если группировка колонок идет по полю КодЛьготы, мы задаем условие: КодЛьготы Заполнено (или Не равно пустой ссылке / значению NULL).
    • Вкладка Оформляемые поля: выберем те ресурсы, которые мы не хотим показывать внутри динамических колонок (например, ресурс Всех ОС).

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

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

← На главную