Почему в отчете СКД некорректно отображается итоговый остаток и как это исправить?

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

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

Анализ исходной проблемы

Рассмотрим типичный запрос к виртуальной таблице ОстаткиИОбороты регистра накопления, который привел к ошибке в отчете:


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

На первый взгляд запрос выглядит абсолютно логичным. Однако в настройках СКД автор не указал дополнительные параметры. В результате система восприняла СуммаКонечныйОстаток как обычное числовое поле (ресурс). Если в периоде было 10 движений, каждое из которых имело конечный остаток 2240, СКД просто сложит их все и выведет 22400, хотя реальный остаток на конец дня по-прежнему составляет 2240.

Решение 1: Правильная настройка ролей полей (Фундаментальный подход)

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

Проанализируем шаги по настройке на вкладке "Набор данных":

  1. Настройка роли поля "СуммаНачальныйОстаток": Нажмите на ячейку в колонке "Роль". В открывшемся окне установите тип "Остаток". Выберите "Начальный". В поле "Имя" укажите краткое техническое название группы остатков (например, "Сумма"). Обязательно укажите в поле "Связь по полю" ваш конечный остаток.
  2. Настройка роли поля "СуммаКонечныйОстаток": Аналогично установите тип "Остаток", но выберите значение "Конечный". Имя должно совпадать с именем начального остатка (в нашем примере — "Сумма").
  3. Связь по измерениям: В настройках роли обоих полей остатков необходимо перечислить все измерения регистра (в данном случае ВидПоступления и Проект). Это позволит СКД понимать, в разрезе каких аналитик нужно "схлопывать" остатки, а не просто суммировать их.
  4. Определение периодов: СКД должна знать хронологический порядок записей. Для этого полям Период или Регистратор нужно назначить роль "Период" и указать их порядковый номер. Например, для ПериодСекунда — 1, для Регистратор — 2.

Решение 2: Использование функции ВычислитьВыражение в ресурсах

Если по каким-то причинам стандартная настройка ролей не помогает (например, при сложной иерархии или использовании специфических объединений), мы можем принудительно заставить СКД брать последнее значение для конечного остатка. Рассмотрим, как это сделать на закладке "Ресурсы".

Вместо стандартного Сумма(СуммаКонечныйОстаток) можно использовать функцию ВычислитьВыражение. Пример выражения для ресурса:


ВычислитьВыражение("Минимум(СуммаКонечныйОстаток)", "Регистратор", "Группировка", "Последняя")

Или более простой вариант, который часто применяется в подобных отчетах:

ВычислитьВыражение("Сумма(СуммаКонечныйОстаток)", "Регистратор")

При этом в колонке "Рассчитывать по..." нужно указать конкретные уровни группировок (например, Период, ВидПоступления, Проект), чтобы расчет выполнялся корректно на каждом уровне.

Решение 3: Проблема дублирования и "Границы периода"

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

Проанализируем важный нюанс: если в одной секунде зарегистрировано несколько документов, СКД без роли "Период" у Регистратора не сможет определить, какой документ был последним. Рекомендуется всегда включать Регистратор в выборку и назначать ему роль периода с соответствующим типом.

Рекомендации по оформлению запроса для СКД

Чтобы отчет работал "из коробки" с минимальными правками ролей, придерживайтесь следующих правил при написании текста запроса:

Подведем итог. Ошибка "некорректного итогового остатка" — это не ошибка в данных регистра, а следствие того, что СКД воспринимает остаток как "Оборот". Настроив Роли полей в наборе данных и указав, какие поля являются начальным и конечным остатком, а также определив их связь с измерениями и периодами, вы получите идеально работающий отчет с корректными итогами на любом уровне группировки.

← На главную