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

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

Если хотите начать практику с этого урока, то вам необходимо развернуть учебный проект по инструкции в статье Разворачивание проекта.

При разворачивании проекта используйте backup базы данных, который можете найти в архиве из раздела Ответы прошлого урока. Скопируйте папки Forms, Workflow и Patterns в папку с развернутым проектом, например, в папку D:\WT\Projects\Template\Projects\1. Template.

Инструкция по подключению шаблонов находится по ссылке.

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

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

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

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

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

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

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

  • Атрибут Lock у тэга <Commands>. Например, такой есть у объекта Button и у Execution.

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

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

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

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

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

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

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

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

TemplateAccountEdit.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>

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

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

TemplateAccountEdit.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>

Самостоятельно

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

Ответы

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

Last updated