Как исправить ошибку, когда Конфигуратор блокирует сам себя и мешает обновить базу данных 1С?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Каждый администратор СУБД или разработчик 1С рано или поздно сталкивается с парадоксальной ситуацией: при попытке обновить конфигурацию базы данных или выгрузить информационную базу система выдает ошибку монопольного доступа, утверждая, что база занята другим сеансом Конфигуратора. При этом в самом Конфигураторе список активных пользователей пуст, а на сервере запущен ровно один сеанс. Данная коллизия в профессиональной среде называется «Блокировка есть, а сеанса нет».

В этой статье мы подробно разберем причины возникновения этой проблемы, проанализируем поведение платформы «1С:Предприятие» и предложим пошаговые методы устранения этой ошибки: от базовых манипуляций в консоли до продвинутых решений на уровне веб-сервера и MS SQL Server. Для решения подобных задач есть обработка принудительного завершения сеансов для обновления баз.

Выясняем причины: почему возникает фантомная блокировка?

Для начала проанализируем ситуацию и разберемся, из-за чего платформа начинает «считать», что база заблокирована. Существует несколько основных факторов:

  1. Зависшие RDP-сессии пользователей. Если разработчик или администратор работает через терминальный доступ (RDP) и закрывает окно терминала простым нажатием на крестик, его сеанс не завершается. Конфигуратор остается запущенным в неактивной сессии операционной системы, продолжая удерживать монопольную блокировку.
  2. Аварийный обрыв связи. При использовании нестабильного соединения (Wi-Fi, VPN-туннели) связь между клиентским компьютером и сервером приложений 1С может кратковременно разорваться. Сеанс Конфигуратора на стороне сервера аварийно завершается, но служба кластера не успевает корректно отработать закрытие транзакций и «забывает» снять монопольную блокировку с метаданных.
  3. Влияние веб-серверов IIS или Apache. Если база данных опубликована для веб-клиентов, модули расширения веб-сервера могут удерживать низкоуровневую блокировку таблиц СУБД, даже если в консоли кластера 1С сеансы пользователей уже не отображаются.
  4. Сбои при динамическом обновлении или реструктуризации. При выполнении тяжелых операций обновления (особенно при пересчете итогов или изменении структуры таблиц) и сопутствующем сбое электропитания сервера база данных может остаться в промежуточном («битом») состоянии, когда транзакционный лог переполнен, а таблицы конфигурации заблокированы на уровне СУБД.

Ниже мы рассмотрим пошаговые сценарии решения проблемы, начиная от простых и заканчивая более сложными административными методами.

Решение 1: Анализ и принудительное завершение сеансов в консоли администрирования 1С

Первым делом проверим не список активных пользователей в самом Конфигураторе, а реальное состояние дел в консоли администрирования серверов «1С:Предприятия».

Разберем этот процесс по шагам:

  1. Запустите утилиту «Администрирование серверов 1С Предприятия» — для этого подойдёт инструмент администрирования кластера и управления сеансами 1С.
  2. Раскройте ветку вашего центрального сервера, перейдите в раздел «Информационные базы» и выберите нужную базу данных.
  3. Перейдите на вкладку «Сеансы». Обратите внимание: именно «Сеансы», а не «Соединения», так как сеанс — это логическое понятие платформы, которое может продолжать жить даже при отсутствии физического сетевого соединения.
  4. Найдите в списке процессы с приложением Designer (Конфигуратор). Если вы видите «зависший» процесс вашего коллеги или свой собственный старый сеанс, нажмите на нем правой кнопкой мыши и выберите команду «Удалить» (или завершить).
  5. Дополнительно перейдите в раздел «Блокировки». Если там висит запись с пустыми полями «Сеанс» и «Компьютер», но с установленной монопольной блокировкой — удалите эту запись принудительно.

Решение 2: Проверка диспетчера задач в терминальном режиме (RDP)

Если сервер 1С работает под управлением операционной системы Windows Server и доступ к нему осуществляется через RDP, велика вероятность столкнуться со «спящими» сессиями. Для автоматического завершения таких сеансов и освобождения файлов базы подойдёт утилита для принудительного закрытия сессий 1С на терминальном сервере.

Выполним следующие действия:

  1. Зайдите на сервер приложений под учетной записью администратора.
  2. Откройте Диспетчер задач (Task Manager) и перейдите на вкладку «Пользователи» (Users).
  3. Проверьте, нет ли пользователей в состоянии «Отключен» (Disconnected). Если таковые имеются, разверните их список процессов.
  4. При обнаружении запущенного процесса 1cv8.exe завершите его принудительно, выбрав пункт «Снять задачу» (End Task). Это мгновенно освободит удерживаемые файлы базы данных (в случае файлового варианта) или снимет транзакции на сервере СУБД.

Решение 3: Остановка веб-сервера (для опубликованных баз)

Если ваша база данных опубликована на веб-сервере (например, IIS от Microsoft или Apache), службы публикации могут удерживать низкоуровневые соединения с базой.

Для исправления ситуации выполним быструю перезагрузку веб-компонентов:

iisreset /restart

После перезапуска веб-сервера все зависшие низкоуровневые сессии гарантированно закроются, освободив конфигурацию для обновления.

Решение 4: Метод создания дублирующего подключения («Бэкдор»)

В крупных организациях перезапуск службы сервера приложений 1С (ragent) недопустим, так как это прервет работу сотен пользователей в других информационных базах, находящихся на этом же кластере. В таком случае мы можем прибегнуть к хитрости — созданию временного подключения.

Рассмотрим этот алгоритм детально:

  1. Откройте консоль администрирования кластера 1С.
  2. Перейдите в свойства вашей проблемной базы данных и временно установите флаг «Блокировка начала новых сеансов включена». Это предотвратит вход обычных пользователей во время наших манипуляций.
  3. В параметрах этой же базы временно измените ее имя (алиас) в рамках кластера 1С (например, переименуйте из trade_db в trade_db_temp). Физическая база данных на MS SQL при этом никак не пострадает.
  4. Создайте в этой же консоли кластера новое подключение к вашей СУБД SQL. Назовите эту базу, например, trade_db_backdoor, указав те же самые параметры сервера SQL и имя физической базы данных.
  5. Поскольку для кластера 1С база trade_db_backdoor является абсолютно новой, на нее старая зависшая блокировка не распространяется!
  6. Запустите Конфигуратор через это новое подключение trade_db_backdoor. Система успешно зайдет в монопольном режиме. Проведите необходимое обновление базы данных.
  7. После успешного завершения обновления закройте Конфигуратор, удалите временное подключение trade_db_backdoor, верните старой базе ее исходное имя trade_db и снимите блокировку сеансов.

Решение 5: Перенос нагрузки на новый рабочий процесс rphost

Фантомные блокировки метаданных кэшируются оперативной памятью конкретного рабочего процесса rphost сервера приложений 1С. Мы можем заставить кластер освободить эти ресурсы без жесткого перезапуска всей службы 1С.

Разберем этот системный метод:

  1. В консоли администрирования кластера перейдите в ветку «Рабочие процессы».
  2. Создайте новый рабочий процесс rphost (если у вас настроен только один процесс).
  3. У того процесса, на котором сейчас «висит» фантомная блокировка вашей базы, откройте свойства и снимите флаг «Использовать» (или переведите его в режим выключения).
  4. Кластер 1С начнет автоматически перенаправлять все новые сеансы пользователей на вновь созданный чистый процесс rphost.
  5. Как только старый рабочий процесс освободится от активных пользователей, его можно будет безопасно завершить через Диспетчер задач операционной системы Windows (или с помощью команды kill в Linux). Вместе с процессом исчезнет и зависший фантом блокировки конфигурации.

Решение 6: Снятие сессии на уровне MS SQL Server

Если блокировка удерживается непосредственно на уровне таблиц базы данных в СУБД (например, заблокированы таблицы Config или DBNames), проблему можно решить средствами СУБД.

Рассмотрим пример устранения блокировки в среде Microsoft SQL Server:

  1. Запустите SQL Server Management Studio (SSMS) и подключитесь к вашему серверу баз данных — диагностику упрощает инструмент мониторинга блокировок и взаимоблокировок SQL.
  2. Откройте встроенный монитор активности Activity Monitor или запустите стандартную системную процедуру поиска блокировок, выполнив следующий SQL-запрос:

USE master;
GO
-- Получаем список активных процессов и блокировок
EXEC sp_who2;
  1. Проанализируйте колонку DBName (имя вашей базы 1С) и колонку ProgramName (ищите процессы, запущенные от имени 1С:Предприятия). Обратите внимание на колонку BlkBy (блокировано кем) — она указывает на идентификатор процесса (SPID), который удерживает монопольный доступ.
  2. Найдя мешающий процессу обновления SPID (например, процесс номер 54), выполните команду принудительного уничтожения этого соединения:

KILL 54;

После выполнения команды KILL СУБД моментально откатит незавершенную транзакцию зависшего процесса, и Конфигуратор сможет продолжить обновление структуры базы данных.

Решение 7: Восстановление базы после аварийного сбоя (физическое удаление лога транзакций)

В случае, если в процессе автоматического фонового обновления конфигурации (например, когда главный бухгалтер запустил процесс обновления из режима Предприятия через интернет) произошел сбой питания сервера, база может оказаться заблокированной из-за повреждения файла журнала транзакций (файла лога .ldf). Для предотвращения таких ситуаций полезна автоматическое отслеживание ошибок в журнале регистрации.

Если обычные методы ужимания лога (shrink) и переключение моделей восстановления базы данных (Recovery Model) из Full в Simple не помогают, используем следующий радикальный, но проверенный способ:

  1. В консоли MS SQL Server Management Studio временно отключите (Detach) поврежденную базу данных 1С от сервера.
  2. Перейдите в каталог на диске сервера, где физически хранятся файлы базы данных.
  3. Найдите файл журнала транзакций с расширением .ldf (например, trade_db_log.ldf) и переименуйте его либо удалите (предварительно сделав резервную копию основного файла данных .mdf!).
  4. В среде SQL Server Management Studio выполните команду подключения (Attach) файла данных .mdf заново. При этом СУБД обнаружит отсутствие файла лога и автоматически создаст новый, чистый и пустой файл журнала транзакций.
  5. Запустите в SQL-сервере проверку физической целостности таблиц базы данных с помощью команды:

DBCC CHECKDB ('Имя_Вашей_Базы') WITH NO_INFOMSGS, ALL_ERRORMSGS;

  1. После успешной проверки запустите Конфигуратор 1С и завершите отложенное обновление конфигурации базы данных. Теперь система отработает корректно и без ошибок.

Используя предложенные нами системные методы контроля процессов и блокировок, вы сможете оперативно решать подобные проблемы администрирования без необходимости полной перезагрузки физических серверов компании.

← На главную