Вход | Регистрация
 

Почему не срабатывает исключительная блокировка?

Почему не срабатывает исключительная блокировка?
Я
   DTX 4th
 
01.10.20 - 15:09
В последней теме до этого дошел, но хорошим правилом является "один вопрос - одна тему", поэтому вот.

Создал регистр с одним измерением типа Строка. Дальше делаю вот так:
https://i.imgur.com/84ks3kq.png
https://i.imgur.com/Jz6Tut3.png
https://i.imgur.com/b5V52zE.png

Ожидаю увидеть в одном окне ожидание больше 5 секунд, но ничего не выходит.
ЧЯДНТ?
   H A D G E H O G s
 
1 - 01.10.20 - 15:14
(0) Надеюсь, вам дадут белый билет в программировании
   H A D G E H O G s
 
2 - 01.10.20 - 15:15
(0) Логику то я понял, она работает от обратного, если бы была блокировка, вывело бы ноль.
   H A D G E H O G s
 
3 - 01.10.20 - 15:15
Нет транзакции.
   H A D G E H O G s
 
4 - 01.10.20 - 15:16
Потом вас ждет еще одно "открытие"
   DTX 4th
 
5 - 01.10.20 - 15:18
(3) Да вот только к компу прибежал, когда понял, что транзакции нет) Спасибо
   H A D G E H O G s
 
6 - 01.10.20 - 15:21
На регистре сведений мьютекс (слова то какие знают) не построить именно из за блокировки диапазонов в борьбе с фантомами. Строить надо на справочнике.

Если надо интерактивно сказать пользователю, что он - не первый - то так:
Функция УстановитьСнятьБлокировку(ТранспортныйМодуль,ОбластьБлокировки,ИдентификаторФормы,ЭтоСнятиеБлокировки) Экспорт
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    АСФОбъектыВариантовОбменаДляБлокировки.Ссылка КАК Ссылка,
    |    АСФОбъектыВариантовОбменаДляБлокировки.ОбластьБлокировки КАК ОбластьБлокировки
    |ИЗ
    |    Справочник.АСФОбъектыВариантовОбменаДляБлокировки КАК АСФОбъектыВариантовОбменаДляБлокировки
    |ГДЕ
    |    АСФОбъектыВариантовОбменаДляБлокировки.ТранспортныйМодуль = &ТранспортныйМодуль
    |    И АСФОбъектыВариантовОбменаДляБлокировки.ОбластьБлокировки = &ОбластьБлокировки";
    Запрос.УстановитьПараметр("ТранспортныйМодуль",ТранспортныйМодуль);
    Запрос.УстановитьПараметр("ОбластьБлокировки",ОбластьБлокировки);
    РезультатЗапроса=Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Справочники.АСФОбъектыВариантовОбменаДляБлокировки.ЗаполнитьСправочникОбъектовВариантовОбменаДляБлокировки();
        РезультатЗапроса=Запрос.Выполнить();
    КонецЕсли;
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Истина;
    КонецЕсли;
    Выборка=Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    ОбъектБлокировки=Выборка.Ссылка;
    
    Если ЭтоСнятиеБлокировки Тогда
        РазблокироватьДанныеДляРедактирования(ОбъектБлокировки,ИдентификаторФормы);
        Возврат Истина;
    КонецЕсли;
    
    СоответствиеОбластиБлокировкиИСообщения=Новый Соответствие;
    СоответствиеОбластиБлокировкиИСообщения.Вставить(0,"Обработка заблокирована и не будет запущена во избежание дублирования загрузки ТТН и АКТОВ: ");
    СоответствиеОбластиБлокировкиИСообщения.Вставить(1,"Обработка заблокирована и не будет запущена во избежание дублирования загрузки ТТН: ");
    СоответствиеОбластиБлокировкиИСообщения.Вставить(2,"Обработка заблокирована и не будет запущена во избежание дублирования загрузки АКТОВ: ");
    
    ЕстьОшибкаБлокировки=Ложь;
    Попытка
        ЗаблокироватьДанныеДляРедактирования(ОбъектБлокировки,,ИдентификаторФормы);
    Исключение
        Ошибка=ОписаниеОшибки();
        Ошибка=ИнформацияОбОшибке();
        ОписаниеОшибки=Ошибка.Причина.Описание;
        АСФОбщегоНазначенияКлиентСервер.СообщитьПользователю(СоответствиеОбластиБлокировкиИСообщения.Получить(ОбластьБлокировки)+ОписаниеОшибки);
        ЕстьОшибкаБлокировки=Истина;
    КонецПопытки;
    Если ЕстьОшибкаБлокировки=Истина Тогда
        РазблокироватьДанныеДляРедактирования(ОбъектБлокировки,ИдентификаторФормы);
        Возврат Ложь;
    КонецЕсли;
    Возврат Истина;
КонецФункции
   H A D G E H O G s
 
7 - 01.10.20 - 15:22
Если говорить не надо, то так:
Процедура НачатьТранзакциюУстановитьБлокировку(УстанавливатьБлокировку, ТипДанных)
    
    НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    Если УстанавливатьБлокировку <> Истина Тогда
        Возврат;
    КонецЕсли;
    Если ТипДанных = "Марки" Тогда
        КлючБлокировки = АСФОбщегоНазначенияПовторноеИспользование.ПолучитьПсевдоПредопределенноеЗначение("Справочник.АСФОбъектыВариантовОбменаДляБлокировки.ЗагрузкаМарокЕГАИС");    
    Иначе
        КлючБлокировки = АСФОбщегоНазначенияПовторноеИспользование.ПолучитьПсевдоПредопределенноеЗначение("Справочник.АСФОбъектыВариантовОбменаДляБлокировки.ЗагрузкаУпаковокЕГАИС");
    КонецЕсли;
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("Справочник.АСФОбъектыВариантовОбменаДляБлокировки");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.УстановитьЗначение("Ссылка", КлючБлокировки);    
    Блокировка.Заблокировать();    
    
КонецПроцедуры
   polosov
 
8 - 01.10.20 - 15:22
(1) Да ладно тебе. Человек просто не почитал https://its.1c.ru/db/metod8dev/content/5839/hdoc
Разберется потихоньку.
   H A D G E H O G s
 
9 - 01.10.20 - 15:22
(8) Я не про его понимание блокировок, я про его негуманоидный алгоритм.
   DTX 4th
 
10 - 01.10.20 - 15:33
(6) Можно вот про это поподробнее?
>На регистре сведений мьютекс не построить именно из за блокировки диапазонов в борьбе с фантомами

(8) Отставить) А то сейчас придется спец по платформе расчехлять xD

За (7) спасибо
   H A D G E H O G s
 
11 - 01.10.20 - 15:38
   polosov
 
12 - 01.10.20 - 15:40
(10) Ну у меня только по ЗиК, поэтому крыть нечем.
   H A D G E H O G s
 
13 - 01.10.20 - 16:02
Был немного не точен. "Непонятные" блокировки могут возникнуть, только если в регистре 2 измерения и ты блокируешь только одно из них одной транзакцией, а второй пытаешься блокировать 2 измерение.

Особенно явно это видно, когда бы блокировал 1 измерение, а во второй транзакции пишешь НаборЗаписей с отбором по 2 измерению. Все, 1С не даст записать.
А вот если 2 транзакцией ты пишешь в цикле через МенеджерыЗаписей (в которых идет отбор по 2 измерениям сразу и скрытой управляемой блокировкой) - то все норм.

Причина всего этого - плохая терминология.
Не
"Управляемая блокировка"
а
"Управляемое намерение заблокировать"

Управляемая блокировка вообще не смотрит на данные, она тупо выражает намерения заблокировать области.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.