Объектные блокировки в 1С 8.3

Курс

Объектные блокировки

Объектные блокировки применяются для блокирования объектных данных на уровне платформы 1С. Объектные блокировки используются только для объектных данных (справочники, документы и т.п.) и не используются для необъектных данных (регистры, последовательность и т.п.). Исключение — независимый регистр сведений.

Объектные блокировки ни как не связаны ни с транзакциями, ни с СУБД. Они блокируют только один объект, для того чтобы сразу несколько пользователей не могли изменить его одновременно. При этом объектная блокировка защищает только от других объектных блокировок.

Объектные блокировки бывают двух видов:

  • Пессимистические
  • Оптимистические

Пессимистическая блокировка

Через расширение формы

Пессимистическая блокировка устанавливается расширением формы при начале редактирования объекта в форме. Например, откроем форму существующего товара и изменим артикул. Оставим форму открытой, в наименовании формы должна появиться звездочка, это означает, что объект был изменен:

Пессимистическая блокировка

Запустим второй сеанс, откроем форму этого же товара и попробуем что-то изменить. Изменить не получится и будет выведено сообщение «Не удалось начать редактирование»:

Не удалось начать редактирование

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

Пессимистическая блокировка устанавливается именно при начале редактирования объекта в форме. Если просто открыть форму, то пессимистическая блокировка не будет установлена.

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

ЗаблокироватьДанныеФормыДляРедактирования

Пессимистическую блокировку можно установить программно. Для этого используется метод ЗаблокироватьДанныеФормыДляРедактирования. Его нужно вызывать внутри модуля той формы, которую хотим заблокировать. Доступен как на клиенте, так и на сервере. Для примера добавим на форму команду со следующим кодом:

Откроем форму в первом сеансе, редактировать ничего не будем и нажмем на кнопку Команда1. В результате будет программно установлена пессимистическая блокировка. Во втором сеансе нельзя будет начать редактирование объекта.

Блокировка будет автоматически снята при закрытии формы, но можно снять ее программно методом РазблокироватьДанныеФормыДляРедактирования:

При этом данный метод может снять только ту блокировку, которая была установлена в этом сеансе. Если в первом сеансе установить блокировку, то во втором сеансе не получится методом РазблокироватьДанныеФормыДляРедактирования снять блокировку другого сеанса.

Данный метод может снять блокировку, которая была автоматически установлена расширением формы при начале редактирования объекта.

Для того чтобы программно проверить установлена ли пессимистическая блокировка нужно вызвать метод ЗаблокироватьДанныеФормыДляРедактирования, обернув его в конструкцию Попытка — Исключение. Если блокировка уже установлена, то будет вызвано исключение:

Установка повторной блокировки в этом же сеансе не будет вызывать исключение.

ЗаблокироватьДанныеДляРедактирования

С помощью метода ЗаблокироватьДанныеДляРедактирования можно установить пессимистическую блокировку не из формы объекта. Это может понадобиться при программном изменении объекта, чтобы проверить не редактирует ли его сейчас пользователь. Данный метод доступен только на сервере.

Блокировку можно снять методом РазблокироватьДанныеДляРедактирования. Если его не вызвать, то блокировка будет автоматически снята после окончания выполнения кода на встроенном языке или после возврата управления с сервера на клиента. В данном случае можно было не вызывать данный метод. Если блокировка была установлена в транзакции, то она автоматически будет снята при окончании транзакции.

Если нужно установить пессимистическую блокировку на все время жизни формы, то третьим параметром в метод ЗаблокироватьДанныеДляРедактирования нужно передать уникальный идентификатор формы. Снимать блокировку нужно методом РазблокироватьДанныеДляРедактирования, тоже с указанием уникального идентификатора формы.

В этом случае после установки блокировки в других сеансах нельзя будет интерактивно изменить объект через его форму.

Для снятия блокировки нужно вызвать метод РазблокироватьДанныеДляРедактирования и вторым параметром передать идентификатор формы:

Заблокировать и Разблокировать

У программного объекта есть методы Заблокировать и Разблокировать с помощью которых тоже можно проверить не редактируется ли сейчас кем-то объект. Можно сказать, что это аналог методов ЗаблокироватьДанныеФормыДляРедактирования и РазблокироватьДанныеДляРедактирования, когда параметром передается только ссылка:

Можно даже их смешивать:

Также у объекта есть метод Заблокирован, который вернет Истина, если объект уже был заблокирован методом Заблокировать. При этом если объект был заблокирован через расширение формы при интерактивном редактировании или через метод ЗаблокироватьДанныеДляРедактирования, то метод Заблокирован вернет Ложь:

Оптимистическая блокировка

Если сейчас открыть форму какого-нибудь товара и начать редактировать его, то будет установлена пессимистическая блокировка. Несмотря на установленную блокировку можно программно изменить этот объект, если перед изменением не попытаться заблокировать его:

Если сейчас попробовать записать измененный объект из формы, то будет выброшено исключение «Данные были изменены или удалены другим пользователем»:

Данные были изменены или удалены другим пользователем

Это сработала оптимистическая блокировка.

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

Когда мы открыли форму объекта все реквизиты объекта были прочитаны в оперативную память, в том числе реквизит ВерсияДанных. Допустим там было 1. Затем мы программно изменили наименование этого объекта и записали его. При записи версия данных изменилась на 2. При записи объекта из формы выполняется проверка совпадает ли версия данных в оперативной памяти и в базе данных. В оперативной памяти у нас 1, а в базе данных 2. Не совпадают — значит запись не возможна, выбрасывается исключение «Данные были изменены или удалены другим пользователем».

То есть оптимистическая блокировка — это проверка соответствия версии данных в оперативной памяти и версии в базе данных, которая выполняется перед записью объекта. Она гарантирует что мы случайно не затрем изменения другого пользователя или текущего пользователя, но через другой программный объект.

Версия данных также читается при программном получении объекта:

При записи первого объекта будет выполнена проверка соответствия версии данных и так как она не совпадает, будет выброшено исключение: «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»:

Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!

Почему такие названия?

Оптимистическая блокировка считает, что параллельные транзакции не будут мешать друг другу, соответственно можно не накладывать блокировки. Но перед записью выполняется проверка, чтобы не затереть чужие изменения. То есть данная блокировка ведет себя как оптимист, верит что одновременно не будет изменений одного объекта.

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


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

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