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

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

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

Способ 1. Использование логического выражения ВЫБОР КОГДА в запросе или вычисляемых полях

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

Проанализируем пример логики в тексте запроса. Чтобы перенести вычисления на сторону СУБД и исключить появление пустых ячеек со значением NULL, обернем условия в агрегатную функцию и обработаем функции проверки значений:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(СУММА(ВЫБОР
        КОГДА Продажи.Характеристика В (&СписокХарактеристик1)
        ТОГДА Продажи.Количество
        ИНАЧЕ 0
    КОНЕЦ), 0) КАК РасходНабор1,
    ЕСТЬNULL(СУММА(ВЫБОР
        КОГДА Продажи.Характеристика В (&СписокХарактеристик2)
        ТОГДА Продажи.Количество
        ИНАЧЕ 0
    КОНЕЦ), 0) КАК РасходНабор2
ИЗ
    РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
    Продажи.Номенклатура

Разберем по шагам настройку параметров для данного подхода:

  1. Перейдем на вкладку Параметры в схеме компоновки данных.
  2. Добавим параметры СписокХарактеристик1 и СписокХарактеристик2, указав для них тип значения СправочникСсылка.ХарактеристикиНоменклатуры и установив флаг доступности списка значений.
  3. Установим нужные списки характеристик в настройках отчета на вкладке Отбор или Параметры. Также заполнить их можно программно в модуле объекта отчета внутри процедуры ПриКомпоновкеРезультата.

Способ 2. Использование структуры СКД типа «Таблица» (кросс-таблица)

Если состав характеристик динамический или их количество постоянно меняется, прописывать каждую конструкцию ВЫБОР КОГДА вручную неудобно. В таком случае разберем построение отчета через структуру «Таблица».

Построим отчет, где в строках выводится номенклатура, а в колонках — категория или группа характеристик:

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

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

Способ 3. Описание динамических свойств на вкладке «Характеристики»

Выясним, как задействовать штатный механизм работы с дополнительными реквизитами и сведениями. Если характеристики хранятся в стандартных планах видов характеристик, задействуем вкладку Характеристики в наборе данных СКД.

Рассмотрим порядок действий:

  1. В схеме компоновки данных откроем вкладку Наборы данных и перейдем на закладку Характеристики.
  2. Укажем объект-владелец (например, Справочник.Номенклатура), источник видов характеристик и источник значений.
  3. Платформа 1С автоматически сделает доступными динамические свойства номенклатуры в конструкторе настроек отчета. Это позволит выводить их в группировках колонок без необходимости прописывать код в запросе.

Таким образом, мы проанализировали основные способы разделения характеристик по столбцам в СКД — от жестко заданных условных выражений в запросе до динамических кросс-таблиц и пользовательских полей.

← На главную