Проблема блокировок при закрытии месяца БП 1.6

1. voval74 21.10.19 12:26 Сейчас в теме
Вопрос уже поднимался (https://forum.infostart.ru/forum8/topic32711/), мне удалось копнуть немного глубже, но ответа пока не нашел:

Документ Закрытие месяца, процедура из бсп - УдалитьДвиженияРегистратора. Удаление движений вызывает блокировку всей таблицы регистра БУ Хозрасчетный, имена таблиц:

РегистрБухгалтерии.Хозрасчетный - Основная
РегистрБухгалтерии.Хозрасчетный - Значения субконто
РегистрБухгалтерии.Хозрасчетный - Итоги по счетам с субконто 1

когда я наткнулся на эту фигню блокировалась только таблица Хозрасчетный - Значения субконто, хз что изменилось.

Код удаления такой:

ПозицияТочки = Найти(СтрокаДвижения.Имя, ".");
ТипРегистра = Лев(СтрокаДвижения.Имя, ПозицияТочки - 1);
ИмяРегистра = СокрП(Сред(СтрокаДвижения.Имя, ПозицияТочки + 1));
Движения = ДокументОбъект.Движения[ИмяРегистра];
Движения.Очистить();
Движения.Записать();


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

Пробовал удалять движения через набор записей с отбором, через флаг "удалять автоматически" для документа - результат такой же.
Режим управления блокировкой для обоих документов автоматический.

С чем связано появление этой блокировка именно в закрытии месяца? Как её обойти?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sapiens_bru 4 23.10.19 06:26 Сейчас в теме
Предположу что у вас MS SQL. В файловой, Постгри и оракл вы бы и на одном документе ловили блок всей таблицы в автоматическом режиме. Вариант DB2 отбросим как маловероятный.

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

Просто в какой то момент MS SQL решает что проще блокировать всё, чем хранить информацию о множестве блокировок на строку.

КАК ПОБЕДИТЬ?
Вариант 1. Изменить код в 1С чтобы транзакции были менее 5000 записей. Например удалять документы порциями в маленьких транзакциях. Как при этом обеспечить целостность операции - ваша задача.
Вариант 2. Отключить эскалацию на сервере. Помогут флаги трассировки 1211 или 1224. Как и куда их воткнуть - смотрите в Гугле.

Вариант 3(неправильный). Вы можете найти документ в коде которого есть Движения.Хозрасчетный.Записать(). Создать такой документ с одной записью поставить точку остановки отладчиком после записи в регистр и провести документ. В этот момент вы заблокируете одну запись регистра пока не отпустите отладку далее. В другом сеансе можно закрывать месяц - эскалация невозможна, пока заблокирована хоть одна запись.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот