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