Как исправить ошибку «Превышено максимальное время ожидания предоставления блокировки» при обмене данными после переноса базы 1С?

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

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

Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки при выполнении строки кода:


ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, МассивВыгружаемыхМетаданных);

Разберем природу возникновения этой ошибки и пошагово рассмотрим методы ее устранения.

Почему возникает конфликт блокировок в методе ВыбратьИзменения

Метод ПланыОбмена.ВыбратьИзменения() выполняет не просто чтение таблиц, а транзакционную модификацию служебных таблиц регистрации изменений на уровне СУБД (таблицы с префиксами _ReferenceChngR, _DocumentChngR и т. д.). В момент вызова метода этим записям присваивается номер формируемого сообщения обмена, что требует наложения исключительных блокировок.

Таймаут (по умолчанию 20 секунд в платформе 1С) возникает в следующих ситуациях:

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

Шаг 1. Отключение блокирующих регламентных и фоновых заданий

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

Для локализации проблемы выполним следующие действия:

  1. Откроем консоль администрирования кластера серверов 1С:Предприятия.
  2. В свойствах информационной базы временно установим флаг Блокировка регламентных заданий включена.
  3. Завершим все активные фоновые сеансы.
  4. Повторим процедуру синхронизации данных. Если обмен прошел успешно, включим регламентные задания обратно и настроим их расписание так, чтобы они не пересекались по времени с выгрузкой обмена.

Шаг 2. Очистка служебных данных и кэша кластера серверов

Если перенос базы сопровождался сменой версии платформы 1С:Предприятие, в каталоге кластера серверов могут остаться устаревшие сеансовые данные, приводящие к нештатному поведению блокировок.

Разберем по шагам процедуру очистки кэша кластера:

  1. Остановим службу 1C:Enterprise 8.3 Server Agent через оснастку служб операционной системы.
  2. Перейдем в каталог данных кластера серверов (по умолчанию: C:\Program Files\1cv8\srvinfo или C:\Program Files (x86)\1cv8\srvinfo).
  3. Найдем в папке кластера (каталог вида reg_1541) подпапки с сеансовыми данными (содержащие в имени snstx или временные файлы сеансов) и удалим их. Важно: не удаляйте файл описания кластера 1CV8Reg.lst, чтобы не потерять список зарегистрированных баз.
  4. Запустим службу сервера 1С заново.

Шаг 3. Обновление статистик и обслуживание таблиц на стороне СУБД

После развертывания бэкапа на новом SQL-сервере оптимизатор СУБД не имеет актуальных сведений о распределении данных в таблицах изменений. В результате простой запрос на выборку изменений может превратиться в полное сканирование таблицы с наложением блокировок на большой диапазон страниц.

Для исправления ситуации выполним регламентные процедуры на сервере СУБД:

  1. Выполним обновление статистик базы данных с полным сканированием:
    
    EXEC sp_updatestats;
    -- или для конкретной базы с полным пересчетом:
    -- UPDATE STATISTICS [ИмяТаблицы] WITH FULLSCAN;
    
  2. Выполним операцию реиндексации (перестроения индексов) для всех таблиц базы данных.

Шаг 4. Проведение тестирования и исправления информационной базы

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

  1. Запустим базу данных в режиме Конфигуратор под учетной записью с административными правами.
  2. Откроем меню Администрирование → Тестирование и исправление...
  3. Установим флаги:
    1. Реиндексация таблиц информационной базы
    2. Проверка логической целостности информационной базы
    3. Проверка ссылочной целостности информационной базы
    4. Пересчет итогов
  4. Нажмем кнопку Выполнить и дождемся завершения служебных процедур.

Шаг 5. Анализ объема накопленных изменений и порционная выгрузка

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

Проанализируем состав изменений с помощью типовой обработки Регистрация изменений для обмена данными:

  1. Если зарегистрированы неактуальные данные или вся база целиком по ошибке, снимем лишнюю регистрацию с помощью метода: ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, ТипМетаданных);
  2. Если данные необходимо выгрузить в полном объеме, разобьем массив выгружаемых метаданных на небольшие порции, передавая в параметр МассивВыгружаемыхМетаданных метода ПланыОбмена.ВыбратьИзменения() типы объектов по очереди, уменьшая тем самым объем транзакций.
← На главную