# Урок 16. Режим блокировки форм (Lock)

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

{% hint style="success" %}
Если хотите начать практику с этого урока, то вам необходимо развернуть учебный проект по инструкции в статье [Разворачивание проекта](https://wfsys.gitbook.io/workflow-technology/setting-up-dev-environment/manual-deployment-project).

При разворачивании проекта используйте backup базы данных, который можете найти в архиве из раздела [Ответы](https://wfsys.gitbook.io/wt-practice/lesson_load_mode#answer) прошлого урока. Скопируйте папки *Forms*, *Workflow* и *Patterns* в папку с развернутым проектом, например, в папку *D:\WT\Projects\Template\Projects\1. Template*.

Инструкция по подключению шаблонов находится по [ссылке](https://wfsys.gitbook.io/wt-practice/main/lesson_list_form#podklyuchenie-shablonov-k-proektu).
{% endhint %}

## Режим блокировки форм (Lock)

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

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

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

Чтобы таких ситуаций не возникало, необходимо блокировать графический интерфейс формы. Первый способ: создать переменную Variable для определения тэгов `<Enabled>` у объектов формы и менять ее значение в начале последовательности команд и по ее завершению. Второй способ: использовать режим блокировки формы.

Чтобы перевести форму в режим блокировки необходимо использовать один из доступных видов Lock:

* Вложенный тэг [`<Lock>`](https://wfsys.gitbook.io/workflow-forms-syntax/workflow_forms/commands#lock) у команды;
* Атрибут `Lock` у тэга `<Commands>`.  Например, такой есть у объекта [Button](https://wfsys.gitbook.io/workflow-forms-syntax/workflow_forms/objects/button#commands) и у [Execution](https://wfsys.gitbook.io/workflow-forms-syntax/workflow_forms/executions#commands).
* Атрибут `Lock` у тэгов [`<If>`, `<Then>` и `<Else>`](https://wfsys.gitbook.io/workflow-forms-syntax/workflow_forms/values/if).

Режим блокировки формы заключается в том, что при запуске команды с тэгом `<Lock>` или последовательности команд с атрибутом `Lock` форма переводится в особый режим. В этом режиме пользователь может просматривать содержимое полей формы, но любой клик по форме вызовет отображение панели блокировки:

<figure><img src="https://3019442075-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_eBlWEU4C3o2GVEAAr%2Fuploads%2FcwiMrZpXAPy7yROuNW3O%2Fimage.png?alt=media&#x26;token=bf8138f1-7e0f-4fda-92f4-d3451ebdf917" alt=""><figcaption></figcaption></figure>

### Вложенный тэг `<Lock>` у команды

Его следует использовать во всех командах типа SaveCommand.

Например, в карточке заказа (TemplateOrderEdit.xml):

{% code title="TemplateOrderEdit.xml" %}

```xml
<Command Name="OrderUpdateSaveCommand" Type="SaveCommand" Assembly="Commands">
  <Lock Value="True" />
  <DataConnections>
    <DataConnection Name="OrderUpdateSetDataConnection" />
  </DataConnections>
</Command>
```

{% endcode %}

### Атрибут `Lock` у тэга `<Commands>`

На форме карточки счета (TemplateAccountEdit.xml), где сохранение происходит двумя командами (AccountUpdateSaveCommand и AccountInsertSaveCommand), будет удобнее использовать атрибут `Lock` у тэга `<Commands>` внутри команды SaveSequentialCommand:

{% code title="TemplateAccountEdit.xml" %}

```xml
<Command Name="SaveSequentialCommand" Type="SequentialCommand" Assembly="Commands">
  <Commands Lock="True">
    <If>
      <When>
        <Parameter Name="Edit" />
      </When>
      <Then>
        <Command Name="AccountUpdateSaveCommand" />
      </Then>
      <Else>
        <Command Name="AccountInsertSaveCommand" />
        <Command Name="AccountIdValueSetCommand" />
      </Else>
    </If>
    <Command Name="UpdatedTrueValueSetCommand" />
    <Command Name="FormCloseCommand" />
  </Commands>
</Command>
```

{% endcode %}

### Атрибут `Lock` у тэгов `<If>`, `<Then>` и `<Else>`

На форме карточки счета (TemplateAccountEdit.xml) в команде SaveSequentialCommand можно использовать и этот вариант, так как основная логика находится в блоке `<If>`:

{% code title="TemplateAccountEdit.xml" %}

```xml
<Command Name="SaveSequentialCommand" Type="SequentialCommand" Assembly="Commands">
  <Commands>
    <If Lock="True">
      <When>
        <Parameter Name="Edit" />
      </When>
      <Then>
        <Command Name="AccountUpdateSaveCommand" />
      </Then>
      <Else>
        <Command Name="AccountInsertSaveCommand" />
        <Command Name="AccountIdValueSetCommand" />
      </Else>
    </If>
    <Command Name="UpdatedTrueValueSetCommand" />
    <Command Name="FormCloseCommand" />
  </Commands>
</Command>
```

{% endcode %}

## Самостоятельно <a href="#self-work" id="self-work"></a>

Проставьте на всех формах, где это необходимо, настройку Lock.

## Ответы <a href="#answer" id="answer"></a>

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

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-hidden data-type="content-ref"></th></tr></thead><tbody><tr><td>lesson16-answer.zip</td><td><a href="https://wfsys.ru/download/wt_practice_desktop_answers/lesson16-answer.zip">https://wfsys.ru/download/wt_practice_desktop_answers/lesson16-answer.zip</a></td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wfsys.gitbook.io/wt-practice/loading_data/lesson_lock.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
