Ошибка «Конфликт блокировок при выполнении транзакции» в 1С: причины и решение

· Профи СПб 1С

Сообщение «Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки» — одна из самых частых жалоб пользователей клиент-серверной 1С. Документ не проводится, пользователь нажимает кнопку ещё раз, и всё повторяется. Разберёмся, что происходит и как это исправить.

Что такое блокировка

Когда 1С записывает данные (проводит документ, пересчитывает остатки), она блокирует нужные записи, чтобы два пользователя одновременно не изменили одни и те же остатки. Остальные ждут освобождения блокировки. Если ожидание длится дольше установленного таймаута (для управляемых блокировок по умолчанию около 20 секунд), транзакция отменяется с ошибкой.

Два вида ошибок

  • Таймаут ожидания — кто-то слишком долго держит блокировку: например, идёт закрытие месяца или массовое перепроведение.
  • Взаимоблокировка (deadlock) — две транзакции ждут друг друга: первая заблокировала товар А и ждёт товар Б, вторая — наоборот. Одна из них будет принудительно отменена.

Основные причины

  1. Автоматический режим блокировок. Старые или сильно доработанные конфигурации работают в режиме «Автоматический» — блокировки ставит СУБД, причём с избытком (целыми диапазонами таблиц).
  2. Долгие транзакции. Внутри проведения выполняются тяжёлые запросы, обращения к внешним сервисам или ожидание ответа пользователя.
  3. Регламентные задания в рабочее время — обмены, пересчёт итогов, загрузка цен.
  4. Неоптимальные доработки: чтение остатков без отбора, запись большого числа наборов записей в одной транзакции.
  5. Отсутствие индексов — СУБД сканирует таблицу целиком и эскалирует блокировку.

Как найти виновника

  • Включите технологический журнал с событиями TLOCK, TTIMEOUT и TDEADLOCK — в них видно, кто, какую таблицу и в каком месте кода блокировал.
  • Посмотрите, что выполняется в момент ошибки: консоль кластера (сеансы и их длительность), список активных запросов в СУБД.
  • Сопоставьте время ошибок с расписанием регламентных заданий.

Как исправить

  1. Перевести конфигурацию в управляемый режим блокировок (для типовых решений на управляемых формах он уже включён — проверьте доработки).
  2. Сократить транзакции: всё, что можно, вычислять до начала записи, внешние вызовы — выносить за пределы транзакции.
  3. Устанавливать управляемые блокировки явно и в одном порядке во всём коде — это устраняет взаимоблокировки.
  4. Перенести тяжёлые регламентные задания на ночь.
  5. Настроить обслуживание СУБД: индексы, статистики.

Итог

Ошибки блокировок почти всегда имеют конкретную, находимую причину — «подождать и нажать ещё раз» не решение. Я провожу диагностику по технологическому журналу и устраняю причину в коде или настройках, обычно за 2–5 рабочих дней.

Нужна помощь с 1С?

Отвечу в течение рабочего дня. Экспресс-аудит конфигурации — 0 ₽.

✈