К статье
Практический материал

Администрирование · 11 мин

1С: сервер захвачен пользователем СУБД — что это значит и как устранить

Разбираем ошибку «Сервер 1С:Предприятия захвачен пользователем СУБД»: причины блокировок, как найти зависший сеанс в MS SQL и PostgreSQL и безопасно его снять.

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

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

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

Что означает сообщение о захвате сервера

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

Вторая распространённая ситуация — администратор баз данных подключился к базе напрячую через Management Studio, pgAdmin или консольную утилиту и выполняет операции, которые удерживают монопольные блокировки. С точки зрения кластера 1С это выглядит как постороннее вмешательство.

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

Типичные причины ошибки

Чтобы выбрать правильное действие, сначала определите, какой сценарий реализовался. Причины условно делятся на четыре группы.

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

Проверьте активные сеансы в консоли кластера и список процессов в СУБД

Ошибка после перезапуска сервераОстались «осиротевшие» соединения

Проверьте соединения в MS SQL (sp_who2) или PostgreSQL (pg_stat_activity)

Ошибка во время обновленияИдёт монопольная операция

Дождитесь завершения или проверьте, не завис ли процесс обновления

Администратор работал с базой напрямуюРучное подключение к СУБД

Завершите сессию в Management Studio / pgAdmin и закройте соединение

Как диагностировать источник захвата

Начните с консоли кластера серверов 1С. Откройте ветку нужной информационной базы и посмотрите список сеансов и соединений. Если сеансов нет, а ошибка сохраняется — проблема на стороне СУБД. Также проверьте свойства информационной базы в консоли: не установлена ли блокировка соединений и не указано ли сообщение блокировки, которое могло остаться после регламентных работ.

Далее перейдите на уровень СУБД. Для MS SQL Server выполните запрос к системным представлениям, чтобы увидеть активные соединения с конкретной базой. Для PostgreSQL используйте представление pg_stat_activity. Цель — найти процессы, которые подключены к базе, но не принадлежат рабочим процессам кластера 1С, либо зависшие транзакции в состоянии idle in transaction.

sql
-- MS SQL: кто подключён к базе
SELECT session_id, login_name, host_name, program_name, status, last_request_start_time
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID('ИмяБазы');

-- PostgreSQL: активные и зависшие соединения
SELECT pid, usename, application_name, state, query_start, state_change
FROM pg_stat_activity
WHERE datname = 'ИмяБазы';

Обратите внимание на поле program_name (MS SQL) или application_name (PostgreSQL): рабочие процессы 1С обычно идентифицируются как rphost. Соединения от Management Studio, sqlcmd, pgAdmin, psql или неизвестных приложений — кандидаты на источник захвата.

Пошаговое устранение проблемы

Действуйте от менее рискованных мер к более радикальным. Не начинайте с перезагрузки сервера СУБД — это крайняя мера, которая обрывает все транзакции.

Порядок действий
  1. 1
    В консоли кластера 1С проверьте сеансы: завершите зависшие сеансы пользователей штатно через кнопку «Удалить»
  2. 2
    Проверьте свойства информационной базы: снимите блокировку соединений, если она осталась после регламентных работ
  3. 3
    В СУБД найдите посторонние или зависшие соединения с базой и завершите их (KILL в MS SQL, pg_terminate_backend в PostgreSQL)
  4. 4
    Если соединения завершить не удаётся или ошибка повторяется — перезапустите службу агента сервера 1С, предупредив пользователей
  5. 5
    После восстановления доступа проверьте журнал регистрации и технологический журнал на предмет повторения ситуации

Завершение процесса в MS SQL выполняется командой KILL с номером session_id, в PostgreSQL — функцией pg_terminate_backend(pid). Перед завершением убедитесь, что процесс действительно завис, а не выполняет важную операцию: посмотрите время последнего запроса и текст текущей команды.

Профилактика повторения ошибки

Чтобы захват не повторялся, упорядочьте регламентные работы. Все операции с базой напрямую через СУБД выполняйте только в согласованные окна обслуживания, когда пользователи отключены, и закрывайте сессии после завершения. Не оставляйте открытыми окна Management Studio с активными транзакциями.

Настройте в консоли кластера автоматическое завершение зависших сеансов: параметры «интервал перезапуска», «допустимый объём памяти» рабочих процессов и таймауты соединений помогают кластеру самостоятельно освобождать ресурсы. Для баз на PostgreSQL полезно настроить параметры idle_in_transaction_session_timeout, чтобы СУБД сама обрывала забытые транзакции.

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

Типичные ошибки
01
Перезагрузка сервера СУБД «вслепую» — обрывает все транзакции и может привести к длительному восстановлению базы при старте
02
Завершение процесса, выполняющего обновление конфигурации — риск получить базу в состоянии, требующем восстановления из копии
03
Работа с базой напрямую через СУБД без блокировки соединений — пользователи продолжают подключаться и создают конфликты
04
Игнорирование повторяющихся захватов — если ошибка возникает регулярно, нужен анализ технологического журнала, а не постоянное ручное снятие блокировок

Когда привлекать специалиста

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

Маршрут решения

Как выбрать действие

В консоли кластера виден зависший сеанс пользователяЗавершите сеанс штатно через консоль кластера
Сеансов нет, но в СУБД есть посторонние соединенияЗавершите их командой KILL или pg_terminate_backend
Идёт обновление конфигурации или регламентная операцияНе вмешивайтесь, дождитесь завершения и следите по журналу
Ошибка повторяется регулярно без явной причиныВключите технологический журнал и привлеките специалиста для анализа
Итог

Что важно запомнить

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

Частые вопросы

Означает ли эта ошибка, что сервер взломали?

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

Можно ли просто перезагрузить сервер, чтобы ошибка ушла?

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

Почему ошибка появилась после обновления конфигурации?

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

Как завершить зависшее соединение в PostgreSQL?

Найдите нужный процесс запросом к pg_stat_activity по имени базы, затем выполните SELECT pg_terminate_backend(pid) с идентификатором процесса. Перед завершением посмотрите поле state и query: если процесс активно выполняет важную операцию, принудительное завершение откатит транзакцию.

Ошибка повторяется каждый день примерно в одно время — что это?

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

Нужна ли резервная копия перед снятием блокировок?

Завершение зависшего пользовательского сеанса обычно безопасно и копии не требует. Но если предстоит обрывать транзакции на стороне СУБД, перезапускать службы после аварийной ситуации или есть подозрение на повреждение данных — убедитесь, что актуальная резервная копия существует и проверена на возможность восстановления.