Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем крайне неприятную ситуацию, с которой часто сталкиваются технические специалисты и администраторы при развертывании новых информационных баз. Представьте: вы создаете абсолютно чистую, новую файловую базу конфигурации 1С:Розница 2.2 (базовую или ПРОФ), запускаете ее в режиме «Предприятие» для первоначальной настройки, но вместо привычного помощника заполнения получаете критический сбой: «Ошибка снятия блокировки объекта. Объект не заблокирован». При этом база закрывается, не давая пользователю совершить ни одного действия.
Давайте вместе проанализируем эту ситуацию, выясним внутренние технические причины ее возникновения и рассмотрим проверенные практические способы решения проблемы, начиная с самого простого и заканчивая альтернативными методами обхода ошибки.
Для начала давайте разберемся, почему эта ошибка возникает именно при первом запуске конфигурации. Любое современное решение от компании 1С (включая «1С:Розница») построено на базе Библиотеки стандартных подсистем (БСП). При первом запуске пустой информационной базы БСП выполняет колоссальный объем работы в фоновом режиме:
В файловом варианте работы базы данных регламентные задания выполняются в фоновых потоках под управлением того же клиентского сеанса. В определенный момент происходит конфликт потоков: основной поток инициализации и фоновое задание одновременно пытаются обратиться к одному и тому же служебному объекту (например, к узлу плана обмена). Одному из потоков не удается установить блокировку на объект, транзакция откатывается, и срабатывает обработчик исключения.
В коде БСП прописан вызов метода РазблокироватьДанныеДляРедактирования(). Однако из-за специфического бага в некоторых релизах технологической платформы (в частности, в популярной сборке 8.3.10.2699) уникальный идентификатор формы (УИД) или контекст блокировки передается некорректно. Платформа пытается снять блокировку с объекта, который фактически не был заблокирован текущим сеансом, падает в критическую ошибку и аварийно завершает работу.
Теперь, когда мы понимаем физику процесса, давайте перейдем к методам устранения этой коллизии.
Как показывает практика и опыт практикующих специалистов, наиболее надежным и правильным решением является обновление технологической платформы «1С:Предприятие».
Баг с некорректной передачей контекста блокировок в файловом режиме был официально признан разработчиками 1С и успешно устранен в последующих релизах. Для решения проблемы выполните следующие шаги:
Примечательно: после того как база успешно выполнит первый запуск и запишет все первичные настройки под обновленной платформой, ее можно будет без проблем открывать и использовать даже на старых релизах платформы (например, на той же 8.3.10.2699), если по каким-то организационным причинам вам необходимо остаться именно на ней.
Если у вас нет возможности оперативно обновить платформу (например, на рабочем месте строго регламентирован софт или ограничены права администратора), мы можем обойти ошибку, временно запретив платформе запускать фоновые процессы. Без конкуренции потоков первый запуск пройдет гладко.
Рассмотрим, как запустить базу с отключенными регламентными заданиями:
/C "ЗапуститьРегламентныеЗадания=Ложь"
Этот параметр сообщает механизмам БСП, что при инициализации не нужно активировать планировщик регламентных заданий. База запустится, спокойно выполнит все процедуры первого старта. После того как вы увидите рабочий интерфейс программы, закройте ее, удалите этот параметр из настроек запуска и пользуйтесь базой в штатном режиме.
Еще один проверенный обходной путь — принудительный запуск сеанса в режиме толстого клиента. В этом режиме клиентская и серверная части файловой базы работают в едином адресном пространстве процесса, что исключает ошибки синхронизации УИД форм при передаче контекста блокировок.
Давайте разберем по шагам, как это сделать:
Если вы уже пробовали запускать базу, и она аварийно завершалась, в каталоге базы данных могли остаться «зависшие» транзакционные файлы блокировок, которые мешают последующим корректным запускам даже после обновления платформы.
Для гарантированного устранения проблемы выполните ручную очистку папки базы данных:
1cv8.exe или 1cv8c.exe отсутствуют в памяти.1Cv8.1CD. Нас особенно интересуют файлы с расширениями *.1CL, *.1CO, а также любые папки и файлы, содержащие в названии 1Cv8tmp или v8users.Если вы столкнулись с аналогичной проблемой в нетиповой конфигурации или в версии ПРОФ, где разрешено использование расширений или изменение кода, вы можете обезопасить процедуру снятия блокировки. Для этого необходимо найти проблемный участок кода (обычно это общие модули работы с обменом данными или регламентными заданиями) и обернуть вызов платформенного метода в безопасную конструкцию Попытка ... Исключение.
Проанализируем пример реализации такого обхода в коде:
// Вместо прямого вызова метода разблокировки:
// РазблокироватьДанныеДляРедактирования(ОбъектСсылка, УникальныйИдентификатор);
// Используем безопасную конструкцию:
Попытка
РазблокироватьДанныеДляРедактирования(ОбъектСсылка, УникальныйИдентификатор);
Исключение
// Если объект не был заблокирован, платформа вызовет исключение.
// Мы его перехватываем и игнорируем, позволяя коду выполняться дальше.
ЗаписьЖурналаРегистрации(
"БлокировкиДанных",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Попытка снять несуществующую блокировку успешно обойдена: " + ОписаниеОшибки()
);
КонецПопытки;
Данный подход гарантирует, что даже при возникновении коллизии контекстов ваша программа не закроется аварийно, а продолжит корректную работу, зафиксировав инцидент в журнале регистрации для последующего анализа.
Мы подробно рассмотрели все возможные варианты решения проблемы. Наш совет — всегда поддерживайте технологическую платформу 1С в актуальном состоянии, так как большинство подобных системных ошибок оперативно исправляется разработчиками в новых релизах. Желаем вам стабильной и бесперебойной работы ваших систем автоматизации!