Поиск в 1С не заканчивается: чем остановить зависший запрос на клиенте, сервере и в СУБД

· 10 мин

Содержание

Прервать поиск в 1С проще всего сочетанием Ctrl+Break: платформа спросит, остановить ли выполнение, и после подтверждения вернёт управление окну. Если клавиши не помогают, остановить зависший запрос можно снаружи: в консоли кластера (команда прерывания текущего серверного вызова), через Диспетчер задач или прямо в СУБД.

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

Где выполняется поиск: файловая и клиент-серверная база

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

  • 📁 File="D:\Base\Buh" — файловая база. Поиск, отчёт, выборка идут внутри процесса 1cv8c.exe (тонкий клиент) или 1cv8.exe (толстый клиент) на вашем компьютере.
  • 🖥 Srvr="srv1c";Ref="buh" — клиент-серверная. Клиент только отправил вызов. Работу делает рабочий процесс rphost на сервере 1С, а сам запрос выполняет MS SQL или PostgreSQL.
  • 🌐 Адрес http://… или https://… — веб-публикация или облако. Клиент обращается к веб-серверу, дальше всё как в одном из двух вариантов выше.

Отсюда главное правило. В серверной базе снятие клиента в Диспетчере задач не останавливает запрос. Сеанс на сервере ещё какое-то время продолжает работу, держит блокировки и нагружает СУБД.

РежимГде идёт запросЧем надёжно остановить
Файловыйпроцесс клиента на ПКCtrl+Break, при зависании — завершить 1cv8c.exe / 1cv8.exe
Клиент-серверныйrphost + СУБДCtrl+Break, затем консоль кластера или rac
Облако, веб-клиентсервер провайдераCtrl+Break по возможности, дальше — поддержка провайдера

Ctrl+Break: штатная остановка поиска в окне 1С

Это первый и самый безопасный шаг. Платформа сама корректно откатывает незавершённую операцию.

  1. Щёлкните мышью по окну 1С, чтобы фокус был в нём.
  2. Нажмите Ctrl+Break. На полноразмерной клавиатуре Break — это клавиша Pause/Break справа от Scroll Lock.
  3. Подтвердите прерывание в появившемся вопросе.
  4. Подождите. Платформа проверяет запрос на прерывание не мгновенно, а в определённых точках выполнения. Длинный запрос к СУБД обычно останавливается после его завершения или отмены на стороне сервера.

На ноутбуках клавиши Pause часто нет. Два варианта, которые встречаются у разных производителей:

  • ⌨️ Ctrl+Fn+B;
  • ⌨️ Ctrl+Fn+Pause (если Pause нанесена на другую клавишу второй функцией).

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

Закрытие формы крестиком во время долгого поиска не работает: пока идёт серверный вызов, клиент не обрабатывает действия пользователя. Крестик сработает уже после ответа сервера.

После прерывания данные не портятся. Если поиск шёл внутри записи документа, транзакция откатывается, и документ остаётся в прежнем состоянии.

Поиск, отчёт или фоновое задание

Не каждая долгая операция блокирует окно. В современных типовых конфигурациях часть отчётов и обработок запускается фоновым заданием: окно отвечает, а работа идёт отдельно. Такое задание видно в списке фоновых заданий: Главное меню → Функции для технического специалиста → Стандартные → Фоновые и регламентные задания. Если пункта «Функции для технического специалиста» нет, его включают в параметрах: Главное меню → Сервис → Параметры, флажок про отображение этой команды.

Консоль кластера и rac: прервать вызов в серверной базе

Когда Ctrl+Break не помогает, а база клиент-серверная, работают с сервером 1С. В кластере три вида процессов, и путать их не стоит:

  • 🧭 ragent — агент сервера, слушает порт 1540, к нему подключается консоль;
  • 📋 rmngr — менеджер кластера (порт 1541), ведёт список баз, сеансов и блокировок;
  • ⚙️ rphost — рабочие процессы, где и выполняется код и запросы пользователей.

Сеансами управляют не через rmngr напрямую, а через консоль администрирования или утилиту rac. Обе обращаются к кластеру, а тот уже командует рабочими процессами.

Через консоль «Администрирование серверов 1С:Предприятия»

  1. Откройте консоль и разверните Центральные серверы 1С:Предприятия → имя сервера → Кластеры → кластер → Информационные базы → нужная база → Сеансы.
  2. Найдите сеанс пользователя по колонкам «Пользователь» и «Компьютер».
  3. Сверьте, что сеанс действительно работает: у активного вызова растёт время текущего вызова и время вызова СУБД.
  4. В контекстном меню сеанса выберите команду прерывания текущего серверного вызова. Пользователь получит ошибку, а его сеанс останется жив.
  5. Если прерывание не помогло, удалите сеанс целиком. Это равносильно принудительному выходу пользователя из программы.

Удаление сеанса обрывает работу пользователя без сохранения. Незаписанные формы пропадут. Предупредите человека, прежде чем нажимать.

Через rac из командной строки

Утилите rac нужен запущенный сервер администрирования ras (по умолчанию порт 1545). Последовательность такая:

rem 1. Узнать идентификатор кластера
rac cluster list

rem 2. Посмотреть сеансы кластера
rac session list --cluster=<id_кластера>

rem 3. Прервать текущий серверный вызов сеанса
rac session interrupt-current-server-call --cluster=<id_кластера> --session=<id_сеанса> --error-message="Запрос остановлен администратором"

rem 4. Если не помогло — завершить сеанс
rac session terminate --cluster=<id_кластера> --session=<id_сеанса>

Если на кластере задан администратор, к командам добавляют --cluster-user и --cluster-pwd. Точный набор параметров для вашей версии платформы покажет rac session help.

В выводе rac session list полезны поля db-proc-info и db-proc-took. Первое показывает номер соединения в СУБД, которое сейчас занято сеансом. Этот номер пригодится, если придётся снимать запрос на уровне базы данных.

Диспетчер задач: когда снимать процесс 1С и чем это кончится

Принудительное завершение процесса — грубый метод. Применяйте его, когда окно не реагирует даже на Ctrl+Break несколько минут.

  1. Откройте Диспетчер задач: Ctrl+Shift+Esc.
  2. На вкладке «Подробности» найдите 1cv8c.exe (тонкий клиент) или 1cv8.exe (толстый клиент, а также Конфигуратор).
  3. Если открыто несколько баз, ориентируйтесь по столбцу с загрузкой процессора: зависший поиск обычно занимает ядро.
  4. Нажмите «Снять задачу».

Что будет после этого в каждом режиме:

РежимРезультат снятия клиента
Файловая базаЗапрос остановлен вместе с процессом. Незаписанные изменения потеряны.
Клиент-сервернаяОкно закрыто, но сеанс на сервере какое-то время продолжает вызов. Его надо удалить в консоли кластера.

Не снимайте rphost.exe на сервере ради одного пользователя. В одном рабочем процессе работают десятки сеансов. Все они оборвутся, пользователи увидят ошибку соединения и потеряют несохранённые данные. Кластер сам поднимет новый рабочий процесс, но работа людей уже прервана. Такой шаг допустим только вне рабочего времени или когда весь сервер и так стоит.

Остановка запроса на уровне СУБД: MS SQL и PostgreSQL

Уровень СУБД нужен, когда сеанс 1С уже удалён, а нагрузка на базу данных не падает. Или когда консоль кластера недоступна, а доступ к СУБД у вас есть.

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

Microsoft SQL Server

Смотрим активные запросы к базе 1С:

SELECT r.session_id, r.status, r.command,
       r.total_elapsed_time / 1000 AS sec,
       DB_NAME(r.database_id) AS db
FROM sys.dm_exec_requests r
WHERE DB_NAME(r.database_id) = 'buh'
ORDER BY r.total_elapsed_time DESC;

Номер session_id сверьте с полем db-proc-info сеанса 1С. Затем:

KILL 87;

где 87 — номер найденного соединения.

PostgreSQL

SELECT pid, state, now() - query_start AS duration, left(query, 80)
FROM pg_stat_activity
WHERE datname = 'buh' AND state = 'active'
ORDER BY duration DESC;

-- мягко: отменить только текущий запрос
SELECT pg_cancel_backend(12345);

-- жёстко: закрыть соединение целиком
SELECT pg_terminate_backend(12345);

Начинайте с pg_cancel_backend. Соединение остаётся, рабочий процесс 1С получает ошибку выполнения запроса и возвращает её пользователю.

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

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

Где идёт ваш зависший поиск?

Терминальный сервер, RDP и облачные сервисы

Работа через RDP

На терминальном сервере клиент 1С запущен не у вас, а на сервере. Закрытие окна удалённого рабочего стола крестиком только отключает сеанс Windows. Программа внутри него продолжает работать, вместе с долгим поиском.

Что делать:

  1. Подключитесь к своему сеансу снова и нажмите Ctrl+Break в окне 1С.
  2. Если окно не отвечает, сочетание Ctrl+Alt+Del внутри RDP не сработает — используйте Ctrl+Alt+End, затем Диспетчер задач.
  3. Администратор терминального сервера может снять процесс на вкладке «Пользователи» Диспетчера задач, развернув вашу учётную запись.

Снимать нужно только процесс своего пользователя. На терминальном сервере рядом работают десятки таких же 1cv8c.exe.

Облако и веб-клиент

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

  • ⌨️ Ctrl+Break в окне тонкого клиента — работает так же, как в обычной серверной базе;
  • 🌐 в браузере закрытие вкладки не останавливает вызов на сервере, он доработает до конца;
  • 📨 если сеанс завис и не даёт войти снова, пишите в поддержку провайдера с указанием времени и имени пользователя.

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

Почему поиск в 1С зависает и как это предотвратить

Остановка запроса снимает симптом. Чтобы поиск не зависал снова, разберитесь с причиной.

Частые причины долгого поиска

  • 🔍 Поиск по подстроке в большом списке. Строка поиска в списке с режимом «содержит» читает таблицу целиком, индексы тут не помогают.
  • 📅 Нет ограничения по периоду. Отбор журнала документов за всё время в базе за пять лет — это миллионы строк.
  • 🔒 Ожидание блокировки. Запрос на самом деле не работает , а ждёт, пока другой сеанс закончит запись. Отсюда характерное «висит, но процессор свободен».
  • 📊 Отчёт с детализацией до документа без отбора. Пользователь ждёт таблицу на десятки тысяч строк.
  • 🧩 Неоптимальный запрос в доработке: соединение с подзапросом, отбор по реквизиту через точку, обращение к виртуальной таблице без параметров.
  • 🗄 Устаревшая статистика СУБД. Планировщик выбирает плохой план, и привычный запрос внезапно идёт минутами.

Что настроить

  1. Полнотекстовый поиск. Включите и обновляйте индекс: Администрирование → Общие настройки → Полнотекстовый поиск. Поиск по индексу работает за секунды там, где перебор строк идёт минутами.
  2. Отборы вместо поиска. Учите пользователей сначала ставить период и организацию, потом искать.
  3. Регламентные операции СУБД. Обновление статистики и обслуживание индексов по расписанию, ночью.
  4. Ограничения потребления ресурсов. В консоли кластера можно настроить счётчики потребления ресурсов и ограничения по ним. Ограничение по длительности серверного вызова умеет само прервать вызов, превысивший порог, например 10 минут. Порог подбирайте аккуратно: закрытие месяца в крупной базе честно идёт дольше.
  5. Журнал регистрации и технологический журнал. Они показывают, какой именно запрос шёл долго и кто его запустил. Без этих данных оптимизация превращается в угадывание.

Если зависания совпадают по времени у нескольких пользователей, ищите не тяжёлый запрос, а блокировку. В консоли кластера у ожидающих сеансов растёт время вызова при почти нулевом потреблении процессора.

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

Сломается ли база, если прервать поиск или отчёт?
Нет. Поиск и отчёт только читают данные. Если прервана запись документа, транзакция откатывается целиком, и документ остаётся в состоянии до записи.
Почему после Ctrl+Break окно ещё минуту не отвечает?
Платформа ждёт ближайшей точки, где можно прервать выполнение. Пока СУБД отдаёт результат долгого запроса, клиенту приходится ждать. Повторно нажимать сочетание не нужно.
Можно ли прервать чужой зависший поиск, не выкидывая человека из 1С?
Да, в клиент-серверной базе. В консоли кластера есть команда прерывания текущего серверного вызова: вызов остановится, сеанс пользователя останется.
Почему пользователь закрыл 1С, а нагрузка на сервер осталась?
Серверный вызов продолжает выполняться и после закрытия клиента. Удалите сеанс в консоли кластера, а если и это не сняло нагрузку — отмените запрос в СУБД.
Сколько лицензий занимает зависший сеанс?
Столько же, сколько обычный, пока он не завершён. Поэтому после аварийного выхода такой сеанс стоит удалить, иначе он держит лицензию.