Имя: Пароль:
1C
1С v8
Управляемые блокировки в регистре сведений
0 alexshape
 
05.03.19
17:44
Привет всем, знаю. по это теме много топиков, но ничего подходящего не нашел. В коде устанавливаю блокировку управляемую на чтение со стороны других участников, но почему то она не срабатывает

        
        НачатьТранзакцию();
        
        Блокировка = Новый БлокировкаДанных;
        
        ЭлементБлокировки = Блокировка.Добавить();
        ЭлементБлокировки.Область = "РегистрСведений.ОтложенныеОбращенияКВебСервисам";
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        
        Блокировка.Заблокировать();
        
        РезультатЗапроса = Запрос.Выполнить();
        
        Если РезультатЗапроса.Пустой() Тогда                        
            Прервать;        
        КонецЕсли;
                
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
1 Ёпрст
 
05.03.19
18:15
(0) транзакция
2 Сияющий в темноте
 
05.03.19
21:32
ну,обьект заблокирован,другие читатели его блокируют или просто читают,если просто читают,то поставь им в запросе ДляИзменения.
4 H A D G E H O G s
 
05.03.19
23:37
(2) ДляИзменения - это для 2000-х годов.
5 palsergeich
 
06.03.19
00:36
(2) Для изменения эта конструкция используется только в автоматическом режиме, устаревшая и не рекомендуемый режим.
В управляемом - эта конструкция игнорируется
6 palsergeich
 
06.03.19
00:39
Регистр подчиненный регистратору?
7 palsergeich
 
06.03.19
00:44
Просто на сколько я помню - блокировка идет по пересечению Пространство Блокрировки|Поле(я) блокировки.
В Вашем случае полей блокировки нет и я не помню на сколько данная запись корректна.
8 alexshape
 
06.03.19
09:20
(6) неа
9 alexshape
 
06.03.19
09:20
(7) в моем понимании строка:  ЭлементБлокировки.Область = "РегистрСведений.ОтложенныеОбращенияКВебСервисам";   накладывает блокировку на весь регистр, и никто не может читать его
10 saaken
 
06.03.19
09:28
первый раз слышу чтобы заблокированные данные нельзя было читать
11 Cyberhawk
 
06.03.19
10:08
(10) "Разделяемая" и "Исключительная" первый раз слышишь?
12 Cyberhawk
 
06.03.19
10:09
Ну а автор может вне транзакции читает в другом сеансе
13 Cyberhawk
 
06.03.19
10:10
Блочить таблицу для чтения другими вне транзации в 8.2 нельзя, в 8.3 иногда - тоже
14 Cyberhawk
 
06.03.19
10:13
А что же автор в "Область" элемента блокировки какую-то хрень пишет?
Надо же в методе "Добавить" весь регистр писать.
15 alexshape
 
06.03.19
10:33
(14) все равно
16 alexshape
 
06.03.19
10:33
НачатьТранзакцию();
        
        Блокировка = Новый БлокировкаДанных;
        
        ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ОтложенныеОбращенияКВебСервисам");
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        
        Блокировка.Заблокировать();


//тоже не работает
17 Cyberhawk
 
06.03.19
10:34
Ну тогда, вероятно, указания одного пространства недостаточно - еще и диапазон надо (через источник данных или установитьзначение)
18 Сияющий в темноте
 
06.03.19
14:09
А проверить,что блокировка установилась?
19 alexshape
 
06.03.19
16:00
(18) проверяю, точнее проверил и выяснил следующее:

1. В строке НачатьТранзакцию();, необходимо указывать явно тип РежимУправленияБлокировкойДанных
                                   НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
2. При установке такой блокировки
        Блокировка = Новый БлокировкаДанных;
        
        ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ОтложенныеОбращенияКВебСервисам");
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        
        Блокировка.Заблокировать();

устанавливается Х блокировка, она никак не мешает читать другим пользователям данные, поэтому приходится поступать так, прежде чем в других транзакциях что то выполнять, нужно попытаться установить также Исключительный режим блокировки, если все ок. то ок
20 H A D G E H O G s
 
06.03.19
16:02
(19) Запрос не устанавливает управляемых блокировок
21 alexshape
 
06.03.19
16:04
(20) это я уже понял. запрос вообще никакой блокировки не устанавливает
22 H A D G E H O G s
 
06.03.19
16:10
(21) S блокировку СУБД на время выполнения запроса
23 H A D G E H O G s
 
06.03.19
16:13
(18) Очень важно помнить, что УправляемыеБлокировки не работают с данными из СУБД.
Они вообще про них не знают ничего не знают, они работают с данными, которые им передал код 1С.

Это знание, возможно, пригодится вам, когда напоритесь на deadlock
24 mistеr
 
06.03.19
16:37
(0) Оффтопик, но интересен сценарий, в котором потребовалось блокировать чтение. До сих пор таких не встречал (исключая ошибки дизайна).
25 Сияющий в темноте
 
07.03.19
00:02
(24) чтобы поменять данные синхронно.