При разработке отчетов в 1С на базе Системы компоновки данных (СКД) программисты часто сталкиваются с тем, что числовые поля, такие как Цена, Вес или Коэффициент, ведут себя как обычные ресурсы и суммируются в группировках и общих итогах. Это приводит к получению бессмысленных цифр: например, если в документе три позиции с ценой 100 рублей, отчет покажет общую цену 300 в итогах по документу, хотя цена должна оставаться равной 100 или вовсе не выводиться в итоговых строках.
В этой статье мы подробно разберем, как правильно настроить схему компоновки данных, чтобы цена отображалась корректно, проанализируем настройки ресурсов и выясним, почему иногда изменения в конфигураторе не отражаются в режиме пользователя.
В СКД любое поле, добавленное на вкладку Ресурсы, по умолчанию получает функцию СУММА(). Это стандартное поведение системы, рассчитанное на показатели количества или суммы. Чтобы изменить это поведение, нам нужно вмешаться в логику агрегации данных. Рассмотрим последовательно несколько способов решения этой задачи.
Первое, что мы должны сделать — это пересмотреть способ расчета итога для поля Цена. Если мы просто удалим поле из ресурсов, оно перестанет отображаться в итоговых строках, но может продолжать суммироваться, если СКД посчитает его ресурсом автоматически или если оно входит в состав вычисляемых полей.
Проанализируем использование других функций вместо СУММА():
Цена заменим выражение СУММА(Цена) на МАКСИМУМ(Цена) или СРЕДНЕЕ(Цена).МАКСИМУМ() гарантирует, что если цена в рамках одной номенклатуры неизменна, то в итогах по этой номенклатуре мы увидим именно её значение, а не сумму.Важный нюанс: использование СРЕДНЕЕ(Цена) может быть полезно для группировок верхнего уровня (например, по складу), чтобы видеть ориентировочный порядок цен, однако математически это не всегда оправдано для управленческого учета.
Этот метод является наиболее гибким и профессиональным. Он позволяет выводить цену в строках с номенклатурой, но оставлять пустыми итоги по документам или складам, где суммирование цен не имеет смысла.
Выполним следующие шаги:
Цена.Номенклатура, Характеристика или Детальные записи).Документ, Склад и Организация, а также с поля Всего (Общий итог).В результате в строках с конкретными товарами цена будет отображаться, а в итоговых строках по складу или отчету будет пустое значение.
Иногда цена «складывается» из-за того, что в самом запросе она получается путем соединения таблиц, и происходит дублирование строк. Чтобы отчет всегда показывал математически верную цену, даже при наличии итогов, можно использовать формулу расчета цены через общую сумму и количество.
На закладке Ресурсы напишем выражение:
ВЫБОР
КОГДА СУММА(Количество) = 0
ТОГДА 0
ИНАЧЕ СУММА(Сумма) / СУММА(Количество)
КОНЕЦ
Такой подход гарантирует, что в любой группировке (хоть по складу, хоть по всей фирме) будет выведена средневзвешенная цена. Это гораздо информативнее, чем просто сумма цен или максимум.
Если цена продолжает суммироваться, несмотря на настройки ресурсов, проверим вкладку Наборы данных. Обратим внимание на колонку Роль у поля Цена:
СГРУППИРОВАТЬ ПО, убедимся, что цена входит в список полей группировки, а не агрегируется внутри самого текста запроса.Рассмотрим пример правильной структуры запроса, исключающей дублирование цен при левом соединении:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.КоличествоОборот КАК Количество,
ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
Продажи.КоличествоОборот * ЕСТЬNULL(Цены.Цена, 0) КАК Сумма
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Начало, &Конец, , ) КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Конец, ВидЦены = &ВидЦены) КАК Цены
ПО
Продажи.Номенклатура = Цены.Номенклатура
И Продажи.Характеристика = Цены.Характеристика
Проанализируем ситуацию: если использовать СрезПоследних внутри соединения в обычном запросе, важно обеспечить уникальность записей в таблице цен, иначе количество строк умножится, и итоговая сумма (и цена) удвоится.
Часто разработчик вносит изменения в ресурсы СКД, но при запуске отчета в режиме «1С:Предприятие» видит старый результат. Выясним причину:
Пользовательские настройки: 1С сохраняет вариант отчета и настройки колонок для каждого пользователя. Если вы удалили поле из ресурсов в Конфигураторе, оно могло остаться в «выбранных полях» в настройках конкретного пользователя.
Решение:
.erf), попробуйте переименовать его или очистить кэш метаданных, так как система часто «запоминает» структуру внешнего файла по его внутреннему идентификатору.Для более сложных случаев, когда нужно получить цену первой или последней записи в группировке без суммирования, можно использовать функцию ВычислитьВыражение прямо в ресурсах:
ВычислитьВыражение("Максимум(Цена)", "Номенклатура")
Это заставит СКД вычислять максимум цены именно в контексте группировки по номенклатуре, игнорируя нижестоящие детальные записи или вышестоящие итоги.
Подводя итог, отметим, что наиболее корректным способом для 1С:Управление торговлей является сочетание Способа 2 (настройка «Рассчитывать по») и Способа 3 (расчет средней цены через показатели суммы и количества), так как это дает наиболее достоверную финансовую картину в отчетах.