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