Ошибка «Конфликт блокировок при выполнении транзакции» в 1С: причины и решение
Сообщение «Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки» — одна из самых частых жалоб пользователей клиент-серверной 1С. Документ не проводится, пользователь нажимает кнопку ещё раз, и всё повторяется. Разберёмся, что происходит и как это исправить.
Что такое блокировка
Когда 1С записывает данные (проводит документ, пересчитывает остатки), она блокирует нужные записи, чтобы два пользователя одновременно не изменили одни и те же остатки. Остальные ждут освобождения блокировки. Если ожидание длится дольше установленного таймаута (для управляемых блокировок по умолчанию около 20 секунд), транзакция отменяется с ошибкой.
Два вида ошибок
- Таймаут ожидания — кто-то слишком долго держит блокировку: например, идёт закрытие месяца или массовое перепроведение.
- Взаимоблокировка (deadlock) — две транзакции ждут друг друга: первая заблокировала товар А и ждёт товар Б, вторая — наоборот. Одна из них будет принудительно отменена.
Основные причины
- Автоматический режим блокировок. Старые или сильно доработанные конфигурации работают в режиме «Автоматический» — блокировки ставит СУБД, причём с избытком (целыми диапазонами таблиц).
- Долгие транзакции. Внутри проведения выполняются тяжёлые запросы, обращения к внешним сервисам или ожидание ответа пользователя.
- Регламентные задания в рабочее время — обмены, пересчёт итогов, загрузка цен.
- Неоптимальные доработки: чтение остатков без отбора, запись большого числа наборов записей в одной транзакции.
- Отсутствие индексов — СУБД сканирует таблицу целиком и эскалирует блокировку.
Как найти виновника
- Включите технологический журнал с событиями
TLOCK,TTIMEOUTиTDEADLOCK— в них видно, кто, какую таблицу и в каком месте кода блокировал. - Посмотрите, что выполняется в момент ошибки: консоль кластера (сеансы и их длительность), список активных запросов в СУБД.
- Сопоставьте время ошибок с расписанием регламентных заданий.
Как исправить
- Перевести конфигурацию в управляемый режим блокировок (для типовых решений на управляемых формах он уже включён — проверьте доработки).
- Сократить транзакции: всё, что можно, вычислять до начала записи, внешние вызовы — выносить за пределы транзакции.
- Устанавливать управляемые блокировки явно и в одном порядке во всём коде — это устраняет взаимоблокировки.
- Перенести тяжёлые регламентные задания на ночь.
- Настроить обслуживание СУБД: индексы, статистики.
Итог
Ошибки блокировок почти всегда имеют конкретную, находимую причину — «подождать и нажать ещё раз» не решение. Я провожу диагностику по технологическому журналу и устраняю причину в коде или настройках, обычно за 2–5 рабочих дней.