Поиск в 1С не заканчивается: чем остановить зависший запрос на клиенте, сервере и в СУБД
Содержание
Прервать поиск в 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С, чтобы фокус был в нём.
- Нажмите
Ctrl+Break. На полноразмерной клавиатуреBreak— это клавишаPause/Breakсправа отScroll Lock. - Подтвердите прерывание в появившемся вопросе.
- Подождите. Платформа проверяет запрос на прерывание не мгновенно, а в определённых точках выполнения. Длинный запрос к СУБД обычно останавливается после его завершения или отмены на стороне сервера.
На ноутбуках клавиши Pause часто нет. Два варианта, которые встречаются у разных производителей:
- ⌨️
Ctrl+Fn+B; - ⌨️
Ctrl+Fn+Pause(еслиPauseнанесена на другую клавишу второй функцией).
Сочетание зависит от модели, поэтому проверьте его заранее на безобидной операции, а не в момент аварии.
Закрытие формы крестиком во время долгого поиска не работает: пока идёт серверный вызов, клиент не обрабатывает действия пользователя. Крестик сработает уже после ответа сервера.
После прерывания данные не портятся. Если поиск шёл внутри записи документа, транзакция откатывается, и документ остаётся в прежнем состоянии.
Поиск, отчёт или фоновое задание
Не каждая долгая операция блокирует окно. В современных типовых конфигурациях часть отчётов и обработок запускается фоновым заданием: окно отвечает, а работа идёт отдельно. Такое задание видно в списке фоновых заданий: Главное меню → Функции для технического специалиста → Стандартные → Фоновые и регламентные задания. Если пункта «Функции для технического специалиста» нет, его включают в параметрах: Главное меню → Сервис → Параметры, флажок про отображение этой команды.
Консоль кластера и rac: прервать вызов в серверной базе
Когда Ctrl+Break не помогает, а база клиент-серверная, работают с сервером 1С. В кластере три вида процессов, и путать их не стоит:
- 🧭
ragent— агент сервера, слушает порт 1540, к нему подключается консоль; - 📋
rmngr— менеджер кластера (порт 1541), ведёт список баз, сеансов и блокировок; - ⚙️
rphost— рабочие процессы, где и выполняется код и запросы пользователей.
Сеансами управляют не через rmngr напрямую, а через консоль администрирования или утилиту rac. Обе обращаются к кластеру, а тот уже командует рабочими процессами.
Через консоль «Администрирование серверов 1С:Предприятия»
- Откройте консоль и разверните
Центральные серверы 1С:Предприятия → имя сервера → Кластеры → кластер → Информационные базы → нужная база → Сеансы. - Найдите сеанс пользователя по колонкам «Пользователь» и «Компьютер».
- Сверьте, что сеанс действительно работает: у активного вызова растёт время текущего вызова и время вызова СУБД.
- В контекстном меню сеанса выберите команду прерывания текущего серверного вызова. Пользователь получит ошибку, а его сеанс останется жив.
- Если прерывание не помогло, удалите сеанс целиком. Это равносильно принудительному выходу пользователя из программы.
Удаление сеанса обрывает работу пользователя без сохранения. Незаписанные формы пропадут. Предупредите человека, прежде чем нажимать.
Через 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 несколько минут.
- Откройте Диспетчер задач:
Ctrl+Shift+Esc. - На вкладке «Подробности» найдите
1cv8c.exe(тонкий клиент) или1cv8.exe(толстый клиент, а также Конфигуратор). - Если открыто несколько баз, ориентируйтесь по столбцу с загрузкой процессора: зависший поиск обычно занимает ядро.
- Нажмите «Снять задачу».
Что будет после этого в каждом режиме:
| Режим | Результат снятия клиента |
|---|---|
| Файловая база | Запрос остановлен вместе с процессом. Незаписанные изменения потеряны. |
| Клиент-серверная | Окно закрыто, но сеанс на сервере какое-то время продолжает вызов. Его надо удалить в консоли кластера. |
Не снимайте 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. Программа внутри него продолжает работать, вместе с долгим поиском.
Что делать:
- Подключитесь к своему сеансу снова и нажмите
Ctrl+Breakв окне 1С. - Если окно не отвечает, сочетание
Ctrl+Alt+Delвнутри RDP не сработает — используйтеCtrl+Alt+End, затем Диспетчер задач. - Администратор терминального сервера может снять процесс на вкладке «Пользователи» Диспетчера задач, развернув вашу учётную запись.
Снимать нужно только процесс своего пользователя. На терминальном сервере рядом работают десятки таких же 1cv8c.exe.
Облако и веб-клиент
В облачных сервисах с публикацией 1С доступа к консоли кластера и к СУБД у пользователя нет. Возможности ограничены:
- ⌨️
Ctrl+Breakв окне тонкого клиента — работает так же, как в обычной серверной базе; - 🌐 в браузере закрытие вкладки не останавливает вызов на сервере, он доработает до конца;
- 📨 если сеанс завис и не даёт войти снова, пишите в поддержку провайдера с указанием времени и имени пользователя.
Повторный вход во время зависания добавляет ещё один сеанс. Если лицензий мало, коллеги могут не войти, поэтому не открывайте базу заново по нескольку раз подряд.
Почему поиск в 1С зависает и как это предотвратить
Остановка запроса снимает симптом. Чтобы поиск не зависал снова, разберитесь с причиной.
Частые причины долгого поиска
- 🔍 Поиск по подстроке в большом списке. Строка поиска в списке с режимом «содержит» читает таблицу целиком, индексы тут не помогают.
- 📅 Нет ограничения по периоду. Отбор журнала документов за всё время в базе за пять лет — это миллионы строк.
- 🔒 Ожидание блокировки. Запрос на самом деле не работает , а ждёт, пока другой сеанс закончит запись. Отсюда характерное «висит, но процессор свободен».
- 📊 Отчёт с детализацией до документа без отбора. Пользователь ждёт таблицу на десятки тысяч строк.
- 🧩 Неоптимальный запрос в доработке: соединение с подзапросом, отбор по реквизиту через точку, обращение к виртуальной таблице без параметров.
- 🗄 Устаревшая статистика СУБД. Планировщик выбирает плохой план, и привычный запрос внезапно идёт минутами.
Что настроить
- Полнотекстовый поиск. Включите и обновляйте индекс:
Администрирование → Общие настройки → Полнотекстовый поиск. Поиск по индексу работает за секунды там, где перебор строк идёт минутами. - Отборы вместо поиска. Учите пользователей сначала ставить период и организацию, потом искать.
- Регламентные операции СУБД. Обновление статистики и обслуживание индексов по расписанию, ночью.
- Ограничения потребления ресурсов. В консоли кластера можно настроить счётчики потребления ресурсов и ограничения по ним. Ограничение по длительности серверного вызова умеет само прервать вызов, превысивший порог, например 10 минут. Порог подбирайте аккуратно: закрытие месяца в крупной базе честно идёт дольше.
- Журнал регистрации и технологический журнал. Они показывают, какой именно запрос шёл долго и кто его запустил. Без этих данных оптимизация превращается в угадывание.
Если зависания совпадают по времени у нескольких пользователей, ищите не тяжёлый запрос, а блокировку. В консоли кластера у ожидающих сеансов растёт время вызова при почти нулевом потреблении процессора.