Имя: Пароль:
1C
 
Вопрос про управляемую блокировку
0 GurinDoku
 
05.09.16
18:30
Делаю движения:

Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Количество = ТекСтрокаТовары.Количество;

Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.ОстаткиТоваров.Записать(Истина);

Ставлю точку останова после Записать(истина). То есть транзакция еще не закончилась и регистр заблокирован. Под другим сеансом через консоль запросов запускаю запрос по остаткам на ОстаткиТоваров по ВСЕМ измерениям и периодам. Блокировки нет. Так и должно быть?  СУБД MSSQL 2005. 1c 8.3
1 GurinDoku
 
05.09.16
18:34
Если перепровожу другой документ с такими же значениями ключевых полей регистров, то блокировка срабатывает.
2 kinsm
 
05.09.16
18:35
Да. Значит запрос выполняется вне транзакции
3 GurinDoku
 
05.09.16
18:41
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    Запрос = Новый Запрос(
        "ВЫБРАТЬ
        |    ОстаткиТоваровОстатки.Склад,
        |    ОстаткиТоваровОстатки.Номенклатура,
        |    ОстаткиТоваровОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки"
    );
    Запрос.Выполнить();
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "work!";
    Сообщение.Сообщить();
    ЗафиксироватьТранзакцию();
4 GurinDoku
 
05.09.16
18:42
Ошибся. Когда параллельно провожу документ с такими же значениями свойств регистров, то блокировки НЕТ!!
5 GurinDoku
 
05.09.16
18:44
Даже если запускаю запрос под транзакцией, то блокировки все равно не происходит. Блокировка также не происходит, если пытаюсь перепровести документ такого же типа и с такими же записываемыми движениями....
6 GurinDoku
 
05.09.16
18:48
Разделение итогов по регистру включено. Режим блокировок "Управляемая" и у документа и регистра...
7 xafavute
 
05.09.16
18:52
это блокировка на запись, а не на чтение
8 saaken
 
05.09.16
18:52
(0) так и должно быть
9 GurinDoku
 
05.09.16
18:57
(7) Я и записываю. То есть блокировка не работает ни на чтение, ни на запись.
10 GurinDoku
 
05.09.16
19:02
Запускаю первый документ, перепровожу и останавливаюсь на точке останова после "Записать". Затем под другим пользователем запускаю на перепроведение другой документ с такими же значениями полей набора записей движений. Блокировки нет. Такая ситуация именно когда использую "БлокироватьДляИзменения". При использовании явной блокировки через объект "блокировка данных", блокировка срабатывает! Также блокировка срабатывает после записи набора, если использовать "Автоматический" режим блокировки, но только когда я ПЕРЕПРОВОЖУ документ. На чтение в автоматическом варианте блокировки при выполнении запроса как в транзакции, так и без нее блокировка не происходит.
11 H A D G E H O G s
 
05.09.16
19:02
а в свойствах самой конфы?
12 H A D G E H O G s
 
05.09.16
19:07
фух, вспомнил.
Когда перепроводишь первый док - измени его ТЧ.
13 H A D G E H O G s
 
05.09.16
19:07
или проводи его из непроведенного состояния. Короче, записи в регистре должны поменяться.
14 GurinDoku
 
05.09.16
19:12
В свойствах конфы "Автоматическая и управляемый"
15 GurinDoku
 
05.09.16
19:12
(13) Все равно не работает....
16 H A D G E H O G s
 
05.09.16
19:16
(15) Скинь конфу или постучись в скайп
17 H A D G E H O G s
 
05.09.16
19:16
vasiliy--ivanovich
18 GurinDoku
 
05.09.16
19:16
Если у кого будет время, посмотрите:
https://yadi.sk/d/h_Jj3KhyuoWY3
Документ "Приходная накладная", ОбработкаПроведения.
19 H A D G E H O G s
 
05.09.16
19:21
Все блокируется.
20 Tateossian
 
05.09.16
19:22
(0) А зачем вот это:

Движения.ОстаткиТоваров.Записывать = Истина;

???
21 H A D G E H O G s
 
05.09.16
19:24
Нормальная SQL блокировка вылетает. Ибо clastered index scan на запросе всех остатков.
22 Tateossian
 
05.09.16
19:27
(10) Поставь точку останова в модуле набора записей.
23 H A D G E H O G s
 
05.09.16
19:27
24 GurinDoku
 
05.09.16
19:28
(19) Если я провожу первый документ, ставлю точку останова после записи, то если начну проводить второй документ, то он должен "подвиснуть" пока я выйду из отладки в первом документе (первой транзакции) ? (20) От безысходности....
25 H A D G E H O G s
 
05.09.16
19:28
(24) Да. Так и есть. 20 секунд висит (по дефолту), потом (23)
26 GurinDoku
 
05.09.16
19:45
(25) Спасибо большое. Буду копаться, смотреть... У товарища попробую запустить.
27 H A D G E H O G s
 
05.09.16
20:26
Скорее всего у тебя стоит snapshot.
Он даст прочитать остатки.

Чтобы вызвать блокировку, в первом сеансе открой 2 документ , измени количество, и остановись после Движения.ОстаткиТоваров.Записать(Истина);

Во втором сеансе открой 3 документ, выбери тот же склад и номенклатуру, установи галочку "ОУ" и будет тебе управляемая блокировка.
28 disvix
 
05.09.16
20:28
включен режим разделения итогов, в таблицу итогов добавляется еще одно поле "Разделитель" , данные пишутся параллельно/
29 H A D G E H O G s
 
05.09.16
20:36
(28) выключен
30 H A D G E H O G s
 
05.09.16
20:37
БлокироватьДляИзменения=истина выключает разделение
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой