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

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

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

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

Суть проблемы

Представим структуру данных, которую мы получаем в запросе:

Если мы просто укажем в ресурсах Сумма(СуммаДокумента), система сложит 200 + 200 и покажет итог 400, хотя реальная сумма заказа — 200. Давайте разберем способы, как заставить СКД считать правильно.

Способ 1: Использование языка выражений СКД (Рекомендуемый)

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

Рассмотрим настройку на вкладке "Ресурсы":

  1. Найдем поле СуммаДокумента.
  2. В колонке "Рассчитывать по..." выберем группировку ОбщийИтог (или иерархию, если нужно).
  3. В колонке "Выражение" пропишем следующую формулу:

Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(СуммаДокумента)", "ЗаказКлиента"))

Как это работает:

  1. Функция проходит по группировке ЗаказКлиента.
  2. Для каждого заказа она вычисляет Максимум(СуммаДокумента). Поскольку внутри одного заказа сумма одинакова во всех строках, максимум вернет верное число (200).
  3. Все полученные уникальные суммы собираются в массив.
  4. Внешняя функция Сумма() складывает значения этого массива.

Для самих группировок (строк заказа) в ресурсах можно оставить выражение Максимум(СуммаДокумента) и рассчитывать его по группировке ЗаказКлиента.

Способ 2: Разделение наборов данных

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

Порядок действий:

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

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

Почему не стоит суммировать строки табличной части?

Иногда возникает соблазн просто посчитать сумму по колонке табличной части, например, использовать формулу Сумма(СуммаСтроки) вместо суммы документа. Давайте проанализируем, почему это может привести к ошибке.

Как верно замечено в обсуждении, если пользователь наложит отбор на отчет (например, Номенклатура = "Товар А"), то:

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

Настройка отображения в ресурсах (Нюансы)

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

  1. Поле: СуммаДокумента | Выражение: Максимум(СуммаДокумента) | Рассчитывать по: ЗаказКлиента.
    Это обеспечит вывод корректного числа в строке группировки заказа.
  2. Поле: СуммаДокумента | Выражение: Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(СуммаДокумента)", "ЗаказКлиента")) | Рассчитывать по: ОбщийИтог.
    Это обеспечит верный математический итог в подвале отчета.
← На главную