Имя: Пароль:
1C
1С v8
8.1, Управляемая блокировка на независимый регистр сведений - срок жизни
,
0 detec
 
23.04.12
17:42
Приветствую!

Поделитесь опытом: делал ли кто-то управляемую блокировку на сабдж на время открытия некоторой формы? Мне нужно при открытии формы полностью заблокировать регистр сведений, а при закрытии формы - разблокировать. Использую исключительную блокировку.

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


мМояБлокировка = ПопыткаУстановитьИсключительнуюБлокировку();
   Если НЕ мМояБлокировка Тогда
       ОбщегоНазначения.СообщитьИнформацию("Регистр ""ГраницыЗапретаИзмененияДанных"" заблокирован другим пользователем!");
       ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Действие.Доступность =
           НЕ мМояБлокировка;        
           
   КонецЕсли;

Функция ПопыткаУстановитьИсключительнуюБлокировку()
       мБлокировкаРС = Новый БлокировкаДанных;
       ЭлементБлокировки = мБлокировкаРС.Добавить("РегистрСведений.ГраницыЗапретаИзмененияДанных");
       // Исключительная
       ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
       МассивОрганизаций = ВернутьМассивОрганизацийВЗапретеРедактирования();

       Для н = 0 По МассивОрганизаций.Количество() - 1 Цикл
           Организация = МассивОрганизаций[н];
           ЭлементБлокировки.УстановитьЗначение("Организация"
           , Организация);
       КонецЦикла;    
       мБлокировкаРС.Заблокировать();

       Возврат Истина; // успешно получилось исключительно заблокировать

КонецФункции
1 detec
 
23.04.12
17:45
Я вынес код по установке блокировки из процедуры ПередОткртытием в общий текст модуля формы; мБлокировкаРС сделал переменной модуля, но всё равно не работает: у конкурирующего сеанса успешно отрабатывает код по установке исключительной блокировки.
2 dimaldinho
 
23.04.12
17:52
:) А с помощью какого метода собираешься "разблокировать"?
3 ll13
 
23.04.12
17:55
А транзакция где ?
Иль ты думаешь, что транзакционные блокировки будут работать вне транзакции ?
4 detec
 
23.04.12
17:57
(1) мБлокировкаРС = Неопределено;
5 detec
 
23.04.12
17:57
(3) Сейчас попробую выставить явную транзакцию.
6 detec
 
23.04.12
18:00
(3)

Такой код тоже не работает:

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
мМояБлокировка = ПопыткаУстановитьИсключительнуюБлокировку();
   Если НЕ мМояБлокировка Тогда
       ОбщегоНазначения.СообщитьИнформацию("Регистр ""ГраницыЗапретаИзмененияДанных"" заблокирован другим пользователем!");
       ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Действие.Доступность =
           НЕ мМояБлокировка;        
           
   КонецЕсли;
7 detec
 
23.04.12
18:02
Вот только выставил отладчик на последней строке из (6) - сразу конкурирующий сеанс увидел ошибку.