Как принудительно завершить зависший отчет в 1С 8.3, который нагружает сервер

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

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

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

Почему удаление сеанса в консоли 1С не решает проблему

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

  1. Сеанс (Session) — это логическое подключение пользователя к метаданным и коду конфигурации 1С.
  2. Соединение (Connection) — это физический канал связи между рабочим процессом 1С (rphost.exe) и сервером СУБД (MS SQL, PostgreSQL и др.).

Когда выполняется сложный и объемный запрос, рабочий процесс rphost.exe передает его СУБД и переходит в режим ожидания ответа. Если в этот момент администратор удаляет сеанс пользователя через консоль 1С, менеджер кластера помечает сеанс как закрытый. Однако само физическое соединение с базой данных остается активным до тех пор, пока СУБД не завершит обработку тяжелого SQL-запроса и не вернет результат рабочему процессу. Именно поэтому удаленное соединение снова «возрождается» и продолжает потреблять ресурсы процессора.

Ниже мы подробно разберем по шагам безопасные и надежные способы устранения этой проблемы.

Способ 1. Точечное прерывание запроса на стороне СУБД (Рекомендуемый метод)

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

Рассмотрим по шагам, как связать зависший процесс в 1С с конкретным потоком базы данных:

  1. Откройте утилиту «Администрирование серверов 1С Предприятия».
  2. Перейдите в ветку вашей информационной базы и откройте раздел «Соединения».
  3. Найдите строку зависшего соединения (ее можно определить по времени захвата СУБД или сопоставив с именем пользователя, если сеанс еще активен).
  4. Обратите внимание на колонку «Идентификатор соединения СУБД». Этот уникальный номер (в MS SQL он называется SPID, а в PostgreSQL — PID) нам и понадобится.

После того как идентификатор получен, выполните операцию прерывания на стороне вашей СУБД.

Для систем на базе Microsoft SQL Server:

Запустите среду SQL Server Management Studio (SSMS), откройте окно создания нового запроса и выполните команду принудительной остановки процесса:


-- Замените 123 на полученный из консоли 1С Идентификатор соединения СУБД (SPID)
KILL 123;

Эта команда дает указание MS SQL Server немедленно остановить выполнение транзакции, запустить процесс отката изменений (если они были) и закрыть поток. Спустя несколько секунд фантомное соединение пропадет и в консоли 1С.

Для систем на базе PostgreSQL:

Если вы используете PostgreSQL, подключитесь к СУБД через утилиту pgAdmin или консольный клиент psql и выполните следующую команду:


-- Замените 4567 на PID процесса, полученный в консоли 1С
SELECT pg_terminate_backend(4567);

Функция pg_terminate_backend отправляет сигнал завершения операционной системе СУБД, что гарантирует быстрое освобождение ресурсов.

Способ 2. Мягкий вывод рабочего процесса rphost из работы

Что делать, если у вас нет прямого административного доступа к СУБД, а зависший рабочий процесс rphost.exe продолжает грузить сервер приложений 1С? В платформе 1С 8.3 реализован отличный механизм отказоустойчивости, который позволяет изолировать проблемный рабочий процесс.

Проанализируем этот алгоритм совместных действий:

  1. В консоли администрирования 1С перейдите в раздел «Рабочие процессы» вашего кластера.
  2. Найдите процесс rphost, на котором запущено зависшее соединение (ориентируйтесь по показателям загрузки процессора и памяти). Также запишите его системный идентификатор PID (указан в свойствах процесса).
  3. Откройте свойства этого рабочего процесса и снимите флаг «Включен» (или установите значение «Использовать» -> «Нет»).
  4. Что произойдет далее: кластер 1С моментально перестанет распределять новые клиентские подключения на этот рабочий процесс. Все активные пользователи, которые работали на этом rphost, начнут постепенно и бесшовно для себя мигрировать на другие, работающие процессы кластера.
  5. Подождите некоторое время (обычно от 5 до 15 минут), пока на отключенном процессе не останется никого, кроме нашего зависшего соединения.
  6. Теперь вы можете безопасно завершить работу этого конкретного процесса rphost.exe. Для этого откройте Диспетчер задач на сервере приложений 1С (или используйте командную строку), найдите процесс по ранее записанному PID и нажмите «Снять задачу».

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

Способ 3. Перевод базы данных в однопользовательский режим (Для экстренных случаев)

Иногда возникают ситуации, когда зависший отчет намертво заблокировал таблицы базы данных (вызвал дедлок), из-за чего невозможно провести обновление конфигурации или запустить критически важные регламентные операции, а точечный KILL по какой-то причине не срабатывает. В таком случае поможет принудительный сброс всех подключений к конкретной базе данных через перевод её в Single User Mode.

Разберем этот сценарий на примере MS SQL Server. Выполните в SSMS следующий скрипт:


USE master;
ALTER DATABASE [Имя_Вашей_Базы_1С] 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE;

ALTER DATABASE [Имя_Вашей_Базы_1С] 
SET MULTI_USER;

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

Рекомендации по профилактике зависаний

Чтобы минимизировать появление подобных проблем в будущем, рекомендуем выполнить базовые настройки кластера 1С:

← На главную