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

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

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

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

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

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

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