Имя: Пароль:
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 измерениям сразу и скрытой управляемой блокировкой) - то все норм.

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

Управляемая блокировка вообще не смотрит на данные, она тупо выражает намерения заблокировать области.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс