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