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

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

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

Давайте разберем, как решить эту задачу правильно, чтобы отчет показывал корректные цифры без использования сомнительных вызовов функций из общих модулей в вычисляемых полях.

Почему происходит суммирование и как этого избежать?

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

Метод 1: Настройка нескольких выражений в ресурсах

Это самый простой и быстрый способ. Мы можем указать для одного и того же поля Долг несколько правил вычисления в зависимости от уровня группировки.

  1. Откройте вкладку Ресурсы в настройках СКД.
  2. Добавьте поле Долг в список ресурсов.
  3. Для первой строки выберите выражение Максимум(Долг) (или Среднее) и в поле Рассчитывать по выберите группировку, соответствующую детальным записям или нижестоящей группировке (например, Заказ). Это позволит брать корректное значение долга из каждой строки, не умножая его.
  4. Добавьте вторую строку для поля Долг. Выберите выражение Сумма(Долг) и в поле Рассчитывать по выберите группировку верхнего уровня (Покупатель) и Общий итог.

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

Метод 2: Использование функции ВычислитьВыражение

Если стандартных агрегатных функций недостаточно, можно воспользоваться мощным инструментом — ВычислитьВыражение. Эта функция позволяет управлять контекстом вычисления. Например, чтобы получить уникальное значение ресурса в рамках группировки, можно использовать конструкцию вида:

ВычислитьВыражение("Максимум(Долг)", "Покупатель")

Это позволит получить значение долга конкретного контрагента, даже если в детальных записях отчет «видит» много строк с одинаковым долгом.

Метод 3: Разделение на наборы данных (Архитектурный подход)

Если данные по долгам и данные по заказам — это принципиально разные сущности, лучше всего разделить их на два набора данных в СКД:

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

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

Почему важно избегать вызова функций общих модулей?

Мы часто видим, как в вычисляемых полях пишут выражения вроде ОбработкаСервер.ПолучитьТекущийДолг(Покупатель). Рассмотрим, почему от этого стоит отказаться:

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

← На главную