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

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

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

Причины некорректного расчета остатков в СКД

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

Рассмотрим основные факторы, приводящие к сбоям при расчете сальдо:

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

Шаг 1. Корректировка текста запроса набора данных

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

Посмотрим на пример правильного оформления запроса:


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

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

Шаг 2. Настройка ролей полей в наборе данных СКД

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

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

  1. Для поля ПериодСекунда:
    • Имя роли: Период
    • Порядковый номер: 1
    • Флаг Дополнительно: сброшен (поле является основным периодом).
  2. Для поля Регистратор:
    • Имя роли: Период
    • Порядковый номер: 2
    • Флаг Дополнительно: установлен (указывает, что поле подчинено основному периоду).
  3. Для поля НомерСтроки:
    • Имя роли: Период
    • Порядковый номер: 3
    • Флаг Дополнительно: установлен.
  4. Для ресурсов остатков (СуммаНачальныйОстаток и СуммаКонечныйОстаток):
    • Указываем соответствующий тип остатка (Начальный / Конечный).
    • Задаем одинаковое Имя группы для парных полей остатка.

Шаг 3. Настройка иерархии группировок в структуре отчета

Выясним, как правильно выстроить структуру отчета на вкладке Настройки. Для того чтобы показатели начального и конечного остатков корректно пересчитывались по строкам документов, группировки отчета должны строго повторять иерархию периодов.

Рекомендуемая структура группировок:

  1. Группировка по измерению (например, Заказ).
  2. Вложенная группировка по периоду (например, ПериодСекунда).
  3. Вложенная детальная группировка по полю Регистратор (или Детальные записи).

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

← На главную