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