|
Почему не срабатывает исключительная блокировка? | ☑ | ||
---|---|---|---|---|
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 измерениям сразу и скрытой управляемой блокировкой) - то все норм. Причина всего этого - плохая терминология. Не "Управляемая блокировка" а "Управляемое намерение заблокировать" Управляемая блокировка вообще не смотрит на данные, она тупо выражает намерения заблокировать области. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |