Имя: Пароль:
1C
1С v8
Правильно ли сделан код на Блокировку регистра Б24_ТаблицаИзменений?
0 ИС-2
 
naïve
03.01.25
15:52
Разбираюсь с проблемами блокировки.

Нашел в обмене с Битрексом такой код

     БлокировкаДанных = Новый БлокировкаДанных;
     ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.Б24_ТаблицаИзменений");

     НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
        Попытка
            БлокировкаДанных.Заблокировать();    
            
            Запрос = Новый Запрос;
            Запрос.УстановитьПараметр("НастройкаСинхронизации"        , НастройкаСинхронизации);
            Запрос.УстановитьПараметр("ВремяЗаписиВМиллисекундах"    , ВремяЗапускаВМиллисекундах);
            Запрос.Текст = "ВЫБРАТЬ
            |    Б24_ТаблицаИзменений.НастройкаСинхронизации КАК НастройкаСинхронизации,
            |    Б24_ТаблицаИзменений.ТипДанных КАК ТипДанных,
            |    Б24_ТаблицаИзменений.Объект КАК Объект,
            |    Б24_ТаблицаИзменений.ПодчиненныйОбъект КАК ПодчиненныйОбъект,
            |    Б24_ТаблицаИзменений.ВремяЗаписиВМиллисекундах КАК ВремяЗаписиВМиллисекундах
            |ИЗ
            |    РегистрСведений.Б24_ТаблицаИзменений КАК Б24_ТаблицаИзменений
            |ГДЕ
            |    Б24_ТаблицаИзменений.НастройкаСинхронизации = &НастройкаСинхронизации
            |    И Б24_ТаблицаИзменений.ВремяЗаписиВМиллисекундах > &ВремяЗаписиВМиллисекундах";
            
            ТзнИзменений = Запрос.Выполнить().Выгрузить();
            
            НаборЗаписей = РегистрыСведений.Б24_ТаблицаИзменений.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.НастройкаСинхронизации.Установить(НастройкаСинхронизации);
            НаборЗаписей.Загрузить(ТзнИзменений);
            НаборЗаписей.Записать(Истина);
    
     ЗафиксироватьТранзакцию();


Из него следует, что на время выполнения кода блокируется ВСЯ таблица Б24_ТаблицаИзменений.

Хотя можно блокировать только по измерения НастройкаСинхронизации.

По моим мыслям (может и не прав). Пока выполняет этот код к регистру нельзя обратиться. Верно рассуждаю ?

А с учетом того, что код выполняется в транзакции, то могут блокируются другие объекты для записи. Или тут не прав ?
1 Конструктор1С
 
03.01.25
16:10
Тут ужасно всё. Какая-то наркоманская логика
2 Конструктор1С
 
03.01.25
16:13
Другие сеансы не смогут писать в этот регистр
Нет, другие объекты не заблокируются. Хотя могут быть нюансы
3 ИС-2
 
naïve
03.01.25
16:57
А вот в WMS часть блокировок почистили внедренцы...

Получается, что один и тот же код который должен был выполнятся 1 раз последовательнно выполняется у внедренцев несколько раз... И приводит к блокировкам.
        
// Убрал блокировки для параллельной работы
        //БлокировкаДанных = Новый БлокировкаДанных;
        //ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.axЗаписываемыеИдентификаторыОбъектов");
        //ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        //ЭлементБлокировки.УстановитьЗначение("Идентификатор", Object.ID);
        //БлокировкаДанных.Заблокировать();
4 ИС-2
 
naïve
03.01.25
16:58
интересная статья про поиск блокировок

Как посмотреть, какие данные заблокированы в СУБД MS SQL Server
https://infostart.ru/1c/articles/707333/
5 breezee
 
04.01.25
08:49
А с какой именно проблемой разбираетесь?
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший