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