Как снять зависший сеанс и блокировку базы данных в 1С:Предприятии 8.3?

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

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

Причины возникновения проблемы

В архитектуре клиент-серверной платформы 1С за учет активных сеансов и распределение транзакционных блокировок отвечает менеджер кластера (rmngr), а выполнение операций пользователей происходит внутри рабочих процессов (rphost). Проанализируем, почему блокировка может остаться активной при отсутствии видимого сеанса:

  1. Аварийное завершение сеанса при монопольной операции: Если во время обновления метаданных или реструктуризации произошел сетевой сбой либо процесс клиента был принудительно снят, рабочий процесс rphost может освободить подключение к СУБД, однако менеджер кластера rmngr сохраняет информацию о монопольной блокировке во внутреннем кэше и сеансовых файлах.
  2. Механизм спящих сеансов: При разрыве соединения платформа переводит сеанс в состояние «спящего». В некоторых релизах платформы (включая ветку 8.3.7) из-за системных ошибок спящие сеансы удерживают блокировки таблиц даже после истечения установленного таймаута и не удаляются автоматически.
  3. Повреждение контекста сеансовых данных: Информация о текущем состоянии сеансов кэшируется в специальных каталогах на диске сервера (папки с префиксом snccntx). При некорректном завершении процессов эти файлы не очищаются, что приводит к удержанию блокировки при повторном старте.

Способ 1. Плавная ротация рабочих процессов без остановки сервера

Если сервер является рабочим (боевым) и на нем параллельно работают пользователи в других базах, перезапускать всю службу сервера приложений нежелательно. В этом случае применим методику ротации процессов rphost через консоль администрирования кластера:

  1. Открываем консоль администрирования серверов 1С:Предприятия и переходим в свойства кластера.
  2. Находим параметр Интервал перезапуска (по умолчанию он равен 0) и временно задаем ненулевое значение, например, 60 секунд.
  3. Кластер начнет процедуру мягкого перезапуска: создаются новые рабочие процессы rphost, на которые постепенно перенаправляются все живые сеансы и активные соединения.
  4. Зависшие и некорректно завершенные соединения остаются привязанными к старым процессам rphost.
  5. После того как все активные пользователи мигрируют на новые процессы, открываем диспетчер задач операционной системы и принудительно завершаем старые процессы rphost.exe по их идентификаторам (PID). Вместе с ними принудительно освобождаются удерживаемые блокировки.
  6. Возвращаем значение параметра Интервал перезапуска обратно в 0 (или устанавливаем регламентное значение для регулярной профилактики).

Способ 2. Удаление и повторная регистрация базы в кластере

Когда фантомная блокировка привязана к конкретной базе данных, а остальные информационные базы на сервере трогать нельзя, эффективен метод перерегистрации описания базы в кластере:

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

Способ 3. Полная очистка сеансовых файлов и перезапуск службы

Если регламент обслуживания позволяет перезапустить службы сервера 1С, наиболее надежным способом является остановка процессов и удаление временных файлов сеансовых данных из каталога srvinfo. Все данные о блокировках хранятся в подпапках вида snccntx* внутри каталога реестра кластера (по умолчанию путь: C:\Program Files\1cv8\srvinfo\reg_1541).

Рассмотрим автоматизированный командный скрипт (батч-файл), выполняющий корректную остановку служб, гарантированное завершение зависших процессов и очистку временных контекстов блокировок:


set SERVICE_1C_NAME="1C:Enterprise 8.3 Server Agent (x86-64)"
set SERVICE_RAS_NAME="1C:Enterprise 8.3 Remote Server"
set CNTX_PATH="C:\Program Files\1cv8\srvinfo\reg_1541"
set PFL_PATH="C:\ProgramData\1C\1cv8"
set TEMP_PATH="C:\Windows\Temp"

sc stop %SERVICE_1C_NAME%
sc stop %SERVICE_RAS_NAME%
timeout /t 5

taskkill /f /im "rphost.exe"
taskkill /f /im "rmngr.exe"
taskkill /f /im "ragent.exe"
taskkill /f /im "ras.exe"
timeout /t 5

DEL /Q /F /S "%CNTX_PATH%\snccntx*"
DEL /Q /F "%PFL_PATH%\*.pfl"
DEL /Q /F /S "%TEMP_PATH%\*.*"

sc start %SERVICE_1C_NAME%
sc start %SERVICE_RAS_NAME%

Обратите внимание: удаление файлов snccntx* при работающей службе ragent заблокировано операционной системой, поэтому процедура выполняется строго после остановки сервера 1С.

Способ 4. Принудительное завершение сеансов через утилиту rac

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

  1. Запрашиваем список всех зарегистрированных сеансов кластера: rac session --cluster=<Идентификатор_Кластера> list
  2. Находим в выводе идентификатор зависшего сеанса (параметр session) проблемной базы.
  3. Выполняем команду немедленного завершения сеанса:
    
    rac session --cluster=<Идентификатор_Кластера> terminate --session=<Идентификатор_Сеанса>
    

Рекомендации по предотвращению зависания блокировок

Для минимизации подобных сбоев на рабочем сервере рекомендуется выполнить следующие настройки:

  1. Настройка параметров спящих сеансов: В свойствах кластера установите параметр Время засыпания пассивных сеансов (например, 1200 секунд) и Время завершения спящих сеансов (например, 120 секунд). Это заставит кластер автоматически уничтожать неактивные подключения.
  2. Разделение контуров: Не размещайте тестовые и рабочие базы в рамках одного кластера серверов 1С. Для баз разработки и тестирования создавайте отдельный экземпляр службы с нестандартными портами (например, 1641/1640), чтобы любые зависания процессов можно было устранять локальным перезапуском службы без риска для пользователей боевой системы.
  3. Использование кода разрешения: Перед выполнением монопольных операций всегда устанавливайте блокировку начала сеансов с указанием параметра кода разрешения (/uc), что исключит подключение фоновых заданий во время обновления конфигурации.
← На главную