Как рассчитать стандартное отклонение в СКД в 1С?

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

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

Встроенные агрегатные функции СКД для расчета отклонения

Начиная с версии платформы 1С 8.3, в язык выражений системы компоновки данных добавлены специализированные статистические агрегатные функции. Разберем основные из них:

  1. СтандартноеОтклонениеВыборки(Поле) — рассчитывает несмещенную оценку среднеквадратичного отклонения. В математической формуле сумма квадратов отклонений делится на (N - 1), где N — количество элементов в выборке. Если группировка содержит всего одно значение, функция возвращает NULL из-за невозможности деления на ноль.
  2. СтандартноеОтклонениеГенеральнойСовокупности(Поле) — вычисляет смещенную оценку стандартного отклонения (деление суммы квадратов отклонений происходит на N). При расчете для единственного значения функция возвращает 0.
  3. ДисперсияВыборки(Поле) и ДисперсияГенеральнойСовокупности(Поле) — родственные агрегатные функции, возвращающие значение дисперсии (квадрат стандартного отклонения) для выборки и генеральной совокупности соответственно.

Настройка расчета стандартного отклонения на вкладке «Ресурсы»

Проанализируем пошаговый порядок добавления расчета в схему компоновки данных:

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

Посмотрим на примеры выражений для ресурсов:

Для расчета несмещенного стандартного отклонения по выборке:

СтандартноеОтклонениеВыборки(СуммаПродажи)

Для расчета отклонения генеральной совокупности:

СтандартноеОтклонениеГенеральнойСовокупности(Количество)

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

Особенности обработки пустых значений и ограничений платформы

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

  1. Обработка значений NULL: значения NULL, а также пустые и нечисловые данные автоматически отсекаются платформой и не увеличивают количество записей N в формуле. Если весь набор данных группировки состоит исключительно из NULL, результатом функции также будет NULL.
  2. Ограничение языка запросов: статистические агрегатные функции поддерживаются только языком выражений СКД (в ресурсах и вычисляемых полях). В обычном тексте запроса (в блоке ВЫБРАТЬ) эти функции недоступны.

Альтернативный расчет через экспортную функцию общего модуля

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

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

Пример выражения на вкладке «Ресурсы»:

МойСтатистическийМодульКлиентСервер.РассчитатьОтклонение(Массив(СуммаПродажи))

Пример кода экспортной функции в общем модуле:


Функция РассчитатьОтклонение(МассивЗначений) Экспорт

    КоличествоЭлементов = МассивЗначений.Количество();
    Если КоличествоЭлементов < 2 Тогда
        Возврат 0;
    КонецЕсли;

    // Вычисляем среднее арифметическое
    Сумма = 0;
    Для Каждого ТекЗначение Из МассивЗначений Цикл
        Сумма = Сумма + ТекЗначение;
    КонецЦикла;
    Среднее = Сумма / КоличествоЭлементов;

    // Вычисляем сумму квадратов отклонений
    СуммаКвадратов = 0;
    Для Каждого ТекЗначение Из МассивЗначений Цикл
        Отклонение = ТекЗначение - Среднее;
        СуммаКвадратов = СуммаКвадратов + (Отклонение * Отклонение);
    КонецЦикла;

    // Возвращаем стандартное отклонение выборки
    Возврат Math.Sqrt(СуммаКвадратов / (КоличествоЭлементов - 1));

КонецФункции

Использование встроенной функции СтандартноеОтклонениеВыборки() в СКД является предпочтительным способом решения задачи, так как расчет выполняется на уровне платформы без дополнительных накладных расходов на вызовы процедур встроенного языка.

← На главную