Почему в отчете Ведомость по товарам на складах неправильно рассчитываются итоги при включении периодичности по дням?

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

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

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

Причины искажения итогов при периодичности и дополнении периодов

Выясним, из-за чего система компоновки данных дает сбой при расчете итоговых значений:

  1. Искусственное размножение строк в тексте запроса. Попытка вручную сгенерировать все даты периода через соединение с регистром сведений КалендарныеГрафики и последующее объединение с остатками приводит к созданию физических записей с дублированием остатков. В таком случае СКД воспринимает каждую строку как отдельное движение и суммирует остатки за каждый дополненный день в общий итог.
  2. Флаг «Обязательная связь» в связях наборов данных. Если в схеме компоновки данных используется несколько наборов и для связи установлен признак Обязательная, СКД принудительно выполняет соединение всех наборов данных даже тогда, когда поля подчиненного набора не выводятся в текущем варианте отчета. Это нарушает исходную группировку и приводит к искажению агрегатов.
  3. Некорректная настройка ролей полей периодов. Для полей типа ПериодДень, ПериодСекунда на вкладке «Наборы данных» должны быть явно заданы роли: флаг Период, порядковый номер периода и тип периода. Если роли не указаны, компоновщик не может применить специализированные алгоритмы расчета остатков на начало и конец периода.
  4. Использование поля Регистратор без соблюдения строгой иерархии. При одновременном обращении к полям периодичности и полю Регистратор виртуальная таблица ОстаткиИОбороты возвращает детальные записи на уровне секунды/документа. Если поле Регистратор располагается на одном уровне с датой, а не строго внутри неё, расчет срезов остатков СКД дает ошибку.

Способ 1. Использование штатного механизма дополнения периодов в СКД

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


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

Разберем по шагам настройку схемы компоновки данных:

  1. Перейдем на вкладку Наборы данных. Для поля ПериодДень в колонке Роль установим флаг Период и укажем порядковый номер 1.
  2. Перейдем на вкладку Настройки в структуру отчета.
  3. В свойствах группировки ПериодДень перейдем в параметры группировки и установим:
    1. Тип дополнения — День;
    2. Начальная дата — &НачалоПериода;
    3. Конечная дата — &КонецПериода.

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

Способ 2. Корректировка связей между наборами данных

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

  1. Откроем вкладку Связи наборов данных.
  2. Найдем строки соединения основного набора с дополнительными таблицами.
  3. Снимем флаг Обязательная связь для всех наборов, поля которых не являются строго обязательными для построения структуры отчета.

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

Способ 3. Настройка формул расчета ресурсов

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

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