Имя: Пароль:
1C
1С v8
Блокировки на записи регистра сведений.
0 Raxla
 
06.07.22
12:38
Документы, подписка на событие "ОбработкаПроведения". Дополнительный регистр сведений куда пишутся данные, которые модифицируют предыдущие записи (выстраивается цепочка последовательности документов).
Суть проблемы: проведение последовательное, запись в регистр в транзакции, после того как транзакция зафиксировалась и произошёл выход из подписки, она откатывается или перетирается. В попытке, в ошибку не вываливаемся, блокировка - не работает, пробовал на всю таблицу и "ЗаблокироватьДанныеДляРедактирования". Предположительно, блокировки не работают, потому что есть вышестоящая транзакция.

Примерный код, не обращайте внимание на оверхед, при добавлении записи в ней есть сложновычислимое поле (вычисляется один раз), поэтому проще добавить и потом модифицировать.

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

            Добавить запись по ключу            

            Запрос, найти записи по ключу и упорядочить по времени.

            Если записей несколько, тогда верхней ставим пометку в поле, что она последняя и полесчётчик = счётчик предыдущей + 1, предыдущей записи - снимаем пометку.

            ЗафиксироватьТранзакцию();
            
            Сообщить(конец Номер документа);
        Исключение
            Сообщить(Исключение);
            Если ТранзакцияАктивна() Тогда
                ОтменитьТранзакцию();
            КонецЕсли;
        КонецПопытки;


По итогу, в сообщения, последовательно выводятся обрабатываемые документы, а в регистр записи в случайном порядке и половины не хватает. Исключение - не отрабатывало ни разу.
1 Raxla
 
06.07.22
12:40
если в отладке поставить точку останова и прощёлкивать по F5, давая время зафиксироваться транзакции, то работает как часы.
2 Raxla
 
06.07.22
12:43
Упорядочивается по времени и ссылке на документ, но разница между записями несколько секунд.
3 rozer76
 
06.07.22
12:50
если поле блокировки указать?
4 ДедМорроз
 
06.07.22
12:53
Так вы в подписке в транзакции проведения открываете еще одну?
5 Raxla
 
06.07.22
12:54
Если добавить в вывод ещё инфы, то видно, что, например, во время второй записи - первую может не видеть.
Да, открыаю ещё одну.
Поля блокировки пробовал указывать.
6 Naumov
 
06.07.22
12:55
(5) Откуда он ее увидит до фиксации транзакции? Читай текущий набор
7 Raxla
 
06.07.22
12:58
(6) Да, я понимаю, что пока вышестоящая транзакция не завершится, моё Зафиксировать, просто - фикция. Но вышестоящими транзакциями я не управляю. У меня только процедура из подписки.
Мне надо что бы блокировки работали.
8 Raxla
 
06.07.22
13:00
По поводу текущего набора, не понимаю: будет разница между запросом и набором записей?
9 Raxla
 
06.07.22
13:04
Запись и внесение измененеий, через МенеджерЗаписи, то есть по одной.
10 rozer76
 
06.07.22
13:04
(8) не не будет разницы, вложенная транзакция тут лишнее или в обработке исключения вызывать исключение которое пробрасывается в "ОбработкаПроведения". Блокировка будет работать если задать пространство блокировки.
11 rozer76
 
06.07.22
13:07
>> "ЗаблокироватьДанныеДляРедактирования"  
это вообще не о транзакционных блокировках ибо это объектная блокировка и не применима тут.
>>Предположительно, блокировки не работают, потому что есть вышестоящая транзакция.
нет
12 Raxla
 
06.07.22
13:08
(11) Транзакция убиралась, эффекта никакого. Область и так - вся таблица, делалось и по ключу, без разницы.
13 rozer76
 
06.07.22
13:13
(12) странно ) ну делай другой мьютекс...но в транзакции проведения дока это такое себе ...
14 Raxla
 
06.07.22
13:20
(13) То что странно, и так - понятно. Какой я мьютекс сделаю, если всё в транакции, а значит изолировано от других участнков до её завершения?
15 ДедМорроз
 
06.07.22
16:15
Когда мы ставим управляемую блокировкк,то она работает с момента установки до момента применения или отката первой транзакции,но она никак на запись не влияет,если код ее не ставит,а пишет,то он и не будет заблокирован.