Общая информация о вычислениях

О компоненте

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

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

Система позволяет задавать в вычисляемых показателях правила агрегации значений. Агрегация – это применение некоторой функции (сумма, среднее и т.п.) для вычисления значения при родительском элементе через значения дочерних элементов. Агрегация производится по иерархическим справочникам и показателям с типом значений «Период».

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

Кроме вычисляемых показателей в Системе также существуют другие виды вычислений:

Интерпретация

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

1. Интерпретация заголовка-фильтра в отчете

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

Пусть в Системе существуют ежедневные данные по продажам товаров в сети магазинов (для упрощения в примере подразумевается, что каждая запись – продажа одной единицы товара):

Сумма продажи – Товар – Магазин – Период

В таком случае показатель Сумма продажи (S) – это функция от трех переменных Товар (p), Магазин (m), Период (t):

S(p,m,t)

Если при этом существует объект вида:

Сумма продажи = 50, Товар = "Товар1", Магазин = "Mагазин1", Период = "10.01.2019"

тогда функция имеет вид:

\[S(p = "Товар1", m = "Магазин1", t = "10.01.2019") = 50.\]

В такой интерпретации фильтр Товар = «Товар1» в заголовке столбца (строки) отчета подставляет в переменную p значение «Товар1» во всех ячейках этого столбца (строки):

  Магазин = «Магазин1» Магазин = «Магазин1» Магазин = «Магазин2»
  Период = «10.01.2019» Период = «11.01.2019» Период = «10.01.2019»
Товар = «Товар1» S(«Товар1», «Магазин1», «10.01.2019») S(«Товар1», «Магазин1», «11.01.2019») S(«Товар1», «Магазин2», «10.01.2019»)
Товар = «Товар2» S(«Товар2», «Магазин1», «10.01.2019») S(«Товар2», «Магазин1», «11.01.2019») S(«Товар2», «Магазин2», «10.01.2019»)

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

Показатель Процент продаж товара (R) вычисляется по следующей формуле:

\[R(p,m,t) = 100 * S(p,m,t) / \sum_{i} S(p_i,m,t)\]

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

Процент продаж товара ПРИ Товар = X = 100 * Сумма продажи ПРИ Товар = Х / СУММА (Сумма продажи)

В формуле использована свободная переменная – т.е. в явном виде задано, как именно Системе обрабатывать признак Товар для вычисления функции. Остальные переменные применяются ко всем аргументам формулы автоматически.

2. Общие переменные для аргументов формулы

Пример формулы для расчета прибыли в магазине за определенный период времени.

Пусть в Системе существует показатель Закупочная цена товара (K(p)) по всем товарам, тогда показатель Прибыль вычисляется по следующей формуле:

\[U(m,t) = \sum_{i} (S(p_i,m,t)-K(p_i))\]

В терминологии Системы эта формула выглядит следующим образом:

Прибыль ПРИ Магазин = X И Период = Y = СУММА ( Сумма продажи ПРИ Магазин = X И Период = YЗакупочная цена товара , Товар)

С помощью второго аргумента для функции СУММА в явном виде указано, что суммирование идет по признаку Товар.

Во всех примерах подразумевается, что существует только одна продажа товара в день. Если продаж в день больше одной, необходимо сначала создать показатель «Общая сумма продаж» (применить к аргументам Сумма продажи дополнительную фунцию СУММА, получив формулу Общая сумма продаж = СУММА (Сумма продажи)) и далее использовать созданный показатель.

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

Порядок вычислений

При вычислении значения при заданных фильтрах и источнике производится:

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

Таким образом, введенные значения имеют больший приоритет (см. подробнее в подразделе «Корректировка»), а сам процесс вычисления значения для показателя может быть достаточно сложным – вычисления и агрегация могут перемежаться, постепенно спускаясь вниз. Но для каждой ячейки значение всегда получено понятным образом – по одной из формул или агрегацией через значения в других ячейках, соответствующих аргументам формулы или ниже расположенным по одному из деревьев узлам. Здесь под ячейкой понимается некоторый набор фильтров и источник – эта ячейка не обязательно присутствует в отчете.

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

Расслоения

Расслоение может возникнуть только в одном случае, в пункте «1» описанного выше порядка вычислений – если условиям фильтров удовлетворяет несколько введенных значений. При самих вычислениях расслоение возникнуть не может – даже если задано несколько формул, всегда используется первая из них, по которой получилось совершить расчет.

Если для ячейки существует введенное значение, то формулы не применяются.

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

Расслоения можно избежать двумя способами:

  1. Добавить фильтры, чтобы конкретизировать объект.

    Например, существует реестр с показателями «Организация», «Сумма по контракту» и «Период»:

    _images/stratification_1.PNG

    В столбце отчета задан показатель-источник «Сумма по контракту», в заголовках строк – фильтры по показателю «Организация». В строке, соответствующей организации «Организация 1», происходит расслоение по показателю «Период»:

    _images/stratification_2.PNG

    Чтобы избавиться от расслоения, необходимо добавить фильтр по показателю «Период»:

    _images/stratification_3.PNG

    После этого в отчете будут отображаться только данные за определенный отчетный период:

    _images/stratification_4.PNG
  2. Использовать «жадные» функции, чтобы «свернуть» несколько объектов в одно значение.

    В том же примере выше, для того чтобы избежать расслоения, возможно создать и вывести в отчет новый показатель «Общая сумма по контракту», который будет суммировать значения показателя «Сумма по контракту» за несколько отчетных периодов:

    _images/stratification_8.PNG

    После этого в отчете будут отображаться данные об общих объемах финансирования, освоенных организациями за несколько лет выполнения контракта:

    _images/stratification_7.PNG

Агрегация

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

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

Примеры доступных функций агрегации:

  • СУММА – в ячейке выводится сумма всех содержащихся в Системе данных, удовлетворяющих всем указанным признакам.
  • КОЛИЧЕСТВО – в ячейке выводится количество записей в Системе, удовлетворяющих всем указанным признакам.
  • МИНИМУМ – в ячейке выводится минимальное значение из всех содержащихся в Системе данных, удовлетворяющих всем указанным признакам.
  • МАКСИМУМ – в ячейке выводится максимальное значение из всех содержащихся в Системе данных, удовлетворяющих всем указанным признакам.
  • СРЕДНЕЕ – в ячейке выводится среднее арифметическое значение для всех содержащихся в Системе данных, удовлетворяющих всем указанным признакам.

Например, существует показатель A, с аналитическими признаками «Период» и «Структура_вуза». Показатель «Структура_вуза» берет значения из древовидного справочника вида:

– вуз
– - факультет 1
– - – кафедра 1.1
– - – кафедра 1.2
– - факультет 2
– - – кафедра 2.1
– - – кафедра 2.2

Данные в справочник вводятся по месяцам, отдельно для каждой кафедры.

Ниже приведены несколько примеров различных вариантов агрегации показателя А по периоду и древовидной структуре вуза:

  1. Чтобы посчитать А за год как среднее по месяцам (на всех уровнях вуза), потом А для факультета как сумму по кафедрам и А для вуза как сумму по факультетам (для всех периодов):

    ``А (период=год) = СРЕДНЕЕ (A (период=месяц))``;
    ``A (структура_вуза=x) = СУММА (A (структура_вуза.родитель=x))``;
    
  2. Чтобы посчитать А для вуза за год как среднее по кафедрам и месяцам, А для факультета за год как среднее по кафедрам и месяцам, А для года и кафедры – как среднее по месяцам, а А для вуза и месяца – как среднее по кафедрам и А для факультета и месяца – как среднее по кафедрам:

    ``А (период=год, структура_вуза=вуз) = СРЕДНЕЕ (A (период=месяц, структура_вуза.родитель.родитель=вуз))``;
    ``А (период=год, структура_вуза=x) = СРЕДНЕЕ (A (период=месяц, структура_вуза.родитель=x))``;
    ``A (период=год) = СРЕДНЕЕ (A (период=месяц))``;
    ``A (структура_вуза=x) = СРЕДНЕЕ (A (структура_вуза.родитель.родитель=x))``;
    ``A (структура_вуза=x) = СРЕДНЕЕ (A (структура_вуза.родитель=x))``;
    

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

Т.е. выражение:

``(период=год) = среднее(период=месяц)``

эквивалентно набору выражений:

``(период=год,структура_вуза=вуз) = среднее(период=месяц,структура_вуза=вуз)``;

``(период=год,структура_вуза=факультет) = среднее(период=месяц,структура_вуза=факультет)``;

``(период=год,структура_вуза=кафедра) = среднее(период=месяц,структура_вуза=кафедра)``.

Раскрытие вычислений

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

Корректировка значений

Если в Системе существует фактическое значение, удовлетворяющее фильтрам отчета, но для показателя задана формула, позволяющая вычислить это значение, Система воспринимает этот случай как корректировку вычисленного значения. Такая ячейка с двумя значениями будет подсвечена желтым цветом, а при наведении на нее курсора мыши будет появляться подсказка о том, что значение было откорректировано и будет указываться вычисленное значение. Если вычисленное и откорректированное значения совпадают, ячейка будет подсвечена бледно-желтым цветом, если различаются — ярко-желтым.

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

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

Например, если использовать следующие значения показателя A (см. подробнее в подразделе «Агрегация»):

А (период=январь 2019 г., структура_вуза=кафедра 1.1) = 7
А (период=январь 2019 г., структура_вуза=кафедра 1.2) = 5
А (период=январь 2019 г., структура_вуза=кафедра 2.1) = 14

и установить для этого показателя формулу агрегации:

A (структура_вуза=x) = СУММА (A (структура_вуза.родитель=x));

тогда вычисленное значение:

А (период=январь 2019 г., структура_вуза=вуз) = 26

Если дополнительно ввести значение:

А (период=январь 2019 г., структура_вуза=факультет 1) = 30

то вычисленное значение будет иным:

А (период=январь 2019 г., структура_вуза=вуз) = 44

Этот эффект возникает, так как согласно заданной формуле Система спускается «по одному уровню» справочника «Структура_вуза» за итерацию. В этом случае очень важен порядок вычислений. Если при тех же фактических данных для показателя А будут заданы формулы в таком порядке:

A (структура_вуза=x) = СУММА (A (структура_вуза.родитель=x));
A (период=год) = СУММА (A (период=месяц));

то вычисленное значение будет таким:

А(период=2019 г., структура_вуза=вуз) = 26

Если же формулы будут заданы в другом порядке:

A (период=год) = СУММА (A (период=месяц));
A (структура_вуза=x) = СУММА (A (структура_вуза.родитель=x));

то вычисленное значение изменится:

А (период=2019 г., структура_вуза=вуз) = 44