# 7.1. Динамические заголовки

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

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBS1I17OsIGuJ-c%2Freport_default.png?generation=1554561484780921\&alt=media)

**Панель параметров отчета**, расположенная в правой части экрана, по умолчанию скрыта и выводится на экран при нажатии на кнопку **Отображать настройки** с иконкой в виде гаечного ключа.

При изменении любого параметра отчета структура заголовка динамические меняется с одновременным пересчетом всех данных. Значения параметров, у которых значения будут изменены по сравнению по значениями по умолчанию, выделяются темно-желтым цветом. Сделаем следующие изменения параметров текущего отчета:

* параметр **Откл-е** выключим
* у параметра **План/факт** заменим значение с **План/факт** на **Факт**
* у параметра **Число пред**. месяцев установим значение **4 пред. мес**.
* параметр **Доля в общем объеме** выключим

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

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBUzkiN1xdL95qq%2Freport_trend.png?generation=1554561484344310\&alt=media)

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

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBWXAfftq35ncSW%2Freport_calc.png?generation=1554561484259012\&alt=media)

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

1. Создание **логических меток**, выступающих в качестве операндов в логических выражениях фильтрации колонок.
2. Создание **списков значений** параметров отчета, которые будут обрабатываться отчетной системой JetCalc.
3. Установка для каждого **списка значений** параметров отчетов одной или нескольких **логических меток** с установкой для каждой метки логического значения **TRUE** или **FALSE**.
4. Создание **логических групп** параметров, используемых для визуальной группировки параметров на панели.
5. Создание **параметров отчетов** с установкой для каждого логической группы, списка значений и значения по умолчанию.
6. Добавление и настройка в **документах** одного или нескольких **параметров отчетов** с логическими метками, необходимыми для обработки **выражений фильтрации** колонок.
7. Настройка **выражений фильтрации** для отдельных колонок в заголовках документа.
   1\.

## Формальная логика

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

| Характеристика выражений                                    | Арифметика                                                  | Логика                                                                          |
| ----------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------- |
| Значения, которые могут принимать операнды                  | Любые числовые значения                                     | Только значения **TRUE** (ИСТИНА) или **FALSE** (ЛОЖЬ)                          |
| Используемые операторы                                      | + (сложение),  - (вычитание),  \* (умножение) и / (деление) | **AND** (логическое И), **OR** (логическое ИЛИ) и **NOT**(логическое отрицание) |
| Использование круглых скобок                                | Допускается                                                 | Допускается                                                                     |
| Очередность выполнения операций                             | \* и / - в первую очередь, - и + во вторую очередь          | NOT в первую очередь, AND и OR во вторую очередь                                |
| Пример (в квадратных скобках приведены значения переменных) | ( A\[3] + B\[5] ) \* C\[2]= 8                               | ( A\[true] and B\[false] ) or C\[true]  = true                                  |

Для каждого из операторов определены достаточно простые правила формирования результата выражения (подробнее см. статью [https://ru.wikipedia.org/wiki/Алгебра логики](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8) в Википедии):

а) **AND** - логическое И (конъюнкция), бинарная операция:

| **TRUE**  | and | **TRUE**  | = | **TRUE**  |
| --------- | --- | --------- | - | --------- |
| **TRUE**  | and | **FALSE** | = | **FALSE** |
| **FALSE** | and | **TRUE**  | = | **FALSE** |
| **FALSE** | and | **FALSE** | = | **FALSE** |

б) **OR** - логическое ИЛИ (дизъюнкция), бинарная операция:

| TRUE      | **or** | TRUE      | **=** | TRUE      |
| --------- | ------ | --------- | ----- | --------- |
| **TRUE**  | or     | **FALSE** | =     | **TRUE**  |
| **FALSE** | or     | **TRUE**  | =     | **TRUE**  |
| **FALSE** | or     | **FALSE** | =     | **FALSE** |

в) **NOT** - логическое отрицание, унарная операция:

| not | TRUE      | **=** | FALSE    |
| --- | --------- | ----- | -------- |
| not | **FALSE** | =     | **TRUE** |

## Создание логических меток

**Логическими метками** в JetCalc являются уникальные переменные, которые могут принимать значение **TRUE** или **FALSE** в зависимости от установленных значений параметров текущего отчета. Создание логических меток выполняется в административной панели в разделе **Параметры > Метки**. Внешний вид панели представлен на следующей рисунке:

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBYD-1bUn2qLqck%2Fparam_key.png?generation=1554561484811982\&alt=media)

Для каждой новой логической метки необходимо указать:

* **Код логической метки** - уникальный код, содержащий информацию о предметной области.
* **Наименование** - описание логической метки;
* **Краткое наименование** - необязательный параметр.

Наиболее важным на данном этапе является выбор кода метки, который должен, с одной стороны, содержать **информацию** о предметной области, и, с другой стороны, быть достаточно **лаконичным** и **простым в написании**, чтобы свести к минимуму ошибки при написании выражений фильтрации.

> Примеры меток:
>
> **MES** и **SNG** - для фильтрации колонок по признаку месячных периодов или накопительных периодов с начала года;
>
> **PLAN** и **FACT** - для фильтрации колонок по признаку значений по плану или факту.

## Создание списков значений

**Списком значений** в JetCalc является уникальная метка, к которой могут быть привязаны две или более логических метки с определенными для каждой метки логического значения (**TRUE** или **FALSE**). Выделяют два типа меток по дальнейшему их использованию:

* **списки с двумя значениями** - применяются для создания параметров отчетов в виде переключателей;
* **списки с тремя и более значениями** - применяются для создания параметров отчетов в виде выпадающих списков.

Для каждого нового списка значений необходимо указать:

* **Код списка значений** - уникальный код, содержащий информацию о предметной области;
* **Наименование** - описание списка значений;
* **Краткое наименование** - необязательный параметр;

Для удобства и наглядности последующей настройки параметров отчетов рекомендуется придерживаться **соглашения**, что **код списка значений** образуется путем объединения **кода параметра отчета** и одного из двух **суффиксов**:

* \_**flag** - для списков с двумя значениями
* \_**list** - для списков с тремя и более значениями

Создание списков значений выполнятся в административной панели в разделе **Параметры > Списки значений**. Внешний вид панели представлен на следующей рисунке:

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QB_8FavkpJ2BAZh%2Fparam_list.png?generation=1554561484641272\&alt=media)

> В приведенном на рисунке примере представлен список значений с кодом **mes\_flag** и наименованием **За месяц (флаг)**, который в дальнейших примерах будет использован для настройки параметра отчета с кодом **mes**.

## Установка логических меток для списков значений

Чтобы иметь возможность применять ранее созданные логические метки и списки их значений, нужно их связать между собой, и в каждой связи установить для логических меток логическое значение TRUE или FALSE. Такая настройка выполняется в административной панели в разделе **Параметры > Значения**. Внешний вид панели представлен на следующей рисунке:

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBb67fHnrSUC-3Y%2Fparam_value.png?generation=1554561484336964\&alt=media)

Для каждой связи списка значений и логических меток необходимо определить:

* **Код параметра** - уникальный код параметра;
* **Наименование** - описание параметра;
* **Краткое наименование** - используется при выводе значения на интерфейсе для списков значений, содержащих более двух значений;
* **Список значений** - выбранное значение из ранее созданного выпадающего справочника списков значений;
* **Индекс** - целочисленное значение, определяющее порядок вывода списка значений, содержащих более двух значений.
* **Логические метки** - одна или несколько меток, для каждой из которых определяется логическое значение **TRUE** или **FALSE**.

По соглашению коды связей списков значений и логических меток формируются путем соединения кода списка значений и всех связанных с ним кодов логических меток. При этом для меток, у которых установлено значения **FALSE**, перед кодом метки ставится оператор логического отрицания **NOT**. Например:

```
mes_flag_NOT_MES
```

Для списка значений с тремя значениями внешний вид может выглядеть следующим образом:

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBdb0_9YQPo8f9c%2Fparam_value_3.png?generation=1554561483857824\&alt=media)

При установке связей для списка значений, содержащего более двух значений, допускается указывать только метки, имеющие значение **TRUE**. Для отсутствующих логических меток предполагается, что для них установлено значение **FALSE**.

Эта возможность обусловлена приведением в большинстве языков программирования отсутствующего значения, которое обозначается как **NULL**, к логическому значению **FALSE**. Поэтому следующие выражения будут эквивалентны:

```
TRUE and NULL = TRUE and FALSE
TRUE or NULL = TRUR or FALSE
```

Вышеописанная конструкция позволяет создавать для одного и того же набора логических меток разные наборы списков значений. Например, для меток **PLAN** и **FACT** можно создать два списка значений, отдельно для плана и отдельно для факта, а можно создать общий список значений, в котором объединить эти две метки в три комбинации. Например:

| Список значений                 | Значение метки PLAN | Значение метки FACT |
| ------------------------------- | ------------------- | ------------------- |
| а) два разных списка:           |                     |                     |
| plan\_flag\_PLAN                | TRUE                | -                   |
| plan\_flag\_NOT\_PLAN           | FALSE               | -                   |
| fact\_flag\_FACT                | -                   | TRUE                |
| fact\_flag\_NOT\_FACT           | -                   | FALSE               |
| б) один общий список:           |                     |                     |
| planfact\_list\_PLAN\_FACT      | TRUE                | TRUE                |
| planfact\_list\_PLAN\_NOT\_FACT | TRUE                | FALSE               |
| planfact\_list\_NOT\_PLAN\_FACT | FALSE               | TRUE                |

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

## Создание логических групп параметров

Логические группы параметров позволяют визуально выделить однородные группы в панели параметров отчетов. Создание логических групп параметров выполняется в административной панели в разделе **Параметры > Группы**. Внешний вид панели представлен на следующей рисунке:

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBffnn1wL9qVRMs%2Fparam_grp.png?generation=1554561483797622\&alt=media)

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

* **Код группы** - уникальный код логической группы параметров;
* **Наименование** - описание логической группы параметров;
* **Краткое наименование** - метка группы, выводимая на интерфейсе в панели параметров.

По соглашению у каждого кода логических групп параметров указывается префикс **pg\_**.

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

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

## Создание параметров отчетов

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

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBh5AcoiNcplKtc%2Fparam_create.png?generation=1554561483929697\&alt=media)

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

* **Код параметра** - код параметра отчета;
* **Наименование** - наименование параметра отчета, выводимое на интерфейсе в панели параметров;
* **Краткое наименование** - необязательный атрибут;
* **Индекс** - целочисленное значение, определяющее порядок вывода параметра сверху вниз в панели параметров;
* **Логическая группа** - устанавливается,  в какой логической группе будет выводится параметр на интерфейсе;
* **Список значений** - устанавливается используемый параметров список значений;
* **Значение по умолчанию** - определяется значение по умолчанию параметра из допустимого списка значений.

## Добавление параметров отчетов в документы

Настроенные параметры отчетов добавляются **индивидуально** для каждого документа на вкладке **Настройка документа** в разделе **Параметры отчетов**. Внешний вид панели настройки представлен на следующем рисунке:

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBjYvVBv52xfxc-%2Fparam_doc.png?generation=1554561485238368\&alt=media)

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

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

## Настройка выражений фильтрации

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

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBlOImEUZQTWxpL%2Fparam_expression.png?generation=1554561484967812\&alt=media)

## Редактор выражений фильтрации

Настройка выражений фильтрации выполняется в редакторе, схожем на редактор формул, который представлен на следующем рисунке:

![](https://640371188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lbn4ETTWljOikkGTsy5%2F-Lbn4Gh85_O07ucHCF_s%2F-Lbn4QBnTZxxhEo6yyDO%2Fparam_expression_edit.png?generation=1554561485182449\&alt=media)

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

Так как в подавляющем большинстве случаев выражения фильтрации представляют собой простой набор меток, объединенных логическим И (**AND**), поэтому редактор логических выражений позволяет автоматически генерировать такие выражения, выбирая щелчком левой кнопкой мыши нужные логические выражения из правого списка.

Наиболее типичные выражения фильтрации выглядят следующим образом:

```
FACT and MES
PLAN and PY1
```

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

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