﻿# Сравнение документа с маской

> [HTML Version](antifraud-compare-with-mask.html)

**(antifraud-compare-with-mask-1.png)**Графический элемент становится доступен в дизайнере бизнес-процессов после подключения [Модуля антифрод](antifraud-solution.md). Применяется для работы с документами, [сгенерированными по шаблону](360026936731.md) и затем отредактированными вручную. Позволяет с помощью искусственного интеллекта сравнить отредактированный договор с его исходной версией и отобразить изменения в отдельном файле.

При работе этого блока с помощью ИИ выполняется проверка на неразрешённые правки:

- документ сопоставляется с подготовленной [маской](antifraud-solution.md#templates-and-masks) — файлом, основанным на шаблоне документа, с указанием доступных для редактирования областей. Это позволяет проверить, что пользователь не внёс в текст неразрешённых изменений или дополнений;

- в документе выявляются значения переменных, подставленные во время генерации по шаблону, такие как контрагент, срок действия договора, сумма и т. д. Они сравниваются с данными полей из карточки документа. Это помогает убедиться, что пользователь не изменял сведения в файле вручную. Если редактирование данных напрямую в тексте допустимо, эту проверку можно не учитывать, разрешив изменение значений во входных переменных блока.

Результаты сравнения и проверки на неразрешённые изменения сохраняются в контекстные переменные, и вы сможете использовать их в ходе процесса.

````
начало внимание

````
Действие доступно только для документов в формате **.docx**.

````
конец внимание

````
Сравнение применяется к документу, сформированному на основе данных из элемента приложения. Например, сотрудник вносит данные в приложение **Договоры оказания услуг**. Запускается бизнес-процесс, в ходе которого на основе этих данных генерируется файл договора. Затем сотрудник вручную вносит в файл дополнительные данные. Перед согласованием документ сопоставляется с исходной версией и маской. Результат сравнения отображается в задаче согласующего. Он может не только просмотреть финальную версию, но и открыть файл сравнения, чтобы увидеть все внесённые правки.

Для корректной работы** **перед настройкой блока **Сравнение документа с маской** нужно:

- [создать входные и выходные переменные](#add-variables), которые указываются в настройках блока;

- [использовать в процессе другие графические элементы](#place-activities), чтобы подготовить данные для проверки документа на сервере ИИ и учесть обработку ошибок.

## Добавить входные и выходные переменные

Для настройки блока нужно заранее создать определённый набор свойств. Они указываются в настройках блока в полях, которые подразделяются на:

- **входные атрибуты** — в них передаются свойства, содержащие данные для выполнения сравнения;

- **выходные атрибуты** — сопоставляются со свойствами, в которых сохраняется результат работы блока.

Для упрощения настройки рекомендуем использовать названия, совпадающие с атрибутами из настроек блока.

1. **Добавление входных переменных.**

Добавьте в [контекст бизнес-процесса](process_context.md) переменные:

- **Маска** (тип [Файлы](360009707032.md#file_type)) — файл маски, соответствующей шаблону, по которому сгенерирован документ. Участвует в сравнении и используется для проверки документа на неразрешённые изменения;

- **Отредактированный документ **(тип **Файлы**) — отредактированный документ для сравнения в формате **.docx**; 

- **Исходный документ** (тип **Файлы**) — исходная версия документа, сгенерированная по шаблону, в формате **.docx**. С ней сопоставляется отредактированный документ;

- **Переменные** (типа [Строка](360009707032.md#string)) — данные документа, сериализованные в JSON. Свойство используется на сервере ИИ, чтобы проверить данные в файле. Они сравниваются со сведениями из карточки документа, на основе которых сгенерирована исходная версия. Создание строки в ходе процесса описано в разделе [«Сформировать JSON-строку для проверки данных документа»](#form-json-string);

- **Разрешены ли изменения переменных **(тип [Выбор «да/нет»](360009707032.md#yes_no)) —  при работе блока выполняется проверка данных, подставленных в документ при генерации. Они сопоставляются со сведениями из карточки документа. Это позволяет проверить, что при редактировании файла вручную пользователь не вносил изменения в значения переменных.

Вы можете не учитывать эту проверку при определении неразрешённых изменений, передав в данном свойстве значение **Да**. Тогда будет проверяться только соответствие документа маске.

Обратите внимание, входные переменные нужно заполнить данными до того, как ход процесса дойдёт до шага **Сравнение документа с маской**. Это делается с помощью других графических элементов. Например, файл маски можно записать из карточки документа с помощью блока [Присваивание](360020300571.md), а разрешить или запретить изменения в переменных может сотрудник в рамках блока [Задача](360012495611.md).  

2. **Добавление выходных переменных.**

Свойства для сопоставления с выходными атрибутами добавляются:

- в контекст бизнес-процесса — если результаты работы блока будут отображаться на формах задач и использоваться для определения дальнейших шагов процесса;

- в [контекст приложения](360028941112.md) — если данные нужно сразу записать в карточку документа. Чтобы свойства нужного приложения были доступны при сопоставлении атрибутов, в настройки процесса добавляется переменная типа **Приложение**, ссылающаяся на него.

Создайте следующие переменные, в которые запишется информация:

- **Документ результата сравнения** (тип **Файлы**) — файл обработанного документа, в котором добавленный текст выделен зелёным цветом, удалённый — красным, изменения в значениях переменных — синим;

- **Ответ сервера AI **(тип **Строка**) — текст ответа, полученного с сервера ИИ. Его может использовать администратор для анализа ошибок, возникших при обработке документа на сервере. Например, чтобы узнать, какая проблема возникла при распознавании значений в JSON-строке с данными документа;

- **Неразрешённые изменения **(типа **Выбор «да/нет»**) — наличие неразрешённых правок тексте документа;

- **Статус запроса на сервер **(тип [Число](360009707032.md#number)) — код состояния HTTP, полученный с сервера ИИ. Переменную можно использовать для определения следующего шага процесса в зависимости от успешности сравнения. Подробнее читайте в разделе [«Настроить обработку ошибок»](#error-handling). Также на основе кода администратор может анализировать возникшие ошибки; 

- **Отредактированный документ без подсветки **(тип **Файлы**) — изначальный документ, загруженный для сравнения.

## Настроить обязательные шаги в процессе

Разместите блок **Сравнение документа с маской** в том месте на схеме процесса, где нужно сформировать файл с указанием изменений.

Чтобы блок работал корректно, в ходе процесса нужно подготовить JSON-строку для проверки документа на сервере ИИ и настроить обработку ошибок. Для этого применяются другие графические элементы. Рассмотрим их использование.

**(antifraud-compare-with-mask-2.png)**

### Сформировать JSON-строку для проверки данных документа

При выполнении сравнения на сервере ИИ сопоставляются значения переменных в файле и данные элемента приложения, по которым он сгенерирован. Таким образом документ проверяется на изменения. Для этого используется JSON-строка со свойствами из карточки документа и их значениями. Она передаётся во входных переменных блока **Сравнение документа с маской**, поэтому её нужно сформировать до шага сравнения.

Для этого разместите на схеме графический элемент [Скрипт](360027203731.md), представьте свойства приложения в виде объекта \[OBJECT\] и переведите их в JSON. Затем запишите результат в переменную процесса.

Пример скрипта для преобразования переменных приложения в JSON-строку

````
async function mapVariables(): Promise<void> \{  
    // Получение свойств приложения, хранящегося в переменной процесса с кодом \`application\`  
    const applicationData = (await Context.data.application\!.fetch()).data;  
  
    // Создание объекта \`Map\` из всех свойств приложения, кроме системных, так как их не нужно проверять  
    // Системные свойства фильтруются по '\_\_' в начале названия  
    let variables = new Map(  
        Object.keys(applicationData)  
        .filter(key => \!key.startsWith('\_\_'))  
        .map(key => \[key, applicationData\[key\]\])  
    );  
  
    // Удаление ненужных свойств — маски и типа документа  
    variables.delete('mask');  
    variables.delete('contractType');  
  
    // Преобразование в строки тех значений переменных,  
    // для которых нужна особая логика,  
    // например, форматирование значений даты начала и окончания договора  
    variables.set('StartDate', applicationData.StartDate?.format('DD.MM.YYYY'));  
    variables.set('EndDate', applicationData.EndDate?.format('DD.MM.YYYY'));  
  
    // Преобразование объекта \`Map\` в объект со строковыми значениями  
    const variablesObject: \{ \[key: string\]: string \} = \{\};  
    \[...variables\].sort((a, b) => a\[0\].localeCompare(b\[0\]))  
    .forEach(variable => \{  
        variablesObject\[variable\[0\]\] = variable\[1\]?.toString();  
    \});  
      
    // Преобразование объекта в JSON и запись строки в переменную \`variables\` из контекста процесса  
    Context.data.variables = JSON.stringify(variablesObject);  
\}
````

### ````
Настроить обработку ошибок

1. **Ошибки в работе блока**. Во время работы блока могут возникать критические ошибки, к примеру, если **Модуль антифрод** оказывается отключён. Такие случаи обрабатываются с помощью дополнительного исходящего перехода из блока **Сравнение документа с маской**. Например, при его активации процесс может завершаться. Добавьте переход на схему, чтобы позже при настройке блока указать его на вкладке **Обработка ошибок**.

2. **Ошибки на сервере ИИ**. Во время сравнения также могут возникать ошибки на стороне сервера. Нужно предусмотреть дальнейшие действия, которые будут выполняться при неуспешной обработке документа. Например, добавить задачу, в которой пользователь может запустить сравнение повторно.

Чтобы задать точку, в которой процесс может продолжиться по разным веткам, используется [шлюз](360012495911.md). 

**(antifraud-compare-with-mask-3.png)**

В настройках шлюза в качестве варианта по умолчанию укажите переход для обработки ошибок сервера. Для другого перехода задайте условие. Чтобы определить успешность обработки документа, можно использовать код статуса HTTP, который при работе блока **Сравнение документа с маской** записывается в специальную переменную. Если статус ответа с сервера равен **200**, продолжится основное течение процесса.

**(antifraud-compare-with-mask-4.png)**

## Настройка блока

После выполнения предварительных действий дважды нажмите на блок **Сравнение документа с маской** на схеме процесса и задайте настройки на трёх вкладках: **Основное**, **Входные и выходные атрибуты**, **Обработка ошибок**.

### Вкладка «Основное»

Заполните основные настройки блока:

**(antifraud-compare-with-mask-5.png)**

- **Название** — введите название блока, которое будет отображаться на схеме процесса;

- **Название задачи **— блок **Сравнение документа с маской** выполняется автоматически без назначения задачи на пользователя. Поэтому настраивать формирование названия задачи не требуется, и поле можно оставить пустым;

- **Присвоить выходные атрибуты в **— укажите, куда будет записываться результат исполнения блока:

	- **контекст процесса **— отметьте эту опцию, если вы создали переменные, в которые запишется результат работы блока, в контексте процесса;

	- **приложение **— выберите опцию, а затем в поле **Переменная\*** укажите приложение, добавленное в контекст процесса, в поля которого будет записан результат работы блока.

### Вкладка «Входные и выходные атрибуты»

На этой вкладке заранее созданные свойства связываются с настройками блока, которые делятся на:

- **входные атрибуты** — в них передаются свойства, хранящие данные для выполнения сравнения. Их нужно заполнить значениями до того, как процесс дойдёт до блока **Сравнение документа с маской**;

- **выходные атрибуты** — сопоставляются со свойствами, в которые записывается результат работы блока.

Описание свойств и их типы приведены в разделе [«Добавить входные и выходные переменные»](#add-variables).

Сопоставление может выглядеть так:

**(antifraud-compare-with-mask-6.png)**

### Вкладка «Обработка ошибок»

Определите, по какой ветке направится ход бизнес-процесса при возникновении ошибки в работе блока, например, если модуль отключён. Также вы можете настроить оповещение пользователей об ошибке.

**(antifraud-compare-with-mask-7.png)**

- **Оповещение** — включите опцию и укажите пользователей, которым будет отправляться оповещение об ошибке в процессе. Вы можете выбрать пользователя, [группу](360007146071.md) пользователей, [элемент оргструктуры](360003861992.md), а также указать [контекстную переменную](process_context.md), например инициатора процесса;

- **Прервать** — для корректной работы блока необходимо включить опцию, а затем в поле **Переход** указать, по какой ветке направится процесс в случае ошибки. Указанный в этих настройках переход будет отмечен на схеме процесса значком **(error-connector-icon.png).**

После завершения настройки нажмите кнопку **Сохранить**.