Как правильно рассчитать итоги по вычисляемому полю в СКД, если данные имеют разную детализацию?

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

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

Понимание причины ошибки

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

Решение с помощью функции ВычислитьВыражениеСГруппировкойМассив

Самый гибкий способ решить эту задачу без существенного изменения структуры запроса — использовать встроенную функцию ВычислитьВыражениеСГруппировкойМассив. Она позволяет собрать значения в массив, ограничив область действия конкретной группировкой, а затем применить к ним агрегатную функцию.

Чтобы реализовать этот подход, выполним следующие шаги:

  1. Перейдем на вкладку Ресурсы в настройках схемы компоновки данных.
  2. Для нашего вычисляемого поля НашДолг пропишем следующее выражение:

Сумма(ВычислитьВыражениеСГруппировкойМассив("НашДолг", "Поставщик"))

Разберем, что здесь происходит:

Альтернативный метод: использование нескольких наборов данных

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

  1. Создаем первый набор данных с детальными остатками по номенклатуре.
  2. Создаем второй набор данных, который делает запрос только по задолженности в разрезе поставщиков (агрегированные данные).
  3. Настраиваем Связи наборов данных по полю Поставщик.

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

Дополнительные рекомендации по проектированию

При работе с ресурсами СКД помните о нескольких важных моментах:

Таким образом, использование функции ВычислитьВыражениеСГруппировкойМассив является отличным инструментом для быстрой корректировки отчетов, где данные имеют разную степень детализации. В более же сложных и высоконагруженных системах лучше придерживаться стратегии разделения данных на несколько наборов с последующей связкой.

← На главную