Когда база данных 1С внезапно перестает проводить документы из-за конфликтов блокировок, это становится серьезной проблемой для бизнеса. Мы разберем, как последовательно проанализировать ситуацию, найти источник «затыка» и предпринять меры по исправлению, не прибегая к радикальным методам вроде пересоздания базы.
Прежде чем приступать к глубокому анализу, необходимо исключить влияние регламентных задач. Часто проведение документов блокируется фоновыми процессами, которые пытаются работать с теми же регистрами накопления. Мы рекомендуем:
Если после остановки фоновых заданий проблема сохраняется, значит, причина кроется в самом программном коде или неоптимальной работе с транзакциями. Чтобы увидеть истинную причину, необходимо настроить Технологический журнал.
Мы советуем настроить фильтрацию на события TLOCK и TDEADLOCK. Это позволит нам зафиксировать, какой именно объект (таблица или индекс) вызывает конфликт и в каком контексте кода это происходит. Внимательно проанализируйте атрибуты WaitConnections и Context, чтобы вычислить процедуру, которая «держит» блокировку дольше положенного времени.
Чаще всего причина блокировок кроется в нарушении правил работы с транзакциями. Рассмотрим типичную ситуацию: в рамках одной транзакции, открытой при проведении документа, происходит создание другого документа или запись в тяжелые регистры. Если при этом не используются корректные конструкции Попытка...Исключение, транзакция может затягиваться на неопределенный срок.
Разберем типичный пример проблемного участка кода, который нужно переработать:
// Неправильный подход: избыточная транзакция
НачатьТранзакцию();
// ... много действий с записью документов ...
// ... обращение к внешним сервисам ...
ЗафиксироватьТранзакцию();
Рекомендуем придерживаться принципа «минимальной транзакции»: подготовьте все данные до начала записи, а саму транзакцию сделайте максимально короткой. Если вы дорабатывали конфигурацию, проверьте, нет ли у вас избыточных обращений к регистрам внутри блоков проведения.
Одним из эффективных способов снизить количество конфликтов между чтением и записью данных является использование режима Read Committed Snapshot Isolation (RCSI). Этот механизм позволяет читающим запросам обращаться к версии строки, существующей до начала транзакции записи, тем самым избавляя пользователей от необходимости ждать завершения проведения документов.
Если вы используете управляемые блокировки, убедитесь, что они установлены правильно. Отказ от явных блокировок в пользу «автоматических» на больших объемах данных часто приводит к тому, что блокировка одной строки эскалируется (расширяется) до блокировки всей таблицы. Мы рекомендуем:
БлокировкаДанных в 1С.Помните: пересоздание базы из файла DT — это лишь временный метод очистки статистики и кэша, который не лечит «болезнь» системы. Если конфликт блокировок носит логический характер (особенности доработанной конфигурации), он неизбежно вернется. Проанализируйте Deadlock отчеты и оптимизируйте алгоритмы проведения документов, чтобы избежать взаимных блокировок в будущем.