Работа с регистрами расчета в режиме совместимости с платформой 8.2 часто сопровождается возникновением таймаутов на стороне СУБД при проведении документов. Давайте вместе разберемся, почему это происходит и как можно минимизировать влияние данных блокировок на производительность системы.
Основная проблема кроется в том, как именно платформа 1С версий 8.2 и ниже взаимодействует с SQL Server при записи данных в регистры расчета. В отличие от современных версий платформы, где алгоритмы оптимизированы, в режиме совместимости 8.2 часто задействуются дополнительные физические таблицы, например, для хранения ФактическийПериодДействия.
При записи данных платформа генерирует специфические SQL-запросы, которые могут приводить к блокировке всей таблицы TABLOCK. Это необходимо для обеспечения транзакционной целостности при выполнении сложных выборок внутри процедур проведения. Когда два документа одновременно пытаются записать данные в один период, возникают конфликты блокировок на системных таблицах или индексах, что приводит к ожиданию и последующему таймауту.
Первое, что нам необходимо сделать — это локализовать место возникновения конфликта. Для этого настроим технологический журнал. Нас интересуют события DBMSSQL и TLOCK.
logcfg.xml так, чтобы фиксировались длительные события DBMSSQL (например, превышающие 5-10 секунд).WITH(TABLOCK)._CalcKindRRef (Вид расчета), значит, проблема может быть связана с недостаточной эффективностью индексов по этому полю или конкуренцией при обращении к перерасчетам.Хотя RCSI традиционно считается решением для устранения блокировок на чтение, его активация на уровне базы данных SQL Server часто помогает снизить общий уровень конфликтов. При включенном RCSI записи в базу данных не блокируются операциями чтения, что позволяет распределить нагрузку на ресурсы сервера более эффективно.
Чтобы убедиться, что настройка применена, проверьте параметры вашей базы данных через Management Studio:
Убедитесь, что параметры snapshot_isolation_state и is_read_committed_snapshot_on установлены в значение 1 (True).
Многие разработчики пытаются решить проблему, создавая кластерные индексы напрямую в SQL Server. Однако важно понимать, что платформа 1С:Предприятие работает на основе собственных метаданных. Даже если вы вручную добавите индекс, сервер 1С об этом «не знает». Платформа продолжает генерировать SQL-запросы исходя из структуры, описанной в конфигурации. Более того, при обновлении конфигурации или реструктуризации эти индексы могут быть удалены или перезаписаны, что приведет к непредсказуемому поведению системы.
Для глубокого понимания ситуации воспользуйтесь инструментом «Центр управления производительностью» (ЦУП). Он позволит:
Управляемые блокировки для всех объектов, участвующих в проведении.sys.dm_tran_locks, чтобы в режиме реального времени видеть, какой именно запрос держит блокировку и какой объект является «узким горлышком».Помните, что борьба с блокировками — это итеративный процесс. Начните с анализа того, какие именно данные в регистре расчета вызывают конфликт, и двигайтесь от простого мониторинга к оптимизации алгоритмов проведения.