При работе в конфигурациях с режимом блокировки «Автоматические и управляемые» разработчики часто сталкиваются с ситуацией, когда стандартный метод Удалить() вызывает исключение: «Ошибка использования Менеджера блокировок: Автоматический режим блокировки недопустим в этой транзакции». Давайте разберемся, почему это происходит и как устранить данную проблему.
Суть проблемы заключается в конфликте уровней изоляции транзакций. Когда конфигурация переведена в управляемый режим блокировок, система ожидает, что все действия внутри транзакции будут поддерживать этот стандарт. Однако метод Удалить() инициирует транзакцию, в рамках которой система пытается выполнить очистку всех связанных данных: удаление движений по регистрам, запись в планы обмена и проверку ссылочной целостности.
Если хотя бы один из объектов, задействованных в этом процессе (например, регистр накопления или регистр сведений), имеет установленный в конфигураторе режим блокировки «Автоматический», транзакция «заражается» этим режимом. В результате платформа блокирует выполнение операции, чтобы не нарушить целостность данных в управляемом режиме.
Самый правильный и надежный путь — это приведение всех объектов метаданных к единому стандарту блокировок. Проанализируем, что может влиять на удаление:
Для исправления проблемы последовательно переведите все вышеуказанные объекты в состояние «Управляемый» в свойствах конфигуратора.
Если вы уверены в отсутствии критических зависимостей, можно попробовать выполнить удаление объекта явно через транзакцию. Это позволяет системе лучше контролировать контекст выполнения. Рассмотрим пример кода:
НачатьТранзакцию();
Попытка
ОбъектУдаления = СсылкаНаОбъект.ПолучитьОбъект();
Если ОбъектУдаления <> Неопределено Тогда
ОбъектУдаления.Удалить();
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иногда явное открытие транзакции помогает платформе правильно обработать вызовы методов удаления, однако этот способ не сработает, если в метаданных жестко задан автоматический режим блокировки у зависимых объектов.
В исключительных случаях, когда необходимо удалить объект, а перенастройка всей конфигурации невозможна или занимает слишком много времени, можно временно изменить настройки самого документа:
Этот метод следует использовать с осторожностью, так как он является «костылем» и не устраняет саму причину архитектурного конфликта.
Если вы не можете найти объект-виновник, используйте Технологический журнал. Настройте его на событие EXCP (исключение). В лог-файле платформа запишет контекст вызова, который укажет на имя объекта (регистра, плана обмена или справочника), вызвавшего отказ транзакции. Именно этот объект и требует перевода в управляемый режим.
Помните, что чистота архитектуры — залог стабильной работы базы данных. Регулярная проверка режимов блокировки для новых регистров позволит избежать подобных проблем в будущем.