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

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

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

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

Причина возникновения ошибки «задвоения» данных

Проблема кроется в способе соединения таблиц в SQL-запросе. Когда мы соединяем таблицу заказов с таблицей счетов через LEFT JOIN, мы получаем декартово произведение записей. Если к одному счету на сумму 100 рублей привязано 3 заказа, в выборку попадет три строки, где в каждой колонке «Сумма счета» будет стоять 100. При автоматическом суммировании СКД сложится 100 + 100 + 100, и мы получим 300 вместо фактических 100. Чтобы этого избежать, мы должны изменить подход к получению или выводу данных.

Решение №1: Использование структуры группировок

Самый простой и эффективный способ — отказаться от вывода детальных записей в пользу иерархических группировок. Разберем по шагам:

  1. В настройках СКД перейдем во вкладку Настройки.
  2. В структуре отчета добавим новую группировку: «Счет».
  3. Внутри группировки «Счет» добавим вложенную группировку: «Заказ».
  4. Перенесем поле «Сумма счета» в группировку верхнего уровня («Счет»).

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

Решение №2: Разделение наборов данных в СКД

Если нам необходимо видеть заказы в одном списке, мы можем использовать механизм связи наборов данных. Вместо одного общего запроса создадим два:

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

Решение №3: Применение функций агрегации

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

Для корректного отображения суммы мы можем использовать следующее выражение в поле ресурса:

ВычислитьВыражение("СуммаСчета", , , "Первая")

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

Рекомендации по анализу данных

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

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

← На главную