Блокировка и снятие блокировки

Чтобы предупредить возникновение конфликтных ситуаций, вытекающих из одновременной работы нескольких пользователей с одним объектом, платформа Docsvision предлагает использовать механизм блокировок, который защищает отдельный объект (карточку или строку) от изменений из сессий других пользователей, оставляя его доступным на чтение.

Система предлагает два варианта блокировки:
  • Временная, ограниченная сроком существования пользовательской сессии, из которой блокировка была установлена. Такая блокировка снимается автоматически после завершения пользовательской сессии, если объект не был освобожден пользователем самостоятельно.

  • Постоянная, действующая во время существования пользовательской сессии, из которой блокировка установлена, а также после её завершения. Данная блокировка может быть снята только явно — тем, кто её установил, либо администратором системы.

Базовый API

Базовый API предоставляет методы для установки блокировки на карточку, строку и файл.

На карточку может быть установлена как временная, так и постоянная блокировка:
CardData cardData = userSession.CardManager.GetCardData(cardId); (1)

card.PlaceLock(); (2)

card.PlaceLock(true); (3)
1 Получаем карточку.
2 Устанавливаем временную блокировку.
3 Устанавливаем постоянную блокировку.
Аналогичным образом устанавливается временна или постоянная блокировка на строку секции:
SectionData section = card.Sections[sectionId] (1)

section.FirstRow.PlaceLock() (2)
1 Получаем секцию, содержащую блокируемую строку.
2 Для примера, устанавливаем временную блокировку на первую строку секции.
Таким же образом работает блокировка файлов (не путать с карточками файла с версиями и файлами документов):
FileData fileData = userSession.FileManager.GetFile(fileId); (1)

fileData.PlaceLock(true); (2)
1 Получаем файл.
2 Устанавливаем постоянную блокировку.

Помимо методов блокировки, классы карточек (CardData), строк (RowData) и файлов (FileData) содержат методы снятия блокировки, определяемые интерфейсом ILockable:

  • RemoveLock — снимает блокировку с объекта, установленную в собственной сессии.

  • ForceUnlock — принудительно снимает блокировку, в т.ч. установленную другим пользователем — необходимы административные права.

Также интерфейс ILockable определяет несколько свойств:
  • LockStatus — состояние блокировки.

  • LockOwner — учетная запись сотрудника, выполнившего блокировку.

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

if (cardData.LockStatus = LockStatus.Free) (1)
{

 cardData.PlaceLock(); (2)
}else
{
 MessageBox.Show("Карточка заблокирована пользователем " + cardData.LockOwner);
}
1 Проверяем наличие блокировки у карточки.

cardData — карточка, которая должна быть заблокирована.

2 Установка временной блокировки.

Помимо методов, которые предлагают классы карточек, строк и файлов, базовый API предоставляет специальный объект для работы с блокировками — менеджер блокировок.

Менеджер блокировок можно получить из сессии пользователя:
LockManager lockManager = userSession.LockManager;
Менеджер блокировок предлагает два метода:
  • GetLockableObject — возвращает интерфейс ILockable для карточки с определённым идентификатором.

  • GetLockedObjects — предоставляет заблокированные объекты определённого типа, с возможностью получения объектов, заблокированных только текущим пользователем.

Объектная модель

API данного уровня предоставляет две точки доступа к механизму блокировки:
  • Методы контекста объектов:

Заблокировать карточку, используя методы контекста объектов, можно следующим образом:
BaseCard card = objectContext.GetObject<BaseCard>(cardId); (1)

objectContext.LockObject(card, true); (2)
1 Получаем карточку (или строку).
2 Устанавливаем постоянную блокировку.
Таким же образом блокируется строка карточки:
BaseCardSectionRow row = objectContext.GetObject<BaseCardSectionRow>(rowId); (1)
objectContext.LockObject(row, true); (2)
1 rowId — идентификатор блокируемой строки.
2 Методы сервиса для работы с блокировками — ILockService:
  • LockObject — устанавливает на объект временную блокировку.

  • UnlockObject — снимает с объекта временную блокировку.

Далее приведён пример, в котором документ (карточка типа Документ) блокируется для изменения, после чего блокировка снимается.

ILockService lockService = objectContext.GetService<ILockService>(); (1)

Document document = objectContext.GetObject<Document>(cardId); (2)

if (!(lockService.IsObjectLockedByAnotherUser(document)) (3)
{
 lockService.LockObject(document); (4)

 document.MainInfo.Name = "Новое название документа"; (5)
 objectContext.SaveObject(document);

 lockService.UnlockObject(document); (6)
}
1 Получение сервиса для работы с блокировками.
2 Получение изменяемого документа.
3 Проверяем, что объект не заблокирован.
4 Блокируем документ для изменения.
5 Вносим изменение. В качестве примера, изменяется название документа.

Блокировка и снятие блокировки со строк выполняется аналогично.