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