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

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

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

Причины некорректного расчета остатков в разрезе регистратора

Виртуальная таблица регистра накопления не хранит остатки в разрезе регистраторов — документы формируют исключительно обороты. Расчет остатка на момент проведения документа выполняется виртуальной таблицей «на лету» на основании хронологии движений. Для корректной работы СКД требует строгого соблюдения правил типизации полей и иерархии периодов.

Проанализируем основные факторы, приводящие к ошибкам:

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

Основное решение: правильная настройка ролей полей и иерархии периодов

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

Шаг 1. Формирование запроса к виртуальной таблице.

Обязательно включим в список выборки поля ПериодСекунда, Регистратор и НомерСтроки, а также установим периодичность Авто:


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

Шаг 2. Заполнение ролей полей на вкладке «Наборы данных».

Перейдем на вкладку Наборы данных и вручную настроим колонку Роль для ключевых полей:

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

Альтернативное решение: вычисление нарастающего итога формулами СКД

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

Для поля ресурса СуммаКонечныйОстаток зададим выражение расчета нарастающим итогом:


ВычислитьВыражение("Сумма(СуммаНачальныйОстаток)", , "ОбщийИтог") + 
ВычислитьВыражение("Сумма(СуммаПриход) - Сумма(СуммаРасход)", , , "Первая", "Текущая")

Такой подход гарантирует строгий математический расчет остатка от строки к строке без опоры на системный механизм срезов остатков виртуальной таблицы.

Разделение источников данных через отдельные наборы

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

Посмотрим на правильную структуру схемы:

  1. Набор данных 1 (Запрос): обращается строго к виртуальной таблице ОстаткиИОбороты регистра накопления.
  2. Набор данных 2 (Запрос): выбирает дополнительную аналитику из справочников или документов.
  3. Вкладка «Связи наборов данных»: связывание выполняется средствами СКД по ключевым полям (например, по сотруднику или регистратору).

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

← На главную