Как правильно рассчитать среднюю цену номенклатуры по поступлениям в СКД?

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

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

Анализ проблемы: почему не работает расчет в вычисляемых полях

Рассмотрим типичную ошибку, когда выражение вида Сумма(Товары.Цена) / Сумма(Товары.Количество) прописывают на вкладке Вычисляемые поля схемы компоновки данных. Выясним причину некорректного поведения:

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

Математический расчет средневзвешенной цены

Проанализируем формулу средневзвешенной цены. Если в качестве веса каждой цены выступает объем закупки (количество), формула принимает вид:

Средневзвешенная цена = Общая сумма поступлений / Общее количество поступившего товара

Посмотрим на математическое доказательство:

Сумма(Цена_i * Количество_i) / Сумма(Количество) = Сумма(Сумма_i) / Сумма(Количество)

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

Пошаговая настройка отчета в СКД

Разберем по шагам правильный алгоритм настройки схемы компоновки данных:

  1. Переходим в набор данных (запрос) и проверяем, что в выборке присутствуют поля Количество, Сумма (или СуммаДокумента) и Цена.
  2. Переходим на вкладку Ресурсы. Добавляем поля Количество и Сумма с выражениями Сумма(Количество) и Сумма(Сумма).
  3. Добавляем новое поле ресурса — СредняяЦена (его можно предварительно объявить на вкладке Вычисляемые поля без формулы или сразу рассчитывать в ресурсах).
  4. В поле Выражение для ресурса СредняяЦена прописываем формулу с обязательной защитой от деления на ноль:

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

Настройка расчета по уровням группировок

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

  1. Для группировок по номенклатуре, поставщикам и для строки Итого оставляем расчет средневзвешенной цены: Сумма(Сумма) / Сумма(Количество).
  2. Для детальных записей (отдельных строк документов поступления) в колонке Рассчитывать по... можно указать прямое значение исходной цены из документа: ЕстьNULL(Цена, 0).

Важные нюансы при выборке данных из документов

При получении данных из табличной части Документ.ПоступлениеТоваровУслуг.Товары обратим внимание на следующие особенности:

  1. Статус документов: в секции ГДЕ запроса необходимо обязательно отсекать непроведенные и помеченные на удаление документы:
    
    ГДЕ 
        Поступление.Ссылка.Проведен = ИСТИНА
        И Поступление.Ссылка.ПометкаУдаления = ЛОЖЬ
    
  2. Коэффициенты упаковок: если товар может поступать в разных единицах измерения (штуки, коробки, паллеты), количество необходимо приводить к базовой единице хранения. В запросе количество следует умножать на коэффициент: Товары.Количество * Товары.Коэффициент.
  3. Использование регистров вместо табличных частей: прямое обращение к табличным частям документов замедляет работу отчета и не учитывает корректировки поступлений. Оптимальным решением является выборка данных из виртуальных таблиц оборотов регистров накопления (например, регистров закупок или партий товаров), где все суммы и количества уже зафиксированы по проведенным операциям.
← На главную