При разработке отчетов в Системе компоновки данных (СКД) программисты часто сталкиваются с задачей, когда в рамках одной таблицы нужно вывести разнородную информацию. Типичный пример: отчет по продажам, где в строках выводятся клиенты и номенклатура, а в колонках — продажи по месяцам за выбранный период. При этом заказчик просит добавить в этот же отчет отдельную финальную колонку, например, «Среднемесячные продажи за прошлый год».
Если просто добавить оба показателя в ресурсы и вывести их в таблицу, СКД по умолчанию начнет дублировать их: внутри каждого месяца будет выводиться и сумма продаж, и средний показатель за прошлый год. Это перегружает отчет и делает его нечитаемым. В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим три проверенных способа настройки СКД, которые позволят вывести разные ресурсы в разных группировках колонок.
Выясним причины, почему у многих разработчиков (включая автора темы на форуме) не получается настроить такой отчет с первой попытки, а затем пошагово разберем каждое решение.
Проанализируем ключевую ошибку, которую часто совершают начинающие разработчики. Пытаясь обойти дублирование ресурсов, они пробуют добавить поле со средними продажами не в ресурсы, а напрямую в группировку колонок в качестве обычного реквизита или вычисляемого поля (без добавления на вкладку «Ресурсы»).
В СКД заложено жесткое правило: на пересечении строк и колонок таблицы могут выводиться только ресурсы. Если поле не добавлено на вкладку «Ресурсы» схемы компоновки данных, система просто не знает, по какому математическому правилу агрегировать (суммировать, усреднять) эти данные для группировок строк (контрагентов и номенклатуры). В результате на пересечении строк и колонок вы получите абсолютно пустые ячейки.
Даже если ваше поле рассчитывается по сложной формуле в запросе, для корректного вывода в таблице его обязательно нужно сделать ресурсом. Для этого на вкладке «Ресурсы» укажите выражение, например, Сумма(СреднемесячныеПродажи) или Максимум(СреднемесячныеПродажи).
---
Это наиболее простой, изящный и декларативный способ, который настраивается исключительно в конструкторе СКД без написания кода и изменения запроса. Идея заключается в создании двух параллельных ветвей в группировке колонок.
Рассмотрим по шагам, как реализовать этот вариант:
Шаг 1. Настройка ресурсов схемы
Перейдем на вкладку «Ресурсы» и убедимся, что оба наших показателя объявлены ресурсами:
Продажи — выражение Сумма(Продажи).СреднемесячныеПродажи — выражение Сумма(СреднемесячныеПродажи) (или Среднее(СреднемесячныеПродажи), в зависимости от логики расчета в вашем запросе).Шаг 2. Настройка структуры отчета
Перейдем на вкладку «Настройки». В структуре нашего отчета должна быть добавлена Таблица. Настроим ее элементы:
Контрагент, а внутрь нее — Номенклатура.ПериодМесяц (или просто Месяц).Шаг 3. Разделение выводимых ресурсов по колонкам
Если сейчас запустить отчет, СКД выведет оба ресурса в обеих колонках: и под каждым месяцем, и в нашей пустой группировке. Чтобы жестко разделить их, нам нужно переопределить выбранные поля для каждой группировки колонок:
ПериодМесяц.Авто и перетащим вручную только ресурс Продажи.Авто и перетащим туда только ресурс СреднемесячныеПродажи.Шаг 4. Отключение автопозиционирования ресурсов (Важнейший нюанс!)
Если выполнить первые три шага и запустить отчет, вы заметите, что настройки проигнорированы: ресурсы все равно выводятся вместе или вообще ушли в конец таблицы. Это происходит из-за механизма автопозиционирования ресурсов СКД.
Чтобы зафиксировать наши ручные настройки, выполним следующее:
После этого СКД подчинится заданным нами настройкам выбранных полей в группировках и выведет каждый ресурс строго в своей колонке.
---
Этот способ подходит в ситуации, когда вы не хотите создавать параллельные группировки в структуре настроек, а хотите управлять видимостью ресурсов на уровне схемы компоновки данных.
Разберем, как работает этот механизм:
СреднемесячныеПродажи.Контрагент, Номенклатура и Общий итог).ПериодМесяц!Поскольку расчет ресурса СреднемесячныеПродажи для группировки ПериодМесяц теперь запрещен, СКД автоматически не будет выводить и дублировать его внутри колонок с месяцами текущего периода. Он отобразится только в общих итогах по строке.
---
Бывают сложные случаи, когда структура отчета должна быть максимально гибкой, а пользователи могут перетаскивать группировки строк и колонок в произвольном порядке. В таких сценариях параллельные группировки могут «ломаться» или выглядеть некорректно. Наиболее надежным архитектурным решением будет подготовка структуры данных непосредственно на уровне SQL-запроса.
Рассмотрим пример построения такого запроса с использованием виртуального измерения-маркера:
ВЫБРАТЬ
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.ПериодМесяц КАК ПериодКолонки,
"ТекущиеПродажи" КАК ТипДанных,
ПродажиОбороты.СуммаОборот КАК Сумма
ПОМЕСТИТЬ ВТ_Данные
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПрошлыеПродажи.Контрагент,
ПрошлыеПродажи.Номенклатура,
"Среднее за прошлый год",
"СредниеПродажи",
ПрошлыеПродажи.СуммаОборот / &КоличествоМесяцев
ИЗ
ВТ_ПрошлыеПродажи КАК ПрошлыеПродажи
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Данные.Контрагент,
ВТ_Данные.Номенклатура,
ВТ_Данные.ПериодКолонки,
ВТ_Данные.ТипДанных,
ВТ_Данные.Сумма КАК РесурсСумма
ИЗ
ВТ_Данные КАК ВТ_Данные
Проанализируем структуру этого запроса:
ПериодКолонки. Для текущих продаж оно содержит реальную дату (начало месяца), а для средних продаж — константную строку "Среднее за прошлый год".ПериодКолонки.В итоге СКД сама построит динамические колонки: сначала выведутся все месяцы текущего периода (так как это даты, они отсортируются по порядку), а в самом конце появится колонка со строковым значением "Среднее за прошлый год". При этом у вас будет всего один ресурс — РесурсСумма, и структура отчета гарантированно не сломается при любых пользовательских перетаскиваниях полей.
Мы рассмотрели три мощных инструмента управления выводом ресурсов в СКД. Выбирайте первый способ для простых и быстрых настроек "в лоб", второй — для экономии места на форме настроек, и третий — для создания максимально отказоустойчивых и сложных аналитических отчетов.