При разработке сложных отчетов в Системе компоновки данных (СКД) часто возникает задача визуального разделения данных на блоки. Типичный пример: нужно вывести две таблицы с абсолютно одинаковой структурой колонок и строк, но в первой таблице должны быть данные, соответствующие условию ЛОЖЬ по определенному полю, а во второй — ИСТИНА. Основная сложность здесь заключается в том, что обычный отбор на уровне группировок часто работает «не так»: строки могут скрываться, но общие итоги по таблице продолжают суммировать все данные набора, либо структура таблицы ломается.
В этой статье мы подробно разберем несколько проверенных способов реализации такой задачи, проанализируем их плюсы и минусы, а также выясним, как обеспечить корректность итоговых значений в каждой из таблиц.
Это самый очевидный, но требующий аккуратности метод. В настройках компоновки данных иерархия элементов имеет решающее значение. Рассмотрим, как правильно применить локальный фильтр.
Таблица (верхний уровень для строк и колонок этой таблицы).ЛОЖЬ.ИСТИНА.Важный нюанс: Чтобы итоги в таких таблицах рассчитывались корректно и не учитывали данные, исключенные фильтром, необходимо убедиться, что ресурсы рассчитываются по группировкам. Если СКД все равно выводит «старые» итоги, проанализируем настройки агрегатных функций на вкладке Ресурсы. Иногда помогает установка параметра Тип макета в значение Вертикально в дополнительных настройках таблицы.
Если отборы на уровне настроек группировок работают нестабильно (особенно в сложных иерархических отчетах), мы можем перенести логику фильтрации в расчет ресурсов. Рассмотрим этот метод подробнее.
Вместо того чтобы фильтровать сами строки, мы заставляем систему обнулять значения для «ненужных» строк. Для этого на вкладке Ресурсы в колонке Выражение мы напишем условие:
Сумма(ВЫБОР КОГДА МоеБулевоПоле = ИСТИНА ТОГДА СуммаОборота ИНАЧЕ 0 КОНЕЦ)
Для второй таблицы нам потребуются другие ресурсы. Однако СКД по умолчанию применяет ресурсы ко всему отчету. Чтобы реализовать разделение, можно создать Вычисляемые поля, например, СуммаДляТаблицы1 и СуммаДляТаблицы2, и уже их использовать как раздельные ресурсы для разных таблиц в настройках.
Этот способ надежен, когда отчет имеет сложную структуру или программную компоновку. Мы модифицируем сам текст запроса, чтобы создать два набора данных «внутри одного».
Проанализируем пример модификации запроса:
ВЫБРАТЬ
ОсновнаяТаблица.Поле1 КАК Поле1_Тип1,
ОсновнаяТаблица.Поле2 КАК Поле2_Тип1,
NULL КАК Поле1_Тип2,
NULL КАК Поле2_Тип2,
ОсновнаяТаблица.Сумма КАК Сумма_Тип1,
0 КАК Сумма_Тип2
ИЗ
ОсновнаяТаблица ГДЕ Флаг = ЛОЖЬ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
NULL,
ОсновнаяТаблица.Поле1,
ОсновнаяТаблица.Поле2,
0,
ОсновнаяТаблица.Сумма
ИЗ
ОсновнаяТаблица ГДЕ Флаг = ИСТИНА
После такого объединения в настройках СКД мы создаем две таблицы. В первой таблице выбираем поля с суффиксом _Тип1, во второй — _Тип2. Поскольку данные в полях для «чужой» таблицы равны NULL или 0, таблицы будут отображать только свои данные, а итоги сойдутся автоматически.
Разберем ситуацию, когда таблицы должны быть абсолютно независимыми, возможно, даже использовать разные источники данных, но выводиться в одном документе. Для этого отлично подходят Вложенные схемы.
Вложенный отчет.Этот метод позволяет полностью изолировать логику одной таблицы от другой, включая макеты оформления и программную обработку событий ПриКомпоновкеРезультата.
Выясним еще один интересный прием. Можно создать вычисляемое поле, которое всегда равно какому-то значению (например, 1). Сделаем группировку по этому полю, а внутри неё создадим две таблицы. В настройках каждой вложенной таблицы установим жесткий отбор.
Почему это помогает? В СКД контекст расчета итогов часто привязан к родительской группировке. Создавая искусственную иерархию, мы иногда заставляем систему более корректно обрабатывать локальные фильтры вложенных элементов.
Выбор метода зависит от сложности вашего отчета:
ВЫБОР.При работе с любым из этих методов всегда проверяйте вкладку Другие настройки для каждой таблицы. Параметры Расположение общих итогов и Тип макета могут существенно влиять на то, как визуально будут разделены ваши данные.