Как запретить суммирование цены в отчетах на СКД (Система компоновки данных)

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

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

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

Разберем причину: почему цена суммируется?

В СКД любое поле, добавленное на вкладку Ресурсы, по умолчанию получает функцию СУММА(). Это стандартное поведение системы, рассчитанное на показатели количества или суммы. Чтобы изменить это поведение, нам нужно вмешаться в логику агрегации данных. Рассмотрим последовательно несколько способов решения этой задачи.

Способ 1: Изменение агрегатной функции в ресурсах

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

Проанализируем использование других функций вместо СУММА():

  1. Перейдем на закладку Ресурсы в схеме СКД.
  2. Для поля Цена заменим выражение СУММА(Цена) на МАКСИМУМ(Цена) или СРЕДНЕЕ(Цена).
  3. Использование МАКСИМУМ() гарантирует, что если цена в рамках одной номенклатуры неизменна, то в итогах по этой номенклатуре мы увидим именно её значение, а не сумму.

Важный нюанс: использование СРЕДНЕЕ(Цена) может быть полезно для группировок верхнего уровня (например, по складу), чтобы видеть ориентировочный порядок цен, однако математически это не всегда оправдано для управленческого учета.

Способ 2: Настройка «Рассчитывать по...»

Этот метод является наиболее гибким и профессиональным. Он позволяет выводить цену в строках с номенклатурой, но оставлять пустыми итоги по документам или складам, где суммирование цен не имеет смысла.

Выполним следующие шаги:

  1. На закладке Ресурсы выберем поле Цена.
  2. В колонке Рассчитывать по... нажмем кнопку выбора.
  3. В открывшемся списке выберем только те группировки, для которых цена имеет смысл (например, Номенклатура, Характеристика или Детальные записи).
  4. Снимем галочки с группировок Документ, Склад и Организация, а также с поля Всего (Общий итог).

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

Способ 3: Расчет цены как вычисляемого поля

Иногда цена «складывается» из-за того, что в самом запросе она получается путем соединения таблиц, и происходит дублирование строк. Чтобы отчет всегда показывал математически верную цену, даже при наличии итогов, можно использовать формулу расчета цены через общую сумму и количество.

На закладке Ресурсы напишем выражение:


ВЫБОР 
    КОГДА СУММА(Количество) = 0 
    ТОГДА 0 
    ИНАЧЕ СУММА(Сумма) / СУММА(Количество) 
КОНЕЦ

Такой подход гарантирует, что в любой группировке (хоть по складу, хоть по всей фирме) будет выведена средневзвешенная цена. Это гораздо информативнее, чем просто сумма цен или максимум.

Способ 4: Проверка ролей полей в наборе данных

Если цена продолжает суммироваться, несмотря на настройки ресурсов, проверим вкладку Наборы данных. Обратим внимание на колонку Роль у поля Цена:

  1. Убедимся, что поле не помечено как Обязательное, если оно не используется в связях.
  2. Проверим, не указано ли оно как измерение в дополнительных настройках.
  3. Если в запросе используется СГРУППИРОВАТЬ ПО, убедимся, что цена входит в список полей группировки, а не агрегируется внутри самого текста запроса.

Рассмотрим пример правильной структуры запроса, исключающей дублирование цен при левом соединении:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.КоличествоОборот КАК Количество,
    ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
    Продажи.КоличествоОборот * ЕСТЬNULL(Цены.Цена, 0) КАК Сумма
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Начало, &Конец, , ) КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Конец, ВидЦены = &ВидЦены) КАК Цены
ПО
    Продажи.Номенклатура = Цены.Номенклатура
    И Продажи.Характеристика = Цены.Характеристика

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

Проблема кэширования: почему настройки не применяются?

Часто разработчик вносит изменения в ресурсы СКД, но при запуске отчета в режиме «1С:Предприятие» видит старый результат. Выясним причину:

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

Решение:

  1. В режиме пользователя откройте отчет.
  2. Перейдите в Настройки.
  3. Нажмите кнопку Еще — Установить стандартные настройки.
  4. Если отчет внешний (.erf), попробуйте переименовать его или очистить кэш метаданных, так как система часто «запоминает» структуру внешнего файла по его внутреннему идентификатору.

Дополнительный прием: Использование функций СКД

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

ВычислитьВыражение("Максимум(Цена)", "Номенклатура")

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

Подводя итог, отметим, что наиболее корректным способом для 1С:Управление торговлей является сочетание Способа 2 (настройка «Рассчитывать по») и Способа 3 (расчет средней цены через показатели суммы и количества), так как это дает наиболее достоверную финансовую картину в отчетах.

← На главную