При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда данные в кросс-таблице (где склады или периоды выводятся в колонки) отображаются некорректно. Вместо одной аккуратной строки с данными по товару получается «лесенка» или «шахматка»: показатели склада выводятся в одной строке, а общие итоги или резервы — в другой. В этой статье мы подробно разберем, как правильно настроить группировки и ресурсы, чтобы отчет выглядел профессионально.
Проанализируем ситуацию. Типичная причина появления «шахматки» заключается в том, что СКД не понимает, как сопоставить данные, приходящие из разных веток запроса или разных ресурсов. Если у нас есть остатки в разрезе складов и резервы, которые могут быть не привязаны к конкретному складу в той же детализации, компоновщик данных создает отдельные строки для каждой комбинации значений, которые не смог «схлопнуть».
Рассмотрим пример запроса, который часто становится источником проблем:
ВЫБРАТЬ
ОстаткиНаСкладахОстатки.Номенклатура КАК Товар,
ОстаткиНаСкладахОстатки.Склад КАК Склад,
СУММА(ОстаткиНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток,
СУММА(ЕСТЬNULL(БронированиеТоваровОстатки.КоличествоЗабронированногоОстаток, 0)) КАК Резерв
ИЗ
РегистрНакопления.ОстаткиНаСкладах.Остатки(&Период, ) КАК ОстаткиНаСкладахОстатки
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.БронированиеТоваров.Остатки(&Период, ) КАК БронированиеТоваровОстатки
ПО
ОстаткиНаСкладахОстатки.Склад = БронированиеТоваровОстатки.Склад
И ОстаткиНаСкладахОстатки.Номенклатура = БронированиеТоваровОстатки.Номенклатура
СГРУППИРОВАТЬ ПО
ОстаткиНаСкладахОстатки.Номенклатура,
ОстаткиНаСкладахОстатки.Склад
Даже если в запросе используется СГРУППИРОВАТЬ ПО и функция ЕСТЬNULL, в самом отчете данные могут двоиться, если неправильно настроена вкладка «Ресурсы» или структура компоновки.
Выясним причину, по которой поле Резерв может дублировать строки. В СКД на вкладке «Ресурсы» для каждого числового поля определяется алгоритм агрегации. Ошибка часто кроется в колонке «Рассчитывать по...».
Выполним следующие шаги для исправления:
КоличествоОстаток и Резерв — добавлены в список ресурсов с функцией Сумма(...).КоличествоОстаток в колонке «Рассчитывать по» можно оставить пустое значение (рассчитывать по всем группировкам) или указать конкретно: Номенклатура, Склад, ОбщийИтог.Резерв, если оно должно выводиться как общий показатель по товару (независимо от того, в какой колонке-складе мы находимся), крайне важно в колонке «Рассчитывать по» указать только Номенклатура и ОбщийИтог. Исключите Склад из расчета этого ресурса.Это заставит систему «схлопнуть» значения резерва на уровне товара, не пытаясь распределить его по колонкам складов, что и уберет эффект шахматки.
Если задача стоит так: «Вывести склады в колонки, а резерв — отдельной фиксированной колонкой в конце или начале», нам нужно правильно настроить вкладку «Настройки».
Разберем по шагам создание правильной структуры:
Номенклатура.Склад.КоличествоОстаток и Резерв, то Резерв будет повторяться под каждым складом. Чтобы этого избежать, мы можем использовать «Группировку выбранных полей» или вынести Резерв в отдельную колонку вне группировки по складам.Проанализируем ситуацию с расположением ресурсов. В «Других настройках» (на уровне таблицы или всего отчета) найдем параметр «Расположение ресурсов». Установка значения «Вертикально» или «Отдельно» может помочь добиться нужного визуального эффекта.
Иногда ЛЕВОЕ СОЕДИНЕНИЕ в запросе СКД ведет себя непредсказуемо из-за особенностей оптимизации компоновщика. Рассмотрим более надежный метод получения данных для кросс-отчетов — использование объединения таблиц.
ВЫБРАТЬ
Остатки.Номенклатура КАК Товар,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК КоличествоОстаток,
0 КАК Резерв
ИЗ
РегистрНакопления.ОстаткиНаСкладах.Остатки(&Период, ) КАК Остатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Бронь.Номенклатура,
Бронь.Склад,
0,
Бронь.КоличествоЗабронированногоОстаток
ИЗ
РегистрНакопления.БронированиеТоваров.Остатки(&Период, ) КАК Бронь
При таком подходе СКД сама выполнит группировку данных по полям Товар и Склад. Поскольку записи теперь не «умножаются» из-за соединений, вероятность появления дублей строк в отчете сводится к минимуму. Важно: не забудьте в настройках ресурсов указать СУММА(КоличествоОстаток) и СУММА(Резерв).
Когда мы используем таблицу, в шапке часто появляются технические заголовки (например, над названием склада пишется слово «Количество»). Чтобы сделать отчет чище, воспользуемся следующими приемами:
Для создания качественного отчета в СКД с динамическими колонками недостаточно просто написать правильный запрос. Мы должны четко управлять механизмом расчета ресурсов. Запомните: если поле не должно «размазываться» по колонкам группировки, ограничьте его расчет в поле «Рассчитывать по» на закладке ресурсов. Использование ОБЪЕДИНИТЬ ВСЕ вместо сложных соединений также является «золотым стандартом» для разработки сложных аналитических панелей в 1С.