Почему в группировках СКД некорректно считаются остатки и как это исправить?

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

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

Проанализируем ключевые причины возникновения этой проблемы и разберем по шагам правила настройки запроса и схемы компоновки данных для получения корректных итогов.

Причина 1. Использование метода дополнения «Движения» в виртуальной таблице

Одной из главных причин искажения итогов в верхних группировках является некорректное понимание работы метода дополнения Движения в параметрах виртуальной таблицы остатков и оборотов (ОстаткиИОбороты).

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

Для решения этой проблемы разберем следующие действия:

  1. В параметрах виртуальной таблицы измените метод дополнения с Движения на ДвиженияИГраницы либо оставьте значение по умолчанию.
  2. Если необходимо скрыть в отчете контрагентов и договоры, по которым за выбранный период не было движения и нет остатков, используйте отбор на уровне группировок СКД, а не ограничение виртуальной таблицы. Добавьте в отбор условие: НачальныйОстаток <> 0 ИЛИ КонечныйОстаток <> 0 ИЛИ Оборот <> 0.

Причина 2. Установка отборов в секции ГДЕ вместо параметров виртуальной таблицы

Распространенной ошибкой при написании запроса для СКД является перенос отборов по аналитическим разрезам (Организация, Контрагент, Договор) в секцию ГДЕ основного запроса вместо передачи их в параметры виртуальной таблицы.

Рассмотрим разницу в поведении платформы на примере кода запроса.

Неправильный подход:


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

При таком написании СУБД сначала рассчитывает остатки и обороты по абсолютно всем контрагентам и организациям базы данных, и только потом накладывает фильтр из секции ГДЕ. Это не только замедляет работу отчета, но и нарушает корректное формирование итогов платформой при свертке по иерархии.

Правильный подход:


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

Передача условий непосредственно в параметры виртуальной таблицы гарантирует получение точных срезов остатков именно по указанной аналитике.

Причина 3. Некорректная настройка ролей полей на закладке «Наборы данных»

Процессор компоновки данных рассчитывает итоги по остаткам не простым суммированием строк, а по специальному алгоритму, ориентируясь на настройки колонки Роль на закладке «Наборы данных» схемы компоновки.

Проанализируем порядок проверки и настройки ролей полей:

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

Важные особенности СКД при работе с остатками

Выясним еще несколько важных нюансов платформы 1С:

← На главную