Как в СКД вывести разные ресурсы в разных группировках колонок таблицы?

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

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

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

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

Почему не получается вывести нересурсное поле в колонки таблицы?

Проанализируем ключевую ошибку, которую часто совершают начинающие разработчики. Пытаясь обойти дублирование ресурсов, они пробуют добавить поле со средними продажами не в ресурсы, а напрямую в группировку колонок в качестве обычного реквизита или вычисляемого поля (без добавления на вкладку «Ресурсы»).

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

Даже если ваше поле рассчитывается по сложной формуле в запросе, для корректного вывода в таблице его обязательно нужно сделать ресурсом. Для этого на вкладке «Ресурсы» укажите выражение, например, Сумма(СреднемесячныеПродажи) или Максимум(СреднемесячныеПродажи).

---

Способ 1. Использование параллельных группировок колонок (Рекомендуемый)

Это наиболее простой, изящный и декларативный способ, который настраивается исключительно в конструкторе СКД без написания кода и изменения запроса. Идея заключается в создании двух параллельных ветвей в группировке колонок.

Рассмотрим по шагам, как реализовать этот вариант:

Шаг 1. Настройка ресурсов схемы

Перейдем на вкладку «Ресурсы» и убедимся, что оба наших показателя объявлены ресурсами:

Шаг 2. Настройка структуры отчета

Перейдем на вкладку «Настройки». В структуре нашего отчета должна быть добавлена Таблица. Настроим ее элементы:

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

Шаг 3. Разделение выводимых ресурсов по колонкам

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

  1. Выделим в структуре группировку колонок ПериодМесяц.
  2. В правой нижней части экрана перейдем на вкладку «Выбранные поля».
  3. Снимем флаг «Использовать родительские выбранные поля» (после этого список полей станет доступен для редактирования).
  4. Удалим оттуда элемент Авто и перетащим вручную только ресурс Продажи.
  5. Теперь выделим в структуре нашу пустую группировку колонок.
  6. Снова перейдем на ее вкладку «Выбранные поля», отключим родительские поля, удалим Авто и перетащим туда только ресурс СреднемесячныеПродажи.

Шаг 4. Отключение автопозиционирования ресурсов (Важнейший нюанс!)

Если выполнить первые три шага и запустить отчет, вы заметите, что настройки проигнорированы: ресурсы все равно выводятся вместе или вообще ушли в конец таблицы. Это происходит из-за механизма автопозиционирования ресурсов СКД.

Чтобы зафиксировать наши ручные настройки, выполним следующее:

  1. Выделим самый корень настроек (элемент «Отчет») или непосредственно саму «Таблицу» в структуре.
  2. Перейдем на вкладку «Другие настройки» в нижней части экрана.
  3. Найдем параметр «Авто позиция ресурсов» и установим для него значение «Не использовать».

После этого СКД подчинится заданным нами настройкам выбранных полей в группировках и выведет каждый ресурс строго в своей колонке.

---

Способ 2. Ограничение расчета ресурсов («Рассчитывать по...»)

Этот способ подходит в ситуации, когда вы не хотите создавать параллельные группировки в структуре настроек, а хотите управлять видимостью ресурсов на уровне схемы компоновки данных.

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

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

Поскольку расчет ресурса СреднемесячныеПродажи для группировки ПериодМесяц теперь запрещен, СКД автоматически не будет выводить и дублировать его внутри колонок с месяцами текущего периода. Он отобразится только в общих итогах по строке.

---

Способ 3. Перенос логики в запрос (Использование поля-маркера)

Бывают сложные случаи, когда структура отчета должна быть максимально гибкой, а пользователи могут перетаскивать группировки строк и колонок в произвольном порядке. В таких сценариях параллельные группировки могут «ломаться» или выглядеть некорректно. Наиболее надежным архитектурным решением будет подготовка структуры данных непосредственно на уровне SQL-запроса.

Рассмотрим пример построения такого запроса с использованием виртуального измерения-маркера:


ВЫБРАТЬ
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.ПериодМесяц КАК ПериодКолонки,
    "ТекущиеПродажи" КАК ТипДанных,
    ПродажиОбороты.СуммаОборот КАК Сумма
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПрошлыеПродажи.Контрагент,
    ПрошлыеПродажи.Номенклатура,
    "Среднее за прошлый год",
    "СредниеПродажи",
    ПрошлыеПродажи.СуммаОборот / &КоличествоМесяцев
ИЗ
    ВТ_ПрошлыеПродажи КАК ПрошлыеПродажи
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Данные.Контрагент,
    ВТ_Данные.Номенклатура,
    ВТ_Данные.ПериодКолонки,
    ВТ_Данные.ТипДанных,
    ВТ_Данные.Сумма КАК РесурсСумма
ИЗ
    ВТ_Данные КАК ВТ_Данные

Проанализируем структуру этого запроса:

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

Мы рассмотрели три мощных инструмента управления выводом ресурсов в СКД. Выбирайте первый способ для простых и быстрых настроек "в лоб", второй — для экономии места на форме настроек, и третий — для создания максимально отказоустойчивых и сложных аналитических отчетов.

← На главную