Почему возникают блокировки транзакций и растет показатель «Захвачено СУБД» в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При активной многопользовательской работе в 1С пользователи нередко сталкиваются с ошибками ожидания блокировок при записи или проведении документов. В консоли кластера серверов 1С при этом можно заметить, что сеанс одного из пользователей длительное время удерживает соединение, а показатель «Захвачено СУБД» непрерывно растет. Разберем подробно, что означают эти показатели, почему возникают блокировки и какими способами можно локализовать и устранить проблему.

Что означает показатель «Захвачено СУБД» и почему он растет

Показатель «Захвачено СУБД» (или время захвата СУБД) отображает суммарное время в секундах или миллисекундах, в течение которого сеанс удерживал ресурсы базы данных в рамках текущего контекста или открытых соединений. Сам по себе этот показатель отражает интенсивность работы пользователя с базой данных, однако его аномальный или бесконтрольный рост сигнализирует о следующих проблемах:

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

Решение 1. Очистка ресурсов и корректное закрытие менеджера временных таблиц

Одной из скрытых причин постоянного роста показателя «Захвачено СУБД» в течение рабочего дня является некорректная работа с временными таблицами в циклических или часто вызываемых процедурах. Если объект МенеджерВременныхТаблиц создается в контексте выполнения, наполняется данными, но не закрывается при выходе, временные таблицы могут продолжать удерживать физические ресурсы во временной базе (например, tempdb в MS SQL Server).

Рассмотрим пример кода, в котором выполняется явное освобождение ресурсов с помощью метода Закрыть():


Процедура ОбработатьДанныеРабочихМест()
    
    МВТРабочиеМеста = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МВТРабочиеМеста;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка КАК РабочееМесто
        |ПОМЕСТИТЬ ВТ_РабочиеМеста
        |ИЗ
        |   Справочник.РабочиеМеста КАК Спр";
    Запрос.Выполнить();
    
    // Выполнение основных расчетов и логики обработки данных
    // ...
    
    // Обязательное освобождение ресурсов менеджера
    Если МВТРабочиеМеста <> Неопределено Тогда
        МВТРабочиеМеста.Закрыть();
    КонецЕсли;
    
КонецПроцедуры

Явный вызов метода Закрыть() удаляет созданные временные таблицы из СУБД и снимает избыточную нагрузку на соединения сеанса.

Решение 2. Оптимизация транзакционной логики и исключение интерактивных действий

Проанализируем распространенную ошибку, когда внутри открытой транзакции вызываются интерфейсные окна или паузы. Если пользователь отходит от рабочего места с открытым окном предупреждения или вопроса, транзакция остается активной, удерживая эксклюзивные блокировки на таблицы.

  1. Исключение модальности: категорически запрещено вызывать методы Вопрос(), Предупреждение(), ОткрытьФормуМодально() внутри блока НачатьТранзакцию() ... ЗафиксироватьТранзакцию() или в обработчиках ОбработкаПроведения().
  2. Минимизация тела транзакции: вынесем все подготовительные выборки, проверку заполнения реквизитов и сложные расчеты за пределы транзакции. Транзакция должна содержать исключительно запись сформированных движений.
  3. Одинаковый порядок блокировки ресурсов: для предотвращения взаимных блокировок (Deadlock) все документы в конфигурации должны обращаться к регистрам и таблицам в строго одинаковой последовательности.

Решение 3. Переход на управляемые блокировки и разделение итогов

Для высоконагруженных баз с большим числом одновременных пользователей автоматический режим управления блокировками приводит к частым конфликтам. Разберем системные настройки платформы и СУБД:

  1. Управляемый режим блокировок: переведем конфигурацию и критичные регистры в режим «Управляемый». В коде проведения применим объект БлокировкаДанных, который блокирует только необходимые комбинации измерений, а не всю таблицу регистра целиком.
  2. Включение разделения итогов: для регистров накопления и бухгалтерии включим режим разделения итогов. Это позволит разным документам одновременно записывать движения по одним и тем же ходовым позициям или складам без блокировки единой строки итогов.
  3. Включение RCSI в СУБД: на уровне базы данных MS SQL Server активируем версионирование строк READ_COMMITTED_SNAPSHOT (RCSI). Это исключает конфликты между операциями чтения (отчеты) и записи (проведение документов).
  4. Настройка параллелизма: ограничим параметр Max Degree of Parallelism (MAXDOP) значением 1, чтобы исключить взаимные блокировки параллельных потоков внутри одного сложного запроса.

Диагностика и мониторинг блокировок

Для оперативного выявления «виновника» блокировки применим комплексный подход:

  1. Консоль кластера серверов 1С: в ветке «Сеансы» и «Соединения» отслеживаем сеансы с максимальным временем захвата СУБД и блокирующими блокировками.
  2. Центр управления производительностью (ЦУП): используем инструмент из состава корпоративного инструментального пакета (КИП) для детального анализа узких мест в коде.
  3. Технологический журнал 1С: настроим сбор событий TLOCK (установка блокировок и ожидания), TTIMEOUT (превышение таймаута ожидания блокировки) и TDEADLOCK (взаимоблокировки) для получения точного контекста модуля 1С, где возник конфликт.
  4. Системные представления СУБД: выполним диагностику активных сессий через хранимую процедуру sp_who2 или динамические представления sys.dm_tran_locks и sys.dm_exec_requests для обнаружения блокирующего потока (Blocking SPID).
← На главную