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