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