Нотация DMN 1.3
Нотации BPMN и DMN (Decision Model and Notation) разработаны для совместной работы. Когда требуется смоделировать сложное решение, диаграмма BPMN становится слишком сложной. В этом случае лучше смоделировать процесс принятия решения в DMN, а затем вернуть управление в BPMN.
Вызвать таблицу DMN из процесса можно добавив в него элемент Business Rule Task. Входные значения в соответствии с бизнес-правилами определенными в таблице. В результате вы получите выходные значения в заданном формате.
 
| DMN — это графическая нотация, подобная BPMN, с собственными диаграммами. Однако на практике поставщики программного обеспечения не реализуют полную нотацию, а используют только таблицы DMN, представляющие бизнес-правила. Jmix BPM поддерживает только таблицы DMN. | 
DMN движок
Jmix BPM использует DMN движок Flowable. Он поддерживает несколько моделей решений, и предоставляет гибкие возможности обработки выходных данных. Доступ к движку можно получить программно через DMN API. Кроме того, можно предоставить доступ для внешних систем через DMN REST API.
DMN definition
Корневым элементом схемы DMN 1.1 является элемент <definitions>. Внутри этого элемента можно определить несколько элементов <decision>.
| Для читаемости и удобства дальнейшего обслуживания рекомендуется иметь только один элемент <decision>в каждом файле. | 
Элемент <decision> может иметь один дочерний элемент <decisionTable>.
<definitions xmlns="http://www.omg.org/spec/DMN/20151101"
  namespace="http://www.flowable.org/dmn"
  name="DetermineDiscount">
  <decision id="DET_DISC_1" name="DetermineDiscount">
    <decisionTable id="determineDiscountTable1" hitPolicy="FIRST">
      ..
    </decisionTable>
  </decision>
</definitions>DMN Tools
Дополнение Jmix BPM предоставляет инструменты для создания и развертывания таблиц решений, в веб-приложении:
- 
Экран Decision Tables 
- 
Экран Decision Table Modeler 
Создание Таблицы Решений
Чтобы начать создание таблицу решений, из главного меню приложения перейдите на экран Decision table modeler.
 
Чтобы создать таблицу выполните следующие шаги:
- 
Укажите idиnameдля таблицы
- 
Определите inputs and outputs 
- 
Установите значения по умолчанию если необходимо 
- 
Создайте business rules 
- 
В случае, если правил несколько, установите hit policy. 
После завершения настройки, таблицы можно развернуть или сохранить как черновик.
Определение входных и выходных значений
В качестве значений inputs and outputs используются процессные переменные. При этом важно, чтобы имена этих значений совпадали с именами переменных. Поддерживаются следующие типы входных и выходных значений:
- 
String 
- 
Number 
- 
Boolean 
- 
Date 
Новая таблица решений имеет одно входное и одно выходное значение. Вы можете настроить их, установив, имя, имя процессной переменной и тип. Для этого нажмите на название:
 
Например, настройте вход:
 
Выходные значения настраиваются аналогичным образом, но могут иметь дополнительное свойство – предопределенное значения выходов. Оно используется для некоторых Hit Policy.
 
Как правило, таблица решений содержит несколько входов и выходов. Чтобы создать дополнительный, нажмите плюс в заголовке таблицы:
 
Политика Выбора Результата
Таблицы решений могут содержать несколько правил. Если правила пересекаются, т.е. к заданному набору входных значений могут применяться несколько правил применяется политики выбора результата.
Чтобы выбрать политику, нажмите на символ в левом верхнем углу таблицы. Этот символ соответствует начальной букве выбранной политики (Unique, Any, Priority, First, Collect, Output Order, Rule Order).
 
Затем выберите политику из выпадающего списка. Значение по умолчанию — Unique.
 
Политики выбора результата можно разделить на два типа: политики выбора допускающие один результат и политики допускающие несколько результатов.
Политики выбора одного результата
- FIRST
- 
возвращается первый результат согласно порядку применения правил и после этого оценка может быть остановлена. Последнее правило часто является обработчиком. 
- UNIQUE
- 
правила не могут пересекаться, применяется только одно правило. Unique является политикой выбора по умолчанию. 
- ANY
- 
правила могут пересекаться, но в этом случае все они должны давать один и тот же результат. Если выполняется несколько правил, но они возвращают разные результаты, это считается ошибкой, и результат будет пустым и помечен как неудачный. 
- PRIORITY
- 
правила могут пересекаться и возвращать различные значения. Применяется правило с наивысшим приоритетом. Приоритеты указываются в списке, где самые важные результаты идут первыми. Важно, что приоритеты не зависят от порядка правил. 
Политики выбора нескольких результатов
Для политик множественного выбора движок DMN возвращает результат в формате JSON. Он не может быть неявно преобразован в переменные типа String.
- OUTPUT ORDER
- 
применяются все подходящие правила формируя список выходных значений упорядоченный по приоритету от высокого к низкому. Результат будет возвращен в переменную процесса с именем, равным имени таблицы решений. 
- RULE ORDER
- 
применяются все подходящие правила формируя список выходных значений в порядке, в котором они расположены в таблице решений. 
- COLLECT
- 
применяются все подходящие правила формируя список выходных значений в произвольном порядке. К выходным значениям можно применить операторы (‘+’, ‘<’, ‘>’, ‘#’), в этом случае таблица будет иметь один выходной результат. - 
+(sum): результатом таблицы будет сумма всех уникальных выходных значений.
- 
<(min): результатом таблицы будет наименьшее из всех выходных значений.
- 
>(max): результатом таблицы будет наибольшее из всех выходных значений.
- 
#(count): результат таблицы - количество выходных значений.
 
- 
Пример таблицы решений
Таблица решений созданная в Jmix BPM:
 
XML представление:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151101" namespace="http://www.flowable.org/dmn" name="Evaluate discount">
  <decision id="evaluate-discount" name="Evaluate discount">
    <decisionTable hitPolicy="UNIQUE">
      <input label="Level">
        <inputExpression id="input_U9lbk" typeRef="string">
          <text><![CDATA[level]]></text>
        </inputExpression>
      </input>
      <input label="Amount">
        <inputExpression id="input_dNTA2" typeRef="number">
          <text><![CDATA[amount]]></text>
        </inputExpression>
      </input>
      <output id="output_BV1J5" label="Discount" name="discount" typeRef="number">
        <outputValues>
          <text>"10.0","20.0","25.0"</text>
        </outputValues>
      </output>
      <rule>
        <inputEntry id="inputEntry_fBLZR">
          <text><![CDATA[=="SILVER"]]></text>
        </inputEntry>
        <inputEntry id="inputEntry_JtjHs">
          <text><![CDATA[<1000]]></text>
        </inputEntry>
        <outputEntry id="outputEntry_k78f9">
          <text><![CDATA[5.0]]></text>
        </outputEntry>
      </rule>
      <rule>
        <inputEntry id="inputEntry_ZAVMx">
          <text><![CDATA[=="SILVER"]]></text>
        </inputEntry>
        <inputEntry id="inputEntry_VXpLk">
          <text><![CDATA[>=1000]]></text>
        </inputEntry>
        <outputEntry id="outputEntry_1LiOw">
          <text><![CDATA[10.0]]></text>
        </outputEntry>
      </rule>
      <rule>
        <inputEntry id="inputEntry_Emrus">
          <text><![CDATA[=="GOLD"]]></text>
        </inputEntry>
        <inputEntry id="inputEntry_qc4Kw">
          <text><![CDATA[-]]></text>
        </inputEntry>
        <outputEntry id="outputEntry_kvA1d">
          <text><![CDATA[15.0]]></text>
        </outputEntry>
      </rule>
    </decisionTable>
  </decision>
</definitions>