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