При разработке отчетов в системе компоновки данных (СКД) часто возникает задача расчета средней цены поступления номенклатуры за выбранный период или по нескольким документам. Начинающие разработчики нередко сталкиваются с ситуацией, когда формула в вычисляемых полях возвращает некорректные значения либо делит реквизиты только внутри одной строки документа. Разберем по шагам, почему возникает эта ошибка и как правильно настроить расчет средневзвешенной цены.
Рассмотрим типичную ошибку, когда выражение вида Сумма(Товары.Цена) / Сумма(Товары.Количество) прописывают на вкладке Вычисляемые поля схемы компоновки данных. Выясним причину некорректного поведения:
Сумма() в вычисляемом поле применяется только к текущей строке.Проанализируем формулу средневзвешенной цены. Если в качестве веса каждой цены выступает объем закупки (количество), формула принимает вид:
Средневзвешенная цена = Общая сумма поступлений / Общее количество поступившего товара
Посмотрим на математическое доказательство:
Сумма(Цена_i * Количество_i) / Сумма(Количество) = Сумма(Сумма_i) / Сумма(Количество)
Таким образом, для получения корректной средней цены по всем поступлениям необходимо делить общую агрегированную сумму на общее агрегированное количество.
Разберем по шагам правильный алгоритм настройки схемы компоновки данных:
Количество, Сумма (или СуммаДокумента) и Цена.Количество и Сумма с выражениями Сумма(Количество) и Сумма(Сумма).СредняяЦена (его можно предварительно объявить на вкладке Вычисляемые поля без формулы или сразу рассчитывать в ресурсах).СредняяЦена прописываем формулу с обязательной защитой от деления на ноль:
ВЫБОР
КОГДА ЕстьNULL(Сумма(Количество), 0) = 0 ТОГДА 0
ИНАЧЕ Сумма(Сумма) / Сумма(Количество)
КОНЕЦ
В СКД на вкладке Ресурсы предусмотрена колонка Рассчитывать по..., позволяющая задавать разное поведение формулы для детальных записей и для группировок. Рассмотрим подробнее:
Сумма(Сумма) / Сумма(Количество).ЕстьNULL(Цена, 0).При получении данных из табличной части Документ.ПоступлениеТоваровУслуг.Товары обратим внимание на следующие особенности:
ГДЕ запроса необходимо обязательно отсекать непроведенные и помеченные на удаление документы:
ГДЕ
Поступление.Ссылка.Проведен = ИСТИНА
И Поступление.Ссылка.ПометкаУдаления = ЛОЖЬ
Товары.Количество * Товары.Коэффициент.