Сложный расчет итогов с помощью системы компоновки данных (СКД) в «1С»
Оглавление
- В чём заключается сложность расчета итогов по ключевым показателям?
- Определение ключевого показателя (КП)
- Список КП заранее не известен
- Производные КП
- Структура отчёта с ключевыми показателями
- Постановка задачи расчета агрегационных итогов
- Архитектура и методика решения для расчета ключевых показателей
- Справочники и регистры
- Концептуальная схема работы отчета
- Расчет итогов и формирование отчета по ключевым показателям
- Выводы
В чём заключается сложность расчета итогов по ключевым показателям?
В статье мы поговорим о применении СКД для решения очень общей задачи, которую можно описать словами «анализ деятельности предприятия». Более точно ее можно сформулировать так: необходимо разработать инструмент, который позволил бы без дополнительного программирования создавать, настраивать и анализировать произвольное количество числовых показателей деятельности компании с произвольным расчетом итогов.
Определение ключевого показателя (КП)
Из-за общности задачи и возникают сложности. Какие показатели необходимо анализировать? Очень разные, можно даже сказать — разноприродные.
Например:
- Суммовые показатели (прибыль, выручка).
- Количественные (численность персонала, количество обращений клиентов).
- Проценты (процент ФОТ в затратах).
- Удельные (выручка на одного специалиста, офисная площадь на одного человека).
- Любые другие, значения которых можно выразить числом (площадь помещений).
Таким образом, ключевой показатель — это любая сущность, которая может быть выражена числом, подлежащая анализу.
Список КП заранее не известен
Список показателей не определен заранее: деятельность предприятия меняется, потребность в анализе тоже. Состав показателей дополняется, уточняется, расширяется постоянно в течение жизни компании.
Есть показатели общие и общепринятые для всей компании, с общим способом расчета. Например, такие как выручка, прибыль. А есть специфические для какого-то филиала или вида деятельности. Например, молодой филиал с не устоявшимся количеством сотрудников анализирует количество квадратных метров офиса на одного сотрудника.
Производные КП
Часть показателей является производными: их значение бессмысленно хранить, оно напрямую зависит от значений базовых показателей. Такими показателями, например, являются все удельные: для их расчета нужно знать общее значение и количество сущностей, на которое нужно поделить это общее.
Пример:
Удельная прибыль на сотрудника — это общая прибыль, поделенная на количество сотрудников.
Структура отчёта с ключевыми показателями
При большом количестве сотрудников, занимающихся анализом, возникает потребность организовывать эти показатели в уникальные для конкретного менеджера списки и/или структуры.
Если показателей в компании хоть сколько-нибудь значимое количество, то у любого менеджера должна быть возможность быстро сформировать отчет по релевантному именно для него перечню показателей, причем желательно не просто перечню, а особым образом организованному перечню.
Например, структура может быть такой:
Раздел 1: Общая выручка Выручка от продажи товаров Выручка от продажи услуг Раздел 2: Затраты ФОТ Командировки Прочее Раздел 3: Прибыль
Постановка задачи расчета агрегационных итогов
С требованиями к самим показателям более-менее определились, теперь нужно сформулировать, какие требования возникают непосредственно при анализе данных.
В любой системе хранения данных есть детализированное хранимое значение, то есть такое, набор аналитик которого мы считаем достаточным. Скажем, можно хранить выручку за каждый день и для каждого продавца, а можно — за год и по компании в целом.
Допустим, мы договорились, что детальное значение показателя мы храним или считаем в разрезах Подразделение/Месяц. Задача состоит в корректном расчете итогов для всей компании. Возникают следующие вопросы:
- Как посчитать итог для одного подразделения за год?
- Для всей компании за год?
В самом простом случае ответ — всё сложить. Например, прибыль. Понятно, что прибыль по компании за месяц — это сумма всех прибылей подразделений за этот месяц, а прибыль за год — это сумма всех прибылей за месяц, неважно, для одного подразделения или для всей компании.
Теперь разберем, например, показатель «Численность сотрудников». Что такое численность всей компании за месяц? Это снова сумма численности подразделений (не рассматриваем случаи, когда сотрудник числится сразу в двух подразделениях по полставки). А что такое численность подразделения за год? Сумма численностей за все месяцы? Точно нет.
На практике оказывается, что решение, как анализировать численность за год, принимает конкретный аналитик. Некоторые считают, что это должен быть максимум от численностей за месяцы, некоторые — что среднее. А что такое численность компании за год? Это, соответственно, максимум (или среднее) от суммы численностей подразделений за каждый месяц.
Отдельный случай — с расчетными показателями. Как посчитать, например, удельную прибыль за год? Можно взять среднюю из рассчитанных удельных прибылей помесячно, а можно рассчитать по своей формуле на уровне года, применив агрегацию к тем показателям, что являются основой для расчета: в таком случае, удельная прибыль за год = сумма прибыли за год / средняя численность за год.
Так, в нашем примере средняя удельная прибыль за год = (214.29 + 133.33 + 177.78) / 3, а удельная прибыль, рассчитанная за год по формуле = 4300 (прибыль за год) / 8.33 (средняя численность за год).
Система должна предоставить инструмент для того, чтобы реализовать возможность выбора агрегационной функции итога по периоду для каждого показателя, так как этот выбор зависит от нужд конкретного аналитика.
Собрав все возможные требования к расчету итогов, мы пришли к такому перечню агрегаций:
- Сумма.
- Среднее.
- Максимум.
- Количество.
- Количество различных.
- Среднее накопительное.
- Формула (релевантно только для расчетных показателей; имеется в виду расчет по формуле на любом уровне итогов, с применением агрегационных функций базовых показателей).
Архитектура и методика решения для расчета ключевых показателей
Теперь, когда задачи сформулированы, рассмотрим возможные архитектурные подходы для их решения. Начнем с задачи об открытом списке КП, создании новых, модификации имеющихся.
Справочники и регистры
1. Справочник «Ключевые показатели». Справочник открыт для добавления новых элементов ключевых показателей и редактирования существующих. Таким решается задача составления заранее не заданного списка КП.
2. В каждом КП возможно задать его собственный способ расчета итога по периоду. Таким образом решается задача произвольного подсчета итогов для каждого отдельно взятого КП. Разумеется, в данном случае это всего лишь декорационная обвязка над сложным математическим аппаратом СКД.
Мы рассмотрим ее ниже.3. Если КП расчетной природы, то можно задать формулу его расчета в терминах языка запроса «1С». Для удобства пользователей коды базовых показателей в пользовательском режиме трансформируются в наименования. Так решается задача произвольного расчета показателя без хранения значений.
4. Для хранения значений всех показателей, кроме формульных, в системе создан регистр сведений «Значения ключевых показателей». Его структура зависит от набора аналитик, определяющих значение ключевого показателя. В нашем примере его структура была бы такова:
- Подразделение,
- Период (месяц),
- Ключевой показатель,
- Значение.
Регистр может заполняться вручную, а может — автоматически, на основании методов расчета, заданных в ключевом показателе.
5. Хотя это не относится к теме статьи, заметим, что один и тот же показатель может рассчитываться по-разному для разных контуров и объектов учета. Например, разными контурами может быть плановая и фактическая деятельность компании, а объектами учета — разные филиалы:
6. Справочник «Виды отчетов» — инструмент для систематизации КП.
Каждый вид отчета представляет собой структуру, которую пользователь наполняет необходимыми для него КП. Также для каждого раздела структуры можно задать способ расчета итога по этому разделу. Вид отчета выбирается в отчете по ключевым показателям.
Таким образом, решаются следующие задачи:
- составление собственной структуры КП для облегчения анализа;
- хранение в системе произвольного количества таких структур.
Важно понимать, что задача системы — обеспечить максимальную гибкость инструмента; при этом фактическое использование (то есть количество и состав структур и собственно КП) зависит от управленческих задач и решается по‑своему в каждой компании.
Пример структуры КП:
7. Отчет «Сравнительный анализ ключевых показателей».
Наконец мы добрались до главного инструмента анализа — собственно, отчета.
Какие задачи решает отчет:
- Вывод значений хранимых значений показателя / списка показателей.
- Расчет и вывод значений формульных значений показателя / списка показателей.
- Расчет итогов по показателям по периоду.
- Расчет итогов по показателям по произвольному набору группировок.
- Расчет итогов по показателям по разделам структуры.
Концептуальная схема работы отчета
- Запросом собирается предварительная таблица данных.
- Программно модифицируется таблица данных.
- Назначается как набор данных для СКД, которая и занимается окончательной обработкой и выводом отчета.
- Программно формируется схема СКД в части выражения ресурсов и вычисляемых полей.
Сбор данных заключается в формировании массива ключевых показателей и получении для них актуальных значений, хранимых в регистре. Массив формируется следующим образом:
- Отбор показателей по прямому отбору из отчета, будь то по структуре или по ручному отбору, установленному пользователем.
- Раскрутка формул из расчетных показателей, с целью получить список тех показателей, которые являются базой для расчета.
При подготовке исходных данных запрос собирает список показателей, поданных на вход, а также тех показателей, которые являются базовыми для расчетных, и по ним строит плоскую таблицу. Результат выглядит так:
Показатель | Рассчитывается | Подразделение | Период | Значение |
---|---|---|---|---|
Прибыль (Код = «000000736») | Нет | Отдел внедрений | 01.2020 | 1000 |
Численность (Код = «000000739») | Нет | Отдел внедрений | 5 | |
Численность (Код = «000000739») | Нет | Отдел продаж | 01.2020 | 2 |
Удельная прибыль (Код = «000000740») | Да | Отдел внедрений | 01.2020 | |
… |
Далее наша работа заключается в том, чтобы модифицировать эту таблицу в тот вид, из которого благодаря вычисляемым полям и ресурсам СКД мы сможем получить все необходимые цифры. Финальная таблица для подачи в СКД выглядит так:
В ней добавлены колонки с именами, соответствующими кодам ключевых показателей, и в них помещены соответствующие значения. Теперь в каждой строке есть значения каждого КП, и для каждой строки можно вычислить любую формулу (так как в запрос были добавлены все КП, на которые ссылаются формулы в отобранных пользователем показателях).
Расчет итогов и формирование отчета по ключевым показателям
Теперь начинается самое интересное. Перед нами стоит две задачи:
- Вычислить формульные показатели.
- Рассчитать необходимые итоги, используя правильные агрегатные функции для каждого показателя.
Немаловажная подзадача — сделать поле выражения ресурса настолько не громоздким, насколько это возможно. Задача составления выражения сложна. Можно составить настолько сложное выражение, что компиляция текста запроса, которую можно видеть в виде события технологического журнала SDBL, будет занимать большое количество памяти и особенно процессора.
Для приведения значения показателей к одному полю мы используем Вычисляемое поле СКД. Вот как выглядит его выражение для нашего простого демонстрационного примера:
ВЫБОР КОГДА КлючевойПоказатель.Код = "000000002" ТОГДА а000000002 КОГДА КлючевойПоказатель.Код = "000000037" ТОГДА а000000037 ИНАЧЕ 0 КОНЕЦ
Здесь мы превращаем отдельные столбцы с значением конкретных КП обратно в одно значение и подтягиваем сюда все КП, которые не являются формульными. Это нужно для того, чтобы при вычислении ресурса мы могли обращаться к одному полю для всех неформульных показателей и, таким образом, упростить его выражение.
Далее нам нужно рассчитать итоги.
Почти для всех типов итога используется выражение вида:
СРЕДНЕЕ(ВЫЧИСЛИТЬВЫРАЖЕНИЕ
СГРУППИРОВКОЙМАССИВ("СУММА(Значение1)", "Период")),
Где:
Среднее — это агрегационная функция, указанная для нашего показателя (см. скрин выбора агрегационной функции в карточке ключевого показателя).
Значение1 — это вычисленное поле СКД.
Период — это имя группировки минимального периода, т. е. в нашем случае месяц.
Что делает это выражение:
- Суммирует все значения внутри периода (т. е. в нашем случае значение показателя для всех существующих подразделений).
- Получает массив этих сумм.
- Вычисляет среднее из значений массива.
Как работает это выражение, давайте посмотрим последовательно.
Сначала вычислим выражение без агрегации:
ВЫЧИСЛИТЬВЫРАЖЕНИЕ
СГРУППИРОВКОЙМАССИВ
("СУММА(Значение1)", "Период")
Система выдаст массив значений:
Почему важна СУММА(Значение1), почему нельзя взять просто Значение1?
- Потому что нужно посчитать сумму численностей по подразделениям внутри периода, и получить число 7 в январе, 9 в феврале и 9 в марте.
- На уровне же квартала мы видим массив помесячных значений.
Теперь применим агрегацию:
СРЕДНЕЕ(
ВЫЧИСЛИТЬВЫРАЖЕНИЕ
СГРУППИРОВКОЙМАССИВ
("СУММА(Значение1)", "Период")
)
И получим то, что нам нужно:
Теперь рассмотрим формульный показатель с двумя способами расчета итога по периоду: по средней и по формуле.
Возьмем показатель Удельная прибыль, которая в минимальном значении будет выражена формулой «Прибыль/Численность».
Формула в терминах кодов показателей и языка запросов выглядит так:
ВЫБОР КОГДА а000000739 = 0 ТОГДА 0 ИНАЧЕ а000000736 / а000000739 КОНЕЦ
Применим к ней способ расчета по периоду «Среднее»:
СРЕДНЕЕ(ВЫЧИСЛИТЬ
ВЫРАЖЕНИЕСГРУППИРОВКОЙ
МАССИВ(" ВЫБОР КОГДА СУММА(а000000739) = 0 ТОГДА 0 ИНАЧЕ СУММА(а000000736)/СУММА(а000000739) КОНЕЦ ", "Период"))
Получим следующий результат
Можно увидеть, что внутри периода (месяца) удельная прибыль рассчитывается по формуле. Так, удельная прибыль в целом не равна сумме удельных прибылей по подразделениям, а рассчитана как общая прибыль за месяц / численность за месяц.
В то же время удельная прибыль за квартал рассчитана как средняя из помесячных.
Как задать способ расчета, чтобы на уровне квартала удельная прибыль считалась тоже по формуле, из прибыли за квартал / численность за квартал?
Вот так:
ВЫБОР КОГДА СРЕДНЕЕ
(ВЫЧИСЛИТЬВЫРАЖЕНИЕ
СГРУППИРОВКОЙМАССИВ
("СУММА(а000000739)", "Период")) = 0 ТОГДА 0 ИНАЧЕ СУММА(а000000736) / СРЕДНЕЕ(ВЫЧИСЛИТЬ
ВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ
("СУММА(а000000739)", "Период")) КОНЕЦ
Что изменилось: мы применили агрегационную функцию вычисления итога не к результату вычисления формулы, а к каждому базовому показателю — свою; и только потом рассчитали формульный показатель.
Результат:
Как мы видим, месячные значения остались теми же самыми, а вот квартальные изменились:
516 = 4300 / 8,333333
Какой способ расчета применять — решает аналитик, в зависимости от решаемых им задач, и настраивает это в справочнике ключевых показателей; важно, что мы можем предоставить любой способ расчета, и отчет будет работать корректно при любом наборе и порядке группировок.
Отдельный случай — средний накопительный итог. Что означает среднее накопительное? Что значение за февраль = (значение за январь + значение за февраль) / 2, значение за март = (значение за январь + значение за февраль + значение за март) / 3, и так далее. Для вычисления такого выражения мы прибегаем к функции ВЫЧИСЛИТЬВЫРАЖЕНИЕ:
ВЫЧИСЛИТЬВЫРАЖЕНИЕ(
"СУММА(Значение1) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Период)", "Период",, "Первая", "Текущая"),
Где:
Значение1 — это вычисленное поле СКД.
Период — это имя группировки минимального периода, т. е. в нашем случае месяц.
Что делает выражение:
- Суммирует все значения за периоды с первого по текущий в нашей группировке.
- Считает количество этих периодов.
- И делит одно на другое.
Важно! Понятие «первая» и «текущая» группировки существуют только в пределах родительской группировки. Это является на текущий момент ограничением платформенного механизма СКД в «1С». То есть, если у нас есть группировка «Квартал», то «Апрель» для нее станет первым, а не четвертым.
В нашем примере средненакопительный итог рассчитывается для формульного показателя, поэтому выражение будет сложнее.
Давайте попробуем написать так:
ВЫЧИСЛИТЬВЫРАЖЕНИЕ("СУММА ( ВЫБОР КОГДА а000000739 = 0 ТОГДА 0 ИНАЧЕ а000000736 /а000000739 КОНЕЦ )", "Период",,"Первая", "Текущая") / ВЫЧИСЛИТЬВЫРАЖЕНИЕ
("КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Период)", "Период",, "Первая", "Текущая")
Получим следующий результат:
Результат на уровне отдельных подразделений не может не радовать: он рассчитан верно. Однако если посмотреть на удельную средненакопительную в целом, то мы увидим, что она рассчиталась как сумма удельных средненакопительных по подразделениям, а это совсем не то, что нам было нужно. Нужно посчитать ее по формуле на этом уровне группировки, и потом усреднить.
Финальное выражение выглядит очень громоздко, однако решает поставленную задачу: суммирует базовые показатели только в пределах периода и формула вычисляется корректно на всех уровнях.
ВЫЧИСЛИТЬВЫРАЖЕНИЕ("" ВЫБОР КОГДА СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 1, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ)=0 ТОГДА 0 ИНАЧЕ СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 1, 1) ТОГДА а000000736 ИНАЧЕ 0 КОНЕЦ)/СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 1, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ"" ,""Период"",, ""Первая"", ""Текущая"") + ВЫЧИСЛИТЬВЫРАЖЕНИЕ("" ВЫБОР КОГДА СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 2, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ)=0 ТОГДА 0 ИНАЧЕ СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 2, 1) ТОГДА а000000736 ИНАЧЕ 0 КОНЕЦ)/СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 2, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ"" ,""Период"",, ""Первая"", ""Текущая"") + ВЫЧИСЛИТЬВЫРАЖЕНИЕ("" ВЫБОР КОГДА СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 3, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ)=0 ТОГДА 0 ИНАЧЕ СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 3, 1) ТОГДА а000000736 ИНАЧЕ 0 КОНЕЦ)/СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 3, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ"" ,""Период"",, ""Первая"", ""Текущая"") ) / ВЫЧИСЛИТЬВЫРАЖЕНИЕ(""КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Период)"", ""Период"",, ""Первая"", ""Текущая"")
В каждом складываемом блоке мы принудительно ограничиваем расчет одним (текущим) месяцем, и заставляем СКД просуммировать базовые показатели внутри каждого месяца и рассчитать удельную по формуле внутри этого месяца.
Получаем результат:
Он нас полностью удовлетворяет.
Остался последний шаг: добиться расчета средненакопительного показателя на уровне квартала (или года).
Здесь придется прибегнуть к отдельному ресурсу, который будет рассчитан именно на уровне этих группировок и способ расчета у него для средненакопительного показателя будет совпадать с обычным средним: в самом деле, средненакопительный итог за квартал это ни что иное, как среднее за квартал!
Добавляем в схему компоновки ресурс для группировок «Квартал» и «Год»:
Выражение для нашего средненакопительного показателя в этом ресурсе будет выглядеть следующим образом:
СРЕДНЕЕ(ВЫЧИСЛИТЬ
ВЫРАЖЕНИЕСГРУППИРОВКОЙ
МАССИВ(" ВЫБОР КОГДА СУММА(а000000739) = 0 ТОГДА 0 ИНАЧЕ СУММА(а000000736)/СУММА(а000000739) КОНЕЦ ", "Период"))
И мы получим следующий результат:
Каждый показатель разобран нами в примере, у каждого свой способ расчета на разных уровнях. Теперь мы можем посмотреть, как выглядит финальное выражение ресурса в СКД для нашего несложного демонстрационного примера:
ВЫБОР КОГДА Не КлючевойПоказатель.Рассчитываемый ТОГДА ВЫБОР КОГДА КлючевойПоказатель.ИтогПоГоризонтали = Значение(Перечисление.ИтогиГруппировок.Среднее) ТОГДА СРЕДНЕЕ(ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ("СУММА(Значение1)", "Период, КлючевойПоказатель")) ИНАЧЕ СУММА(Значение1) КОНЕЦ КОГДА КлючевойПоказатель.Код = "000000740" ТОГДА ВЫБОР КОГДА СРЕДНЕЕ(ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ("СУММА(а000000739)", "Период")) = 0 ТОГДА 0 ИНАЧЕ СУММА(а000000736) / СРЕДНЕЕ(ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ("СУММА(а000000739)", "Период")) КОНЕЦ КОГДА КлючевойПоказатель.Код = "000000741" ТОГДА ( ВЫЧИСЛИТЬВЫРАЖЕНИЕ(" ВЫБОР КОГДА СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 1, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ)=0 ТОГДА 0 ИНАЧЕ СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 1, 1) ТОГДА а000000736 ИНАЧЕ 0 КОНЕЦ)/СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 1, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ" ,"Период",, "Первая", "Текущая") + ВЫЧИСЛИТЬВЫРАЖЕНИЕ(" ВЫБОР КОГДА СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 2, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ)=0 ТОГДА 0 ИНАЧЕ СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 2, 1) ТОГДА а000000736 ИНАЧЕ 0 КОНЕЦ)/СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 2, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ" ,"Период",, "Первая", "Текущая") + ВЫЧИСЛИТЬВЫРАЖЕНИЕ(" ВЫБОР КОГДА СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 3, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ)=0 ТОГДА 0 ИНАЧЕ СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 3, 1) ТОГДА а000000736 ИНАЧЕ 0 КОНЕЦ)/СУММА(ВЫБОР КОГДА Период = ДАТАВРЕМЯ(2020, 3, 1) ТОГДА а000000739 ИНАЧЕ 0 КОНЕЦ) КОНЕЦ" ,"Период",, "Первая", "Текущая") ) / ВЫЧИСЛИТЬВЫРАЖЕНИЕ("КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Период)", "Период",, "Первая", "Текущая") ИНАЧЕ 0 КОНЕЦ
Выводы
Какие выводы можно сделать из статьи?
Во-первых, построение отчетов с разноприродными показателями в одной колонке — задача очень сложная. Поскольку требуются различные подходы к подсчету итогов как по горизонтали, так и по вертикали.
Во-вторых, для такого подсчета необходим подходящий инструмент. И тут возникает соблазн перейти от декларативного инструмента к алгоритмическому. Но это не позволит добиться необходимой устойчивости расчета итогов при смене группировок. И в большинстве случаев разработчики просто отказываются от вариативности группировок в пользу фиксированного набора и порядка следования.
В-третьих, и это самое главное, СКД является мощнейшим инструментом не только в платформе «1С», но и среди альтернативных систем построения отчетов, например, электронных таблиц.
Вопросы производительности и использования различных инструментов в разработке на 1С:Предприятии мы рассматривали в предыдущих статьях от экспертов «1С‑Рарус»:
- Анализ отсутствующих событий в технологическом журнале «1С» или лаги в технологическом логе
- Подходы к сценарному тестированию на примере 1С:Общепит и 1С:Сценарное тестирование
- Jenkins в разработке конфигураций «1С»
- Производительность нового RLS в 1С БСП 3. Переходить или нет?
- Аварийное завершение рабочих процессов кластера «1С» и полнотекстовый поиск данных
Подписывайтесь на наш канал в Telegram и почтовые рассылки, чтобы не пропустить новые статьи.
Авторы статьи
Ротштейн Ольга
Черанев Андрей
Вычислить и Выполнить в 1С
- Подробности
- Категория: Введение
Вычислить()
Функция вычислить применяется для вычисления выражения на языке 1С.
Ипользуется для простых математических или логических действий, либо операций конкатенации
Математическая операция
Операция сравнения
Операция конкатенации
Выполнить()
Оператор Выполнить позволяет выполнить фрагмент кода. Отличие от Вычислить, кроме бОльших возможностей ещё и в том что это процедура и она не возвращает значений. Поэтому для демонстрации используется переменная(ЗначениеРезультата) которая есть в процедуре вызываемой по кнопке.
Математическая операция
Использование функции модуля
Обращение к значению колллекцию полученной функцией находящейся в модуле
В Вычислить можно использовать только выражение, поэтому при попытке присваивания значения имеющейся переменной происходит сравнение.
Как можно использовать Вычислить?
Кроме выполнения простых действий описанных выше функцию можно использовать для получения переменных модуля. Например нужно получить значение переменной имя которой имеет счетчик.
Имеется три переменных
Переменная1 = 10;
Переменная2 = 20;
Переменная3 = 30;
Получить значение переменной Переменная2 в модуле без указания этого имени невозможно, например нельзя получить значение в цикле используя значение счетчика. Если бы это была структура, то было бы возможно собрать имя из разных значений. Используя Вычислить() мы добъемся того же рисунок ниже. Для демонстрации нужно раскоментировать вызов процедуры и нажать на кнопку «Вычислить».
Что касается функции Выполнить(), то здесь возможно выполнение фрагментов кода. Например можно взять и скопировать содержимое процедуры «ВыводЗначенияПеременных» в поле «Текст параметра:» и нажать Выполнить рисунок ниже
Зачастую метод Выполнить применяется для исполнения отрывков кода которые создает пользователь и которые хранятся в базе.
Скачать демонстрационную обработку здесь.
Недостаточно прав для комментирования
Учебное пособие по алгебраическому калькулятору— MathPapa
Это учебное пособие о том, как использовать алгебраический калькулятор , пошаговый калькулятор для алгебры.
Решение уравнений
Сначала перейдите на главную страницу алгебраического калькулятора. В текстовом поле калькулятора вы можете ввести математическую задачу, которую хотите вычислить.
Например, попробуйте ввести уравнение 3x+2=14 в текстовое поле.
После того, как вы введете выражение, калькулятор алгебры распечатает пошаговое объяснение того, как решить 3x+2=14.
Примеры
Чтобы увидеть больше примеров задач, которые понимает калькулятор алгебры, посетите Страница примеров. Не стесняйтесь попробовать их сейчас.
Математические символы
Если вы хотите создать свои собственные математические выражения, вот некоторые символы, которые алгебраический калькулятор понимает:
+ (дополнение)
— (Вычитание)
* (Умножение)
/ (Отдел)
92.
Вычисление выражений
Алгебра Калькулятор может вычислять выражения, содержащие переменную x.
Чтобы вычислить выражение, содержащее x, введите выражение, которое вы хотите вычислить, затем знак @ и значение, которое вы хотите подставить вместо x. Например, команда 2x @ 3 оценивает выражение 2x для x=3, что равно 2*3 или 6.
Алгебра Калькулятор также может вычислять выражения, содержащие переменные x и y. Чтобы вычислить выражение, содержащее x и y, введите выражение, которое вы хотите вычислить, затем знак @ и упорядоченную пару, содержащую ваши значения x и y. Вот пример вычисления выражения xy в точке (3,4): xy@(3,4).
Проверка ответов для решения уравнений
Так же, как алгебраический калькулятор можно использовать для вычисления выражений, Калькулятор алгебры также можно использовать для проверки ответов при решении уравнений, содержащих x.
В качестве примера предположим, что мы решили 2x+3=7 и получили x=2. Если мы хотим снова подставить 2 в исходное уравнение, чтобы проверить нашу работу, мы можем сделать так: 2x+3=7 @ 2. Поскольку ответ правильный, алгебраический калькулятор показывает зеленый знак равенства.
Если вместо этого мы попробуем значение, которое не работает, скажем, x=3 (попробуйте 2x+3=7 @ 3), алгебраический калькулятор вместо этого покажет красный знак «не равно».
Чтобы проверить ответ на систему уравнений, содержащих x и y, введите два уравнения, разделенные точкой с запятой, затем знак @ и упорядоченную пару, содержащую ваши значения x и y. Пример: х+у=7; х+2у=11@(3,4).
Режим планшета
Если вы используете планшет, например iPad, войдите в режим планшета, чтобы отобразить сенсорную клавиатуру.
Related Articles
- Evaluating Expressions Using Algebra Calculator
- Checking Answers Using Algebra Calculator
- Solving Equations Using Algebra Calculator
- Solving Systems of Equations Using Algebra Calculator
- Graphing Equations Using Algebra Calculator
MATH — Calculate Expression
Расчет Инструкция Expression (MATH) используется для выполнения сложных математических операций. вычисления, используя формат, аналогичный тому, который используется в электронной таблице или распространенные языки программирования. Каждое выражение может быть вложенным или связанным для создания простых и сложных выражений. Скобки могут быть вложенными до 8 уровней в глубину.
После ввода содержимого выражения нажмите OK , чтобы сохранить содержимое и закрыть редактор, нажмите Отмена , чтобы закрыть редактор без сохранения изменений, или нажмите Справка по выражениям , чтобы открыть раздел справки для всех математические операторы и функции, которые можно использовать в выражении.
Традиционный математический приоритет (термины в скобках), затем показатели и корни, затем умножение и деление и, наконец, правила сложения и вычитания) используются для решения математического выражения, Использование круглых скобок для устранения любой двусмысленности в порядке обработки рекомендуется.
Продвижение по математике / понижение в должности
ЦП Do-more изначально является 32-битным процессором. Хотя много разных форматы и размеры данных поддерживаются всякий раз, когда инструкция должна выполнять расчет с элементом ПЛК, который НЕ является 32-битным значением, это значение получает » продвинут». Это означает, что всякий раз, когда элементы, которые являются UNSIGNED BYTE, SIGNED BYTE, UNSIGNED WORD, или SIGNED WORD используются в математических вычислениях, они обрабатываются изначально как 32-битное целое число со знаком. Все эти типы данных легко помещаются и все их значения поддерживаются как собственные 32-битные целые числа со знаком.
Большинство математических вычислений, использующих в качестве входных данных целые числа, будут также вернуть целое число. Например, при делении двух целых чисел ЦП выполняет целочисленное деление, а не деление с плавающей запятой, что означает, что целое число 5, деленное на целое число 2, равно целому числу 2, а не реальному значению 2,5.
Однако, если реальное значение когда-либо является частью математического расчета, как только в расчет введено реальное значение, математический процессор начинает выполнять вычисления с плавающей запятой для ВСЕХ операций в будущем. Это будет включать автоматическое продвижение любых промежуточные целые значения в их эквивалент с плавающей запятой. Например, уравнение (5 + 2) / 2.0 будет вычислять 5 + 2 как целое число и промежуточный результат будет целым числом 7, но когда целое число 7 делится на число с плавающей запятой значение 2,0, математический процессор выполняет операцию деления с плавающей запятой, которая преобразует целое число 7 в 7,0, и результатом будет действительное значение 3,5.
Существует исключение из этого правила, связанное с математическим вычислением, обрабатывающим математическую функцию, возвращающую целочисленное значение, например TRUNC() или ROUND(). Если математический процессор обрабатывал реальные операции, то обработка любой из математических функций, возвращающих целое число, вернет математический процессор к использованию целочисленной математики в дальнейшем.
Наиболее распространенная ошибка возникает при делении двух целочисленных значений, но желаемый результат является дробным реальным результатом. Используйте функцию ТОРЕАЛ() для повышения целочисленного значения или целочисленного выражения до его реального эквивалента. Например, если вы хотите разделить D10 на D11 и получить дробную результат с плавающей запятой, любой из следующих даст желаемый результат:
Следует помнить, что когда в вычислении участвуют как целые и типы с плавающей запятой, целые типы будут автоматически продвигаться к значениям с плавающей запятой, так что расчет может быть выполнен с использованием все типы с плавающей запятой. Типы с плавающей запятой автоматически усекаются в целые числа, когда программа ожидает целочисленное значение, например, когда переменная с плавающей запятой присваивается целочисленной переменной.
При присвоении целочисленного или вещественного значения элементу Bit целые и вещественные значения нуля/не нуля оцениваются как OFF/ON для бита.
Все ошибки, возникающие при вычислении выражения, будут сообщать в Системе Страница состояния диалогового окна «Информация о системе» и соответствующий системный уровень. Местоположение бита ($IndexError, $OutOfRange, $Overflow, $DivedByZero и т. д.) также будет включен.
Скорость выполнения вычислений
Целочисленные вычисления выполняются БЫСТРО, а целочисленные вычисления ТОЧНЫ. Делайте больше процессоров имеют 32-битную целочисленную точность, что составляет +/- 2 миллиарда. Если миллион Значения BYTE 255 складываются вместе, и результат (255 000 000 будет помещается в 32-битную ячейку D.
Вычисления с плавающей запятой МЕДЛЕННЕЕ (не МЕДЛЕННЕЕ, просто МЕДЛЕННЕЕ). Он имеет 24 бита «точности» (7 бит для экспоненты, 1 бит для знака, для всех 32 бита). Например, попытка прибавить 1 000 000 (один миллион) к 0,0000001. (одна миллионная), не даст 1 000 000,0000001, потому что одна РЕАЛЬНЫЙ не может удерживать ТАКОЙ точности в 32 битах. Реальные локации имеют возможность хранить большой диапазон возможных значений в одном 32-битном регистре, от очень маленьких до очень больших чисел (например, 0,0000001 и 1 000 000 или даже 6,02 х 1023). Потеря точности, т.е. ты не можешь хранить ИМЕННО 3,3, и нельзя складывать действительно большие и действительно маленькие числа вместе и сохранить всю точность обоих чисел.
Один блок MATH позволяет программисту свободно смешивать REAL и целые числа, вот и возникают вопросы: когда теряется точность? Когда теряется скорость?
Процессор Do-more будет попытаться использовать целочисленную математику для всех вычислений, потому что это быстро и точный. Но когда вводится НАСТОЯЩЕЕ значение, начиная с этого момента, остальные расчеты будут выполняться в REAL. это немного чрезмерное упрощение, потому что, когда у вас есть подвыражения, каждое подвыражение подчиняется этому правилу, а не только слева направо на уровне выражения ASCII).
Вот пример: расчет (CT0.Acc + CT1.Acc + CT2.Acc) / 3 выполняется с использованием всей целочисленной математики. Результат вычисления является целым числом. Целочисленное деление — это один из случаев, когда вы теряете точность; это ОБРЕЗЫВАЕТСЯ. 1/3 равно 0. 2/3 равно 0,3 / 3 равно 1. 4 / 3 равно 1. Однако помните, что расчет начнется использование FLOATING POINT MATH для всех последующих вычислений после его введения.
Если изменить расчет на (CT0.Acc + CT1.Acc + CT2.Acc) / 3.0, Целочисленная математика используется для трех аккумуляторов счетчика в числителе. (что здорово для скорости и точности), но деление делается с РЕАЛЬНОЕ значение 3.0, а не ЦЕЛОЕ значение 3.
Когда деление выполняется с REAL, расчет выполняется как операция с плавающей запятой. Это даст желаемый результат, пока поскольку этот результат сохраняется в РЕАЛЬНОМ месте памяти.
Что делать, если знаменатель не является РЕАЛЬНЫМ ячейкой памяти, например V? Например: (CT0.Соответствие + CT1.Согласие + CT2.Согласие) / V10. Поскольку ячейки памяти V содержат целочисленные значения, а желаемый результат — REAL, значение в ячейке V должны быть преобразованы в РЕАЛЬНОЕ значение. Примечание: в этом случае не используйте приведения типов, например: do не использовать V10:R. Приведение предназначено для переинтерпретации битового шаблона, а не для преобразования данных.
Функция MATH, называемая TOREAL(), выполнит необходимое преобразование. Он берет выражение в круглых скобках и преобразует его в REAL. Если выражение является целым числом, оно преобразуется в REAL. Если выражение уже НАСТОЯЩЕЕ значение, оно ничего не делает.
Если V10 содержит целочисленное значение 3, то (CT0.Acc + CT1.Acc + CT2.Acc) / TOREAL(V10) даст желаемый результат.
Альтернативно, TOREAL(CT0.Acc + CT1.Acc + CT2.Acc) / V10 даст тот же результат, но вычисления с плавающей запятой будут выполняться для весь расчет, а не только деление.
Эмпирическое правило состоит в том, чтобы выполнять целочисленные вычисления как можно дольше, когда вы знайте, что вы не потеряете точность. Сложение и вычитание всегда хорошо для целых чисел. Умножение и деление обычно хорошо работают с целыми числами, но умножение двух больших 32-битных чисел, которые превысят 32 бита, не будет работы, умножение должно выполняться как с плавающей запятой.