Почему в шапке отчета СКД нет группировки по складу и как это исправить

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

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

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

Анализ исходного запроса

Для начала проанализируем запрос, который обычно используется для получения данных из виртуальной таблицы остатков и оборотов. Рассматриваемый пример строится на базе регистра накопления ТоварыНаСкладах:


ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты

Важное замечание: Использование конструкции СГРУППИРОВАТЬ ПО внутри текста запроса для СКД в большинстве случаев является избыточным. СКД — это мощный процессор компоновки, который берет на себя агрегацию данных. Если мы группируем данные в самом запросе, мы лишаем СКД гибкости при расчете итогов по различным уровням иерархии группировок.

Причина исчезновения складов в шапке отчета

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

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

Правильная настройка структуры и автополей

Чтобы восстановить корректный вывод группировки по складам в шапке, выполним настройку структуры по шагам:

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

При такой настройке СКД автоматически спроецирует общие ресурсы отчета на пересечение строк и колонок таблицы. Склады займут свое законное место в шапке отчета, объединяя под собой соответствующие колонки ресурсов.

Настройка ресурсов отчета

Если после настройки структуры данные все равно выводятся некорректно или двоятся, необходимо проверить вкладку «Ресурсы» в схеме компоновки данных.

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

Решение проблемы дублирования номенклатуры

Иногда программисты сталкиваются с тем, что одно и то же наименование товара выводится в отчете несколько раз в разных строках. Выясним причину этого поведения.

В 1С элементы справочников идентифицируются не по наименованию, а по уникальному идентификатору (ссылке). В реальных базах данных (особенно в тестовых или перенесенных из других систем) часто присутствуют элементы-дубли — позиции с абсолютно одинаковым названием, но разными кодами и внутренними ссылками. Для СКД это разные объекты, поэтому она выводит их отдельными строками.

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

  1. Перейдем на вкладку «Наборы данных».
  2. Найдем поле Номенклатура.
  3. В колонке «Выражение представления» напишем формулу, которая будет выводить код или артикул вместе с наименованием: Номенклатура.Наименование + " (код: " + Номенклатура.Код + ")" Или с использованием артикула: Номенклатура.Наименование + " [арт. " + Номенклатура.Артикул + "]"

После этого в отчете вместо двух одинаковых строк «Кабель» мы увидим понятные «Кабель (код: 00015)» и «Кабель (код: 02341)», что сразу снимет все вопросы о причинах "двоения" строк.

Настройка ролей полей для корректного расчета остатков

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

Выполним следующие настройки ролей:

Оптимизация пустых ячеек (проблема разреженности данных)

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

Проанализируем три метода борьбы с этой проблемой:

  1. Фильтрация нулевых строк: Добавим в настройки отчета на вкладку «Отбор» условие, исключающее вывод записей, по которым за выбранный период не было никаких движений и остатков:
    
    КоличествоНачальныйОстаток Не равно 0 
    ИЛИ КоличествоПриход Не равно 0 
    ИЛИ КоличествоРасход Не равно 0 
    ИЛИ КоличествоКонечныйОстаток Не равно 0
    
  2. Использование параметров виртуальной таблицы: Всегда передавайте параметры НачалоПериода и КонецПериода непосредственно в параметры виртуальной таблицы запроса, а не фильтруйте полученный результат в СКД. Это значительно сократит объем выборки и ускорит формирование отчета.
  3. Изменение архитектуры отчета (линейная структура): Если складов в базе слишком много (более 10-15), кросс-таблица становится нечитаемой. В таком случае рекомендуем отказаться от колонок-складов в пользу вертикальной иерархической структуры группировок в строках:
    • Склад (Группировка 1-го уровня)
      • Номенклатура (Группировка 2-го уровня)
    Это сделает отчет компактным, избавит от горизонтальной прокрутки и полностью решит проблему пустых ячеек.
← На главную