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