Траблшутинг зависших фоновых сессий обмена данными в РИБ 1С
При выполнении регламентной синхронизации в РИБ наблюдаются симптомы:
- Фоновое задание синхронизации висит часами со статусом
Выполняется, блокируя последующие запуски обмена. - В журнале регистрации фиксируется:
Превышено максимальное время ожидания предоставления блокировки. - Узел РИБ невозможно заблокировать для регламентного обновления конфигурации.
- Рост размера файла блокировок и взаимные дедлоки (deadlocks) в таблицах изменений планов обмена.
1. Идентификация зависшего сеанса через Консоль администрирования или RAC
Определите зависший фоновый процесс с помощью консольной утилиты администрирования кластера 1С (rac):
# Получение списка кластеров
rac cluster list localhost:1545
# Поиск зависших сессий обмена (по имени фонового задания)
rac session list --cluster=<ID_Кластера> localhost:1545 | grep -B 5 -A 10 "ВыполнениеОбмена"2. Принудительное завершение зависшей сессии
# Завершение конкретной сессии по ее ID
rac session terminate --cluster=<ID_Кластера> --session=<ID_Сессии> localhost:15453. Программный сброс блокировок регламентных заданий в базе 1С
&НаСервере
Процедура ЗавершитьЗависшиеФоновыеОбмены()
Отбор = Новый Структура;
Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
Отбор.Вставить("Ключ", "СинхронизацияДанных"); // Ключ задания обмена
Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для Каждого Задание Из Задания Цикл
Попытка
Задание.Отменить();
ЗаписьЖурналаРегистрации("РИБ", УровеньЖурналаРегистрации.Предупреждение,,,
"Принудительно отменено зависшее фоновое задание РИБ: " + Задание.УникальныйИдентификатор);
Исключение
ЗаписьЖурналаРегистрации("РИБ", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры4. Оптимизация времени блокировок в коде чтения сообщения
Установите жесткий таймаут блокировки данных при чтении изменений узла:
&НаСервере
Процедура ПрочитатьСообщениеРИББезопасно(УзелОбмена, ПутьКФайлу)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, 100); // Чтение порциями по 100 объектов
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
КонецПроцедуры Частые вопросы (FAQ)
Почему зависает фоновое задание обмена РИБ?
Основная причина — конфликты блокировок таблиц базы данных между активными пользователями и фоновым заданием, выполняющим массовую запись объектов без разбивки на транзакции.
Как временно отключить автообмен РИБ для проведения регламентных работ?
Отключите регламентное задание 'Синхронизация данных' или заблокируйте работу регламентных заданий в свойствах информационной базы через консоль администрирования кластера.
Что делать, если сеанс не завершается даже через консоль кластера?
Завершите соответствующий SPID сессии на уровне СУБД (KILL <SPID> в MS SQL или pg_terminate_backend(PID) в PostgreSQL).
Как разблокировать узел РИБ при несовпадении версий конфигурации?
Запустите базу с параметром командной строки /ResetMasterNode /DisableUnrecoverableUpdateChecks для временного отвязывания узла от главного и наката конфигурации.