При переносе информационной базы 1С на другой сервер (например, через восстановление резервной копии СУБД) администраторы и разработчики нередко сталкиваются с ошибкой синхронизации. В процессе выгрузки данных возникает исключение:
Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки при выполнении строки кода:
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения, МассивВыгружаемыхМетаданных);
Разберем природу возникновения этой ошибки и пошагово рассмотрим методы ее устранения.
Метод ПланыОбмена.ВыбратьИзменения() выполняет не просто чтение таблиц, а транзакционную модификацию служебных таблиц регистрации изменений на уровне СУБД (таблицы с префиксами _ReferenceChngR, _DocumentChngR и т. д.). В момент вызова метода этим записям присваивается номер формируемого сообщения обмена, что требует наложения исключительных блокировок.
Таймаут (по умолчанию 20 секунд в платформе 1С) возникает в следующих ситуациях:
Проанализируем активность фоновых процессов. При запуске базы на новом сервере платформа может автоматически запустить ресурсоемкие регламентные задания (например, обновление полнотекстового индекса, слияние индексов, загрузку классификаторов или расчет итогов).
Для локализации проблемы выполним следующие действия:
Если перенос базы сопровождался сменой версии платформы 1С:Предприятие, в каталоге кластера серверов могут остаться устаревшие сеансовые данные, приводящие к нештатному поведению блокировок.
Разберем по шагам процедуру очистки кэша кластера:
C:\Program Files\1cv8\srvinfo или C:\Program Files (x86)\1cv8\srvinfo).reg_1541) подпапки с сеансовыми данными (содержащие в имени snstx или временные файлы сеансов) и удалим их. Важно: не удаляйте файл описания кластера 1CV8Reg.lst, чтобы не потерять список зарегистрированных баз.После развертывания бэкапа на новом SQL-сервере оптимизатор СУБД не имеет актуальных сведений о распределении данных в таблицах изменений. В результате простой запрос на выборку изменений может превратиться в полное сканирование таблицы с наложением блокировок на большой диапазон страниц.
Для исправления ситуации выполним регламентные процедуры на сервере СУБД:
EXEC sp_updatestats;
-- или для конкретной базы с полным пересчетом:
-- UPDATE STATISTICS [ИмяТаблицы] WITH FULLSCAN;
Если в таблицах регистрации изменений нарушена ссылочная целостность или индексы рассинхронизированы на уровне метаданных 1С, поможет штатная процедура тестирования и исправления (ТиИ).
Если узел обмена долго не синхронизировался перед переносом, таблицы регистрации могут содержать миллионы записей. Попытка заблокировать их все в одной транзакции неизбежно приводит к превышению лимита ожидания.
Проанализируем состав изменений с помощью типовой обработки Регистрация изменений для обмена данными:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, ТипМетаданных);
МассивВыгружаемыхМетаданных метода ПланыОбмена.ВыбратьИзменения() типы объектов по очереди, уменьшая тем самым объем транзакций.