Пессимистическая блокировка объекта (документа, справочника и т.д)
Иногда надо блокировать объект, например элемент справочника, чтобы другой пользователь не смог внести параллельно данные в его свойства. Для этого можно использовать метод объекта Заблокировать(), например СправочникОбъект.Заблокировать(). Метод не доступен на клиенте.
Если объект уже заблокирован, то при попытке заблокировать выйдет ошибка с исключением.
Проверить, заблокирован ли объект можно с помощью метода объекта Заблокирован() (булево), например
Если НоменклатураОбъект.Заблокирован() Тогда
НоменклатураОбъект.Разблокировать();
КонецЕсли;
Для разблокировки соответственно надо использовать метод Разблокировать().
В форме клиентского приложения заблокировать объект можно с помощью метода ЗаблокироватьДанныеДляРедактирования(<Ключ>, <ВерсияДанных>, <ИдентификаторФормы>), где:
Ключ - ссылка
ВерсияДанных - строка. Необязательный.
ИдентификаторФормы - уникальный идентификатор формы в рамках которой заблокирован объект. Может Быть не указан Если параметр не указан, то блокировка устанавливается на ограниченное время и может быть снята:
- с помощью метода РазблокироватьДанныеДляРедактирования() без указания идентификатора формы;
- при окончании транзакции, если блокировка установлена в транзакции;
- при окончании работы встроенного языка (для режимов запуска "Тонкий клиент" и "Веб-клиент"; при возврате управления с сервера);
- при завершении сеанса.
Если ИдентификаторФормы указан, то блокировка автоматически снимается после закрытия формы или с помощью метода РазблокироватьДанныеДляРедактирования(<Ключ>, <ИдентификаторФормы>), где ИдентификаторФормы соответствует значению вызванному при блокировке.
Вызывает исключение, если объект уже заблокирован, в том числе и методом Заблокировать().
Не доступен на клиенте.
Пример:
&НаСервере
Процедура ЗаблокироватьАбонента(Абонент)
ТолькоПросмотр = ФормаТолькоПросмотр;
Попытка
ЗаблокироватьДанныеДляРедактирования(ТекущийАбонент.Ссылка,,ЭтаФорма.УникальныйИдентификатор);
ЗаблокированныйАбонент = ТекущийАбонент.Ссылка;
Исключение
// Если попали в исключение, то значит этот абонент уже открыт у какого то пользователя
// выведем сообщение о блокировке и откроем пустого абонента
НашеОписаниеОшибки = ОписаниеОшибки();
ОбрезанноеСообщение = Прав(НашеОписаниеОшибки, СтрДлина(НашеОписаниеОшибки) - Найти(НашеОписаниеОшибки, "Объект уже заблокирован") + 1);
ОбрезанноеСообщение = СтрЗаменить(ОбрезанноеСообщение, Символы.Пс, " ");
ОбрезанноеСообщение = СтрЗаменить(ОбрезанноеСообщение, "Объект уже заблокирован", "Абонент " + Абонент + " заблокирован");
ОбрезанноеСообщение = ОбрезанноеСообщение + Символы.ПС + "Абонент открыт только на просмотр!";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОбрезанноеСообщение, , , , УникальныйИдентификатор);
ТолькоПросмотр = Истина;
КонецПопытки;
КонецПроцедуры
В результате выполнения получим ошибку: "Абонент Иванов Иван Иванович заблокирован: компьютер: Мой-компьютер, пользователь: Администратор, сеанс: 422, начат: 12.09.2022 в 16:15:27, приложение: Тонкий клиент
Абонент открыт только на просмотр!"
Оптимистическая блокировка объекта.
Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.
Фактически, оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. Эта проверка построена на анализе номера версии объекта, хранящейся в базе данных и номера версии, помещенной в память компьютера в момент считывания данных из информационной базы. Если при записи объекта номера его версий отличаются, то будет выдано предупреждение о том, что версия объекта изменилась или он был удален, то есть сработает оптимистическая блокировка.
|