В процессе работы пользователей в клиент-серверном режиме нередко возникают массовые сообщения о превышении времени ожидания блокировки («Время ожидания истекло»), а при попытке выполнить регламентное тестирование и исправление (ТиИ) платформа выдает исключение: «Ошибка снятия блокировки объекта. объект не заблокирован». Разберем детально причины такого поведения платформы и СУБД, а также пошаговый алгоритм устранения неполадки.
Рассматриваемая ошибка свидетельствует о рассогласовании между состоянием пессимистических (объектных) блокировок в памяти сервера приложений 1С и фактическим состоянием транзакций в СУБД (MS SQL Server или PostgreSQL). Проанализируем основные факторы, вызывающие данный сбой:
Режим управления блокировкой данных в значении «Автоматический» параллельно с объектами в режиме «Управляемый» порождает неконтролируемые эскалации блокировок СУБД и взаимоблокировки (Deadlocks).Table Scan) вместо точечного поиска по индексу (Index Seek), что многократно увеличивает время удержания эксклюзивных блокировок.Первым действием необходимо полностью сбросить кэш сеансовых данных и настроек сервера приложений. Выполним следующие шаги:
1C:Enterprise 8 Server Adapter через оснастку управления службами (services.msc).C:\Program Files\1cv8\srvinfo\reg_1541 или C:\Program Files (x86)\1cv82\srvinfo\reg_1541).snccntx. Файлы конфигурации кластера (1CV8Reg.lst) при этом удалять не требуется.1C\1Cv8 и 1C\1Cv82 из папок %LocalAppData% и %AppData%, либо добавим ключ запуска /ClearCache в параметры запуска базы.Проверим наличие неактивных сеансов, которые могли заблокировать таблицы в СУБД:
Если конфигурация дорабатывалась, особое внимание уделим режимам управления блокировкой транзакций. Проанализируем настройки метаданных:
БлокировкаДанных в модулях на встроенном языке.Причиной внезапного появления массовых блокировок часто становится деградация планов выполнения запросов в MS SQL Server или PostgreSQL. Выполним комплекс регламентных процедур:
EXEC sp_updatestats;
SELECT) не блокировали операции записи (INSERT/UPDATE):
ALTER DATABASE [ИмяБазы] SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [ИмяБазы] SET ALLOW_SNAPSHOT_ISOLATION ON;
Если ошибка снятия блокировки возникает непосредственно в процессе тестирования и исправления, не следует запускать все проверки одновременно. Разделим процесс на отдельные итерации:
Если ошибка возникает в пользовательском режиме при записи или закрытии форм конкретных объектов, проверим модули объектов и форм на корректность снятия пессимистической блокировки. Вызов метода РазблокироватьДанныеДляРедактирования() должен быть защищен от попытки повторного освобождения:
Попытка
РазблокироватьДанныеДляРедактирования(Ссылка, УникальныйИдентификатор);
Исключение
// Подавляем ошибку, если объект уже был разблокирован платформой ранее
ЗаписьЖурналаРегистрации("СнятиеБлокировки",
УровеньЖурналаРегистрации.Примечание,
,
Ссылка,
ОписаниеОшибки());
КонецПопытки;
Комплексное применение описанных мер — очистка сеансового кэша, регламентное обновление статистик СУБД, выравнивание режимов блокировки и поэтапная проверка целостности — позволяет полностью устранить ошибку снятия блокировок и восстановить стабильную параллельную работу пользователей в информационной базе.