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

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

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

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

Выясним причину некорректного расчета остатков

Система компоновки данных рассчитывает движение остатков на основе цепочки математического баланса: НачальныйОстаток + Приход - Расход = КонечныйОстаток. Для правильного расформирования входящего и исходящего сальдо по каждой детальной строке СКД требует строгой хронологической последовательности и явной указанности ролей полей-периодов.

Если в схеме компоновки данных отсутствует дополнительное хронологическое поле или неправильно расставлены роли для периодов, платформа теряет возможность корректно восстанавливать точки изменений и начинает выводить суммарный остаток по группировке верхнего уровня, игнорируя порядок документов.

Способ 1. Добавление поля «ПериодСекунда» и настройка ролей полей

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

  1. В тексте запроса виртуальной таблицы ОстаткиИОбороты обязательно выберем поле ПериодСекунда:

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

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

Способ 2. Контроль сортировки детальных записей

Платформа 1С определяет конечный остаток для группировки по последней хронологической записи. Если в настройках отчета для детальных записей установлена пользовательская сортировка (например, по алфавиту, по сумме или реквизитам документа), натуральный временной порядок нарушается.

Рассмотрим правила настройки сортировки:

  1. Для корректного отображения начальных и конечных остатков сортировка в детальных записях должна полностью совпадать с хронологией дат документов.
  2. Если необходимо сгруппировать данные по контрагентам или договорам, создадим соответствующую иерархическую группировку, а поле Регистратор поместим во вложенную группировку детальных записей.
  3. Для каждой отдельной группировки зададим собственную сортировку на вкладке Настройки -> Сортировка.

Способ 3. Проверка транслируемого запроса через консоль СКД

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

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

Дополнительные рекомендации

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

← На главную