gifts2017

Как в СКД получить средневзвешенное значение в итогах отчета

Опубликовал Петр Ивакин (Petr54-ru) в раздел Программирование - Практика программирования

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

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

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

По определению, - СРЕДНЕВЗВЕШЕННОЕ (weighted average)  - это среднее арифметическое значение, в котором учтен вес каждого из слагаемых, для которых рассчитывается это среднее значение.

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

 

Тот самый хрестоматийный пример: был закуплен товар тремя партиями одна из которых – 100 тонн по 70 ф. ст. за тонну, другая – 300 тонн по 80 ф. ст. за тонну и третья  50 тонн по 95 ф. ст. за тонну, то в общей сложности он закупает 450 тонн товара; обычная средняя цена закупки составит (70 + 80 + 95) : 3 = 81,7 ф. ст. Средневзвешенная цена с учетом объемов каждой из партий равна (100 × 70) + (300 × 80) + (50 × 95) : 450 = 79,4 ф. ст. за тонну.

Формула:

Формула расчета средневзвешенного

Где Х – это значения, средневзвешенное которых мы хотим получить, а W – это веса.

На этом теория заканчивается.

Мне пришлось с этим столкнуться, когда я выводил в отчет данные о продажах товаров, с группировкой по менеджерам, где нужно было в итогах получить рентабельность. В строках отчета выводилась рентабельность по каждому товару в реализации, в итогах нужно было увидеть с какой рентабельностью отработал менеджер. Соответственно рентабельность – это «значение», а «вес» этого значения – это выручка. Ряд уточнений, для полноты картины. Выручка (объем реализации) – это произведение цены продажи товара на количество. Валовая прибыль – это выручка минус себестоимость (как именно рассчитывалась себестоимость в контексте этой статьи не принципиально). И наконец, рентабельность у нас  – это  выраженное в процентах отношение валовой прибыли к выручке.

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

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

Конструктор запроса, Объединения и псевдонимы

Это поле мы в отчет выводить не будем, нам нужны данные для расчетов итогов. Итоги мы будем рассчитывать уже в СКД на вкладке Ресурсы

Еще один прием работы с СКД на вкладке «Ресурсы», где указывается расчет итогов, есть возможность в поле «Выражение» использовать выражения, с данными из поля «Доступные поля». Смотрим рисунок ниже.

Вкладка Ресурсы СКД

Для колонки отчета «ПроцентРентабельности»  прописываем выражение Сумма(ВспомогательноеПоле)/Сумма(Выручка).

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

Вкладка Настройки СКД

Подведем итоги, в первую очередь важно понимать что такое средневзвешенное значение, и где нужно применять просто среднее арифметическое, а где – средневзвешенное. С технической точки зрения, некоторую сложность могут представлять два момента – создание в отчете вспомогательного поля, и возможность использования произвольного выражения в ресурсах СКД, для расчетов нужных нам итогов.

Надеюсь, что для кого-то эта статья окажется полезной. 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Ожерельев (Поручик) 27.01.14 14:34
Пока полезной не оказалась, но на будущее пригодится. Если сейчас не набежит местный бомонд и не разнесёт на корки.
y22-k; Трактор; +2 Ответить
2. Александр Медведев (anig99) 28.01.14 22:07
В книгах и статьях про ресурсы СКД всё это есть.
3. Dima Dima (bayce) 29.01.14 17:26
Отчет может дать немного труднообъяснимый результат по менеджерам.
4. Петр Ивакин (Petr54-ru) 29.01.14 18:18
(3) bayce,

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

Однако статья вовсе не про это, а про получение в СКД средневзвешенного значения в итогах. Такая задача где угодно может выскочить.
5. ффф ыыы (zqzq) 30.01.14 16:52
Вспомогательное поле ИМХО красивее добавлять на вкладке "Вычисляемые поля" в СКД. Там доступны расширенные функции СКД, функции общих модулей и т.д., а СКД само уже запрос сгенерирует, если есть обращение к БД в поле. +Запрос не захламляется.
Единственное (очень редкое) исключение с которым сталкивался - вычисляемый ресурс начальный/конечный остаток, его лучше в запросе и установить роль.

Вообще если оставить относящееся к СКД, то будет только нестандартное (не по умолчанию) вычисление ресурса. Более интересно было бы, например, особенности соединения наборов данных в СКД (при вычислении итогов по группировкам считает итоги ДО соединения и не задваивает количества, если ключ связи неуникальный). А вообще лучше Хрусталёву прочитать (+курс Гилёва для введения в тему).
6. vadim anonim (ferre) 31.01.14 17:13
"Тот самый хрестоматийный пример: был закуплен товар тремя партиями одна из которых – 100 тонн по 70 ф. ст. за тонну, другая – 300 тонн по 80 ф. ст. за тонну и третья – 50 тонн по 95 ф. ст. за тонну, то в общей сложности он закупает 450 тонн товара; обычная средняя цена закупки составит (70 + 80 + 95) : 3 = 81,7 ф. ст. Средневзвешенная цена с учетом объемов каждой из партий равна (100 × 70) + (300 × 80) + (50 × 95) : 450 = 79,4 ф. ст. за тонну."

Решение (в ресурсах):

СУММА(ВычислитьВыражениеСГруппировкойМассив("Количество*Цена", "Партия",,))/Сумма(Количество)

ВычислитьВыражениеСГруппировкойМассив("Количество*Цена", "Партия",,) вернет массив из (100 × 70); (300 × 80); (50 × 95);

Не забываем поставить для поля "Партия" - "обьязательное".

ПС: с 8.2.14

Если кому интерестно могу создать публикацию.
7. Петр Ивакин (Petr54-ru) 01.02.14 12:23
(6) ferre,

На мой взгляд была бы востребована публикация про "продвинутую" работу с ресурсами в СКД. В литературе в основном примеры с ресурсами вида:

Поле Выражение
Рожно Сумма(Рожно)

В упомянутой в коментах книжке Хрусталевой - Е.Ю. Хрусталева "Разработка сложных отчетов в 1С Предприятии 8. Система компоновки данных (2008)", иная работа с ресурсами есть только в Примере №10 в Главе 4.

Есть еще двухтомник «Профессиональная разработка в системе 1С:Предприятие 8 (1С Паблишинг 2012)», там есть во втором томе Глава 16 - «Сложные аналитические отчеты». Пример №17, - там тоже нетривиальная работа с ресурсами, и все. Во всяком случае, я больше ничего не видел. Я считаю, что информации по продвинутой работе с ресурсами крайне мало и статья с примерами, близкими к реальным пошла бы на ура. У меня пока хорошего материала из своей личной практики в нужном для статьи объеме нет.

Я когда начал работать с 1С 8.Х, меня поначалу страшно бесила ситуация с внятными мануалами. Например в Delphi все что нужно разработчику есть в документации, а документация находится «внутри» Delphi. А тут если «упираешься» в проблему, то после мануалов, книжек, только и остается, что надеяться на то что на Инфостарте найдется статья которая натолкнет на то, в какую сторону копать.
8. int int (IntSergey) 02.02.14 04:26
Возникает вопрос, - с какой рентабельностью отработал менеджер в отчетном периоде. Для корректного ответа на этот вопрос нужно вычислить средневзвешенное значение рентабельности.


А зачем так все усложнять? Вроде его корректная рентабельность - это итог по валовой прибыли разделить на итог по выручке этого менеджера. Какая средневзвешенная рентабельность?

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

Зачем вычислять произведение рентабельности на выручку- это валовая прибыль. Скорее мы рентабельность вычисляем от валовой прибыли и выручки.

Для колонки отчета «ПроцентРентабельности» прописываем выражение Сумма(ВспомогательноеПоле)/Сумма(Выручка).

Ты будешь крайне удивлен результату
Сумма(Валовая прибыль)/Сумма(Выручка)

Мне кажется ты запутался.

Средневзвешенная цена с учетом объемов каждой из партий равна (100 × 70) + (300 × 80) + (50 × 95) : 450 = 79,4 ф. ст. за тонну

Я думаю, что это обычная средняя себестоимость в классическом ее понимании - какая средневзвешенная цена.
И считается она классически итого по сумме разделить на общее количество.

dim369; zqzq; +2 Ответить 1
9. Dmitry Malyshev (SaperVodichka) 11.02.14 13:26
Может пригодиться, информация, по новым возможностям 8.3: В языке выражений системы компоновки данных реализованы следующие функции: ACos(), ASin(), ATan(), Sin(), Cos(), Tan(), Exp(), Log(), Log10(), Pow(), Sqrt(), Окр(), Цел(), ТипЗначения(),Тип().
В языке выражений системы компоновки данных реализованы следующие агрегатные функции: Каждый(), Любой(), СтандартноеОтклонениеГенеральнойСовокупности(), СтандартноеОтклонениеВыборки(), ДисперсияВыборки(), ДисперсияГенеральнойСовокупности(), КовариацияГенеральнойСовокупности(), КовариацияВыборки(), Корреляция(), РегрессияНаклон(), РегрессияОтрезок(), РегрессияКоличество(), РегрессияR2(), РегрессияСреднееX(), РегрессияСреднееY(), РегрессияСреднееSXX(), РегрессияСреднееSYY(), РегрессияСреднееSXY().
10. Александр Крынецкий (echo77) 11.02.14 20:51
Автор, акцентируйте внимание на том что в ресурсах СКД может быть написано достаточно сложное выражение, отличающееся от СУММА(Ресурс) или КОЛИЧЕСТВО(Ресурс) - для новичков это хороший толчок в нужном направлении.
Сам многое для себя открыл когда это узнал и кстати, первым где я это использовал это тоже был расчет процента по формуле СУММА(Показатель1)/СУММА(Показатель2)
11. Петр Ивакин (Petr54-ru) 12.02.14 06:57
(10) echo77,

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


Я с вами полностью согласен, пока лично в это не упрешься, осознание не придет. Есть пара книжек - Разработка сложных отчетов в "1С:Предприятии 8.2". Система компоновки данных", ссылка - http://v8.1c.ru/metod/books/book.jsp?id=389 , там среди немалого количества примеров только один пример где в ресурсах есть выражение отличное от Сумма(Рожно) или Среднее(Рожно), есть еще книжка - Профессиональная разработка в системе 1С:Предприятие 8", ссылка - http://v8.1c.ru/metod/books/book.jsp?id=401 , там тоже один единственный пример нетривиальной работы с ресурсами. Во всем объеме этих материалов по СКД информация о ресурсах просто теряется.
12. Дмитрий Бор (dim369) 14.02.14 09:49
(8) IntSergey,

Средневзвешенная цена с учетом объемов каждой из партий равна [(100 × 70) + (300 × 80) + (50 × 95)] : 450 = 79,4 ф. ст. за тонну. Так будет правильнее с учетом последовательности операций :)
13. Алексей Земсков (Aleksey.z) 28.02.14 12:54
А почему именно среднее арифметическое? Учитываете ли робастность?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа