Ошибки блокировок — одна из самых неприятных проблем в работе с многопользовательскими базами данных 1С. Ситуация, когда при попытке провести, изменить или удалить документ система выдает сообщение «Конфликт блокировок при выполнении транзакции. Lock request time out period exceeded. HRESULT=80040E31, native=1222», сигнализирует о том, что один процесс пытается получить доступ к данным, которые уже «захвачены» другим процессом. Давайте подробно разберем, почему это происходит и как устранить проблему, основываясь на практическом опыте и глубоких настройках SQL Server.
Для начала проанализируем код ошибки. Значение native=1222 в контексте MS SQL Server означает, что запрос ожидал освобождения ресурса (таблицы или конкретной строки) дольше, чем это позволено настройкой LOCK_TIMEOUT. В платформе «1С:Предприятие» этот период ожидания обычно жестко задан и составляет около 20 секунд. Если за это время транзакция не смогла «пробиться» к данным, она аварийно завершается, чтобы не парализовать работу всей системы бесконечным ожиданием.
Как показывает практика, наиболее частой причиной «глухих» блокировок являются регламентные и фоновые задания. Рассмотрим, как локализовать проблему:
Разберем ситуацию: если фоновое задание обновляет итоги по регистру бухгалтерии, оно может накладывать блокировку на всю таблицу. В этом случае любая попытка записи в этот регистр (проведение документа) будет отбита по таймауту.
Если блокировки возникают «неожиданно» и перезагрузка сервера помогает лишь на короткое время, проблему следует искать на уровне СУБД. Проанализируем роль индексов. Со временем данные в таблицах фрагментируются, а статистика распределения данных устаревает.
Перестроение индексов (Index Rebuild): Это процесс полной пересборки структуры индекса. Рассмотрим, почему это помогает: при высокой фрагментации SQL Server тратит гораздо больше времени на поиск и модификацию записей, удерживая блокировки дольше положенного.
Обновление статистики (Update Statistics): Если статистика устарела, оптимизатор SQL Server может выбрать неэффективный план запроса. Вместо быстрого поиска по индексу (Index Seek) он может инициировать полное сканирование таблицы (Table Scan), что гарантированно приведет к эскалации блокировок. Рекомендуем настроить ежедневное выполнение следующей команды для базы данных:
EXEC sp_updatestats;
Выясним причину массовых конфликтов в старых конфигурациях. Существует два режима работы 1С с блокировками:
Если ваша база работает в автоматическом режиме, настоятельно рекомендуем рассмотреть возможность перевода конфигурации на управляемые блокировки. Это радикально снижает количество конфликтов native=1222.
Посмотрим на современный стандарт настройки SQL Server для 1С. Одним из важнейших параметров является READ_COMMITTED_SNAPSHOT. Рассмотрим, как это работает: при включении этого режима читающие транзакции (например, построение тяжелого отчета) не блокируют пишущие транзакции (проведение документа), так как используют «снимки» данных из tempdb.
Чтобы включить этот режим, выполним следующие команды (потребуется монопольный доступ к БД):
ALTER DATABASE [Имя_Вашей_Базы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [Имя_Вашей_Базы] SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE [Имя_Вашей_Базы] SET MULTI_USER;
SQL Server имеет механизм экономии памяти: если одна транзакция захватывает более 5000 блокировок строк, сервер «схлопывает» их в одну блокировку всей таблицы. Это и называется эскалацией. Если документ 1С очень крупный (содержит тысячи строк), он может заблокировать работу всех остальных пользователей.
Проанализируем ситуацию: в некоторых случаях администраторы отключают эскалацию для конкретных тяжелых таблиц (например, регистров бухгалтерии или сведений), чтобы предотвратить паралич системы. Команда для отключения эскалации на уровне таблицы:
ALTER TABLE [Имя_Таблицы_Регистра] SET (LOCK_ESCALATION = DISABLE);
Часто «невидимым» виновником является индекс полнотекстового поиска 1С. Если эта функция не используется сотрудниками для поиска в списках, ее лучше полностью отключить. Регулярное фоновое обновление этого индекса создает серьезную нагрузку на дисковую подсистему и часто конфликтует с записью новых документов в базу.
Если стандартные методы не помогают, воспользуемся инструментами глубокого анализа:
Lock:Timeout и увидеть текст SQL-запроса, который вызвал ошибку..ldf) находится на медленном диске, запись данных затягивается, что лавинообразно увеличивает время удержания всех блокировок.Подведем итог: Для решения проблемы конфликта блокировок необходимо действовать комплексно. Сначала устраним оперативные помехи (зависшие сеансы и фоновые задания), затем перейдем к техническому обслуживанию базы данных (индексы и статистика) и завершим настройкой параметров SQL Server (RCSI и режим блокировок).