Пост

1Сный LOCK() в коде

Используем межсеансовый lock() в 1С

В платформе есть метод ЗаблокироватьДанныеДляРедактирования() Он позволяет дать базе понять, что вы как-то собираетесь изменять данные. И если другой сеанс попытается сделать тоже самое с переданными в метод данными, то получит ошибку и поймёт, что они заблокированы.

На вход данный метод получает параметры:

  • Ключ - Ссылка на объект, который должен быть заблокирован, или ключ записи независимого регистра сведений, которая должна быть заблокирована.
  • ВерсияДанных - Версия блокируемого объекта в формате Base64
  • ИдентификаторФормы - Уникальный идентификатор формы

Но интересные нюансы обнаружил ansverrr:

  • Идентификатор не обязан быть привязан к форме
  • В качестве ключа данных можно передавать несуществующие данные или даже просто пустую ссылку

В совокупности это позволяет использовать метод в качестве этакой пародии на межсеансовый lock()

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

1
ЗаблокироватьДанныеДляРедактирования(Справочники.Валюты.ПустаяСсылка(), , КлючевойИдентификатор);

Ещё такой трюк можно использовать, если нужно запретить открывать какую-то обработку в двух сеансах одновременно. При открытии пытаться заблокировать пустую ссылку и если будет происходить исключение, то сообщать из него информацию о блокирующем сеансе.

Блокировать не обязательно пустую ссылку. Можно и заведомо несуществующую. Например, с идентификатором 99999999-9999-9999-9999-999999999999 или 01234567-8901-2345-6789-012345678901

Можно придумать ещё ряд способов применения этой недокументированной возможности, но тут главное понимать, что не нужно использовать это на практике. Все недокументированные возможности и подобного рода костыли - это потенциальная бомба, которая может рвануть в самый неподходящий момент.

Но это не мешает нам проводить с ними эксперименты забавы ради 😁

Авторский пост защищен лицензией CC BY 4.0 .