Как сгруппировать значения в колонках СКД и убрать «шахматку» (лесенку) в отчете

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

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

Анализ проблемы: почему возникает «лесенка»

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

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


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

Даже если в запросе используется СГРУППИРОВАТЬ ПО и функция ЕСТЬNULL, в самом отчете данные могут двоиться, если неправильно настроена вкладка «Ресурсы» или структура компоновки.

Решение 1: Правильная настройка ресурсов

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

Выполним следующие шаги для исправления:

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

Это заставит систему «схлопнуть» значения резерва на уровне товара, не пытаясь распределить его по колонкам складов, что и уберет эффект шахматки.

Решение 2: Оптимизация структуры таблицы СКД

Если задача стоит так: «Вывести склады в колонки, а резерв — отдельной фиксированной колонкой в конце или начале», нам нужно правильно настроить вкладку «Настройки».

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

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

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

Решение 3: Изменение логики запроса (ОБЪЕДИНИТЬ ВСЕ)

Иногда ЛЕВОЕ СОЕДИНЕНИЕ в запросе СКД ведет себя непредсказуемо из-за особенностей оптимизации компоновщика. Рассмотрим более надежный метод получения данных для кросс-отчетов — использование объединения таблиц.


ВЫБРАТЬ
    Остатки.Номенклатура КАК Товар,
    Остатки.Склад КАК Склад,
    Остатки.КоличествоОстаток КАК КоличествоОстаток,
    0 КАК Резерв
ИЗ
    РегистрНакопления.ОстаткиНаСкладах.Остатки(&Период, ) КАК Остатки

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

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

При таком подходе СКД сама выполнит группировку данных по полям Товар и Склад. Поскольку записи теперь не «умножаются» из-за соединений, вероятность появления дублей строк в отчете сводится к минимуму. Важно: не забудьте в настройках ресурсов указать СУММА(КоличествоОстаток) и СУММА(Резерв).

Скрытие лишних заголовков ресурсов

Когда мы используем таблицу, в шапке часто появляются технические заголовки (например, над названием склада пишется слово «Количество»). Чтобы сделать отчет чище, воспользуемся следующими приемами:

Подведение итогов

Для создания качественного отчета в СКД с динамическими колонками недостаточно просто написать правильный запрос. Мы должны четко управлять механизмом расчета ресурсов. Запомните: если поле не должно «размазываться» по колонкам группировки, ограничьте его расчет в поле «Рассчитывать по» на закладке ресурсов. Использование ОБЪЕДИНИТЬ ВСЕ вместо сложных соединений также является «золотым стандартом» для разработки сложных аналитических панелей в 1С.

← На главную