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