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

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

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

Причина проблемы: разница между группировочными полями и ресурсами

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

Для правильного построения кросс-таблицы необходимо понимать базовый принцип компоновки: в строках и колонках таблицы должны находиться группировочные поля (измерения), а данные на их пересечении — это исключительно ресурсы.

Шаг 1. Определение ресурсов и формул их расчета

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

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

Шаг 2. Настройка структуры отчета на вкладке «Настройки»

Рассмотрим порядок формирования структуры отчета. Вместо стандартного списка группировок добавим элемент «Таблица»:

  1. В раздел «Строки» таблицы добавляем группировку: Номенклатура (при необходимости включаем иерархию).
  2. В раздел «Колонки» таблицы добавляем группировку: Склад. Никаких вложенных группировок внутрь склада добавлять не нужно.
  3. В окне «Выбранные поля» (на уровне всего отчета либо в настройках самой таблицы) выбираем наши ресурсы: КоличествоОстаток и Цена.

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

Шаг 3. Получение данных и предотвращение искажений

Выясним причину возможных неточностей при получении остатков и цен в одном запросе. Если соединять остатки из регистра накопления и цены из регистра сведений через ЛЕВОЕ СОЕДИНЕНИЕ по номенклатуре, существует риск искажения остатков, если для товара зарегистрировано несколько записей цен на одну дату (например, при наличии характеристик).

Чтобы избежать этой проблемы, в схеме компоновки данных рекомендуется либо связать два отдельных набора данных на вкладке «Связи наборов данных», либо аккуратно настроить виртуальные таблицы в едином запросе с использованием среза последних:


ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.Склад КАК Склад,
    ТоварыНаСкладахОстатки.ВНаличииОстаток КАК КоличествоОстаток,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, {ВидЦены.* КАК ВидЦены}) КАК ЦеныНоменклатурыСрезПоследних
        ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура

Обратите внимание на конструкцию ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0): она защищает отчет от пустых значений, если по позиции еще не установлена цена.

Шаг 4. Добавление параметра «Вид цены»

Разберем, как добавить выбор вида цены для пользователя отчета:

  1. В тексте запроса в параметрах виртуальной таблицы СрезПоследних прописываем отбор: ВидЦены = &ВидЦены (если выбор вида цены строго обязателен) или используем синтаксис расширения языка запросов СКД в фигурных скобках {ВидЦены.* КАК ВидЦены} (чтобы сделать параметр опциональным).
  2. Переходим на вкладку «Параметры». СКД автоматически создаст параметр ВидЦены. Указываем для него тип данных (ссылка на соответствующий справочник видов цен).
  3. Чтобы параметр был доступен пользователю на форме отчета, нажимаем кнопку «Свойства элемента пользовательских настроек» (значок шестеренки в нижней панели вкладки настроек параметров), устанавливаем флаг «Включать в пользовательские настройки» и выбираем режим отображения Быстрый доступ или В шапке отчета.

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

← На главную