Имя: Пароль:
1C
1С v8
Транзакционная блокировка по Периоду
,
0 Franchiser
 
гуру
24.10.19
14:35
Смотрю типовую: при получении данных из регистров 1С накладывает блокировку такого вида:
Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.РеализованныеТоварыКомитентов");
    ЭлементБлокировки.УстановитьЗначение("Организация",        Реквизиты.Организация);
    ЭлементБлокировки.УстановитьЗначение("Период",             Новый Диапазон(, Реквизиты.Период));
    ЭлементБлокировки.УстановитьЗначение("Контрагент",         Реквизиты.Контрагент);
    ЭлементБлокировки.УстановитьЗначение("ДоговорКонтрагента", Реквизиты.ДоговорКонтрагента);
    ЭлементБлокировки.ИсточникДанных = РеализованныеТоварыКомитентов;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
    Блокировка.Заблокировать();

Тут есть Период.
1. Для чего нужно указывать период, зачем блокировать при получении остатков период, ведь остатки могут уйти в минус и позже даты документа, если кто проводит документ параллельно более поздней датой?
2. Попробовал на своем регистре: проводил одновременно 2 документа в разные даты, при этом у более позднего документа как была ошибка ожидания транзакции так и осталось, т.е. Период не отрабатывает в моем понимании. Что не так?
1 H A D G E H O G s
 
24.10.19
14:40
Я даже регистр то такой найти не могу...
2 H A D G E H O G s
 
24.10.19
14:41
БП штоле?
3 Cyberhawk
 
24.10.19
14:43
"если кто проводит документ параллельно более поздней датой" // Он получит отлуп (будет ждать), т.к. начало диапазона не указано, т.е. с началоа времен
4 Franchiser
 
гуру
24.10.19
14:47
(2) БП 3.
Самое интересное: после выполения метода Заблокировать(). Значение "Периода" в  Полях ЭлементБлокировки принимает значение "Неизвестный объект", хотя до этого оно равно заданному Диапазону.
5 H A D G E H O G s
 
24.10.19
14:48
Даже пришлось заглянуть, уж не контроль ли остатков. Нет, просто получают остатки для списания.
6 Franchiser
 
гуру
24.10.19
14:53
(3) Если используется Вирт. таблица остатков на дату позже установленного периода блокировки, то тоже будет ждать?
7 Franchiser
 
гуру
24.10.19
14:56
Вообщем мне не понятно, нужно ли ставить блокировку на "Период" для блокировки из источника данных для контроля остатков и создания расходных записей, и почему не работает блокировка по периоду.
8 Cyberhawk
 
24.10.19
14:56
(6) Ждать будет тот кто пытается наложить блокировку с пересечением диапазона.
Какая разница используется потом остатков таблица или не используется?
9 Cyberhawk
 
24.10.19
14:58
(7) Определяется исключительно прикладной логикой. По поводу "не работает" тупишь.
10 H A D G E H O G s
 
24.10.19
15:02
(7) Ну они попытались немного оптимизировать, поставив блокировку не на таблицу остатков, а на таблицу движений.

Док, проводясь задним числом, заблокирует движения, которые были до него, чтобы остаток на его дату, которым он будет оперировать - не поплыл прямо в момент проведения. А что будет после него - похрен.
11 Franchiser
 
гуру
24.10.19
15:07
(9) После метода Заблокировать() Период очищается и превращается в "Неизвестный объект".
Возможно это из-за ИспользоватьИзИсточникаДанных()
12 H A D G E H O G s
 
24.10.19
15:08
(11) Техжурнал по событию LOCK расскажет вам, есть ли там Период.
13 Franchiser
 
гуру
24.10.19
15:51
(12) зачем техжурнал если я в отладчике вижу что он превращается во что то другое
14 ptiz
 
24.10.19
15:56
(0) "проводил одновременно 2 документа в разные даты" - а если в разные месяцы?
15 H A D G E H O G s
 
24.10.19
16:23
(13) Одно другому может и не мешать
16 Franchiser
 
гуру
24.10.19
18:36
(14) месяцы разные
17 Franchiser
 
гуру
25.10.19
12:17
Разобрался:
ЭлементБлокировки.УстановитьЗначение("Период",             Новый Диапазон(, Реквизиты.Период));
это похоже какая то оптимизация.
Если первый документ (с раней датой) установил блокировку на регистр за период до своей даты, и другой поздний документ блокировку до своей даты, то все равно получается пересечение периодов и последний документ не сможет провестись пока не проведется первый.
18 ptiz
 
25.10.19
12:59
(17) Ну, то есть смысла - никакого?
19 ДенисЧ
 
25.10.19
13:01
(18) Так в этом как раз и смысл ))
20 DrWatson
 
25.10.19
13:51
(19) В чем смысл? В том, что второй документ будет ждать первый в независимости от значения дат? Так можно было бы и не делать условие по периоду, достаточно остальных условий (по организации, контрагенту, договору).
Предполагаю, что есть блокировки в других документах, которые блокируют не весь диапазон с начала времен. В этом случае введение периода в блокировку приобретает смысл.
21 Franchiser
 
гуру
25.10.19
13:56
(18) Возможно разработчики считают что так они меньше записей блокируют первым документом.
Например в базе 2 записи регистра, созданных двумя документами.
Первый документ заблокирует 1 запись; второй документ попытается заблокировать 2 записи.
А если бы без периода, то первый документ бы заблокировал 2 записи, и второй попытался бы заблокировать 2.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn