В платформе есть метод
ЗаблокироватьДанныеДляРедактирования()
Он позволяет дать базе понять, что вы как-то собираетесь изменять данные. И если другой сеанс попытается сделать тоже самое с переданными в метод данными, то получит ошибку и поймёт, что они заблокированы.На вход данный метод получает параметры:
➖
Ключ - Ссылка на объект, который должен быть заблокирован, или ключ записи независимого регистра сведений, которая должна быть заблокирована.➖
ВерсияДанных - Версия блокируемого объекта в формате Base64➖
ИдентификаторФормы - Уникальный идентификатор формыНо интересные нюансы обнаружил ansverrr :
➖ Идентификатор не обязан быть привязан к форме
➖ В качестве ключа данных можно передавать несуществующие данные или даже просто пустую ссылку
В совокупности это позволяет использовать метод в качестве этакой пародии на межсеансовый lock()
Например, наложив блокировку на пустую ссылку определенного справочника в одном фоновом задании, мы не мешаем работе системы в целом. Но лишь позволяем какому-то другому сеансу так же программно проверить, а заблокирована ли эта пустая ссылка. Что будет знаком, что действие ещё выполняется.
ЗаблокироватьДанныеДляРедактирования(Справочники.Валюты.ПустаяСсылка(), , КлючевойИдентификатор);Ещё такой трюк можно использовать, если нужно запретить открывать какую-то обработку в двух сеансах одновременно. При открытии пытаться заблокировать пустую ссылку и если будет происходить исключение, то сообщать из него информацию о блокирующем сеансе.
Блокировать не обязательно пустую ссылку. Можно и заведомо несуществующую. Например, с идентификатором
99999999-9999-9999-9999-999999999999 или 01234567-8901-2345-6789-012345678901
Можно придумать ещё ряд способов применения этой недокументированной возможности, но тут главное понимать, что не нужно использовать это на практике.Все недокументированные возможности и подобного рода костыли - это потенциальная бомба, которая может рвануть в самый неподходящий момент.
Но это не мешает нам проводить с ними эксперименты забавы ради 😁