Администрирование · 8 мин
Как прервать выполнение запроса в консоли запросов 1С
Как прервать зависший запрос в консоли запросов 1С: сочетание Ctrl+Break, отмена на клиенте и сервере, завершение сеанса, ограничения СУБД и профилактика тяжёлых запросов.
Тяжёлый запрос в консоли запросов способен «повесить» сеанс на десятки минут: интерфейс перестаёт отвечать, а на сервере СУБД продолжает крутиться дорогой план с полным сканированием таблиц. Прервать такое выполнение можно несколькими способами — от штатной комбинации клавиш до принудительного завершения сеанса через консоль кластера. Выбор зависит от того, где именно «застряло» выполнение: на клиенте, на сервере 1С или уже внутри СУБД.
Важно понимать: консоль запросов — это обычная обработка, и сама по себе она не управляет потоком выполнения. Когда вы нажимаете «Выполнить», запрос уходит на сервер, а дальше отмена возможна только средствами платформы 1С или СУБД. Поэтому универсальной кнопки «Стоп» в большинстве консолей нет, и нужно знать обходные пути.
Ниже разобраны рабочие способы прервать выполнение, их ограничения, проверка результата и меры, которые помогают не доводить до зависания вовсе.
Как работает отмена запроса в платформе 1С
Платформа 1С поддерживает прерывание длительных серверных вызовов с клиента. Пока выполняется запрос, клиентское приложение периодически опрашивает сервер, и команда прерывания может быть передана в выполняющийся код. Это работает для файлового и клиент-серверного режимов, но с оговорками.
Главное ограничение: если запрос уже передан в СУБД и выполняется внутри неё, платформа не всегда может мгновенно его снять. Отмена сработает, когда СУБД вернёт управление, либо потребуется вмешательство на уровне самой СУБД. В файловом режиме прерывание обычно срабатывает быстрее, так как нет отдельного сервера баз данных.
Способ 1: прерывание сочетанием Ctrl+Break
Стандартный приём — во время выполнения запроса нажать Ctrl+Break (на части клавиатур клавиша Break совмещена с Pause, тогда используется Ctrl+Pause). Платформа выдаст диалог с предложением прервать выполнение или продолжить ожидание.
Последовательность действий:
- Убедитесь, что окно клиента 1С активно (кликните по нему, если оно свёрнуто).
- Нажмите Ctrl+Break и подождите несколько секунд — реакция может быть не мгновенной.
- В появившемся диалоге выберите «Прервать».
- Дождитесь возврата управления в консоль запросов.
Если диалог не появился в течение минуты, клиент, скорее всего, полностью заблокирован ожиданием ответа сервера — переходите к завершению сеанса.
- 1Активируйте окно клиента 1С
- 2Нажмите Ctrl+Break (Ctrl+Pause)
- 3В диалоге выберите «Прервать»
- 4Дождитесь возврата управления
- 5Если реакции нет — завершите сеанс через консоль кластера
Способ 2: завершение сеанса через консоль кластера
Когда клиент «намертво» ждёт сервер, самый надёжный способ — завершить сеанс административно. Откройте консоль кластера серверов 1С (или администрирование через rac), найдите базу, раскройте список сеансов и определите свой сеанс по пользователю и времени начала.
Выделите сеанс и выполните «Удалить» (завершить сеанс). Клиент получит сообщение о разрыве соединения, а серверный вызов будет отменён. Это безопаснее, чем убивать процесс rphost, потому что затрагивается только ваш сеанс, а не все пользователи рабочего процесса.
Учтите: незавершённые транзакции сеанса будут откачены. Для консоли запросов это обычно не критично, так как запросы на чтение ничего не изменяют, но если консоль выполняла код с записью данных, возможны незаконченные операции.
Способ 3: остановка запроса на стороне СУБД
Если сеанс 1С завершён, а нагрузка на сервере баз данных осталась, значит запрос продолжает выполняться внутри СУБД. Такое бывает, когда СУБД не успела обработать отмену. Тогда запрос снимают инструментами самой СУБД.
Для MS SQL Server откройте Activity Monitor или выполните запрос к sys.dm_exec_requests, найдите сессию с вашим запросом и завершите её командой KILL <session_id>. Для PostgreSQL используйте представление pg_stat_activity и функцию pg_cancel_backend(pid), а при безуспешности — pg_terminate_backend(pid).
Эти операции требуют прав администратора СУБД. Перед завершением убедитесь, что завершаете именно свою сессию: сверьтесь по имени пользователя базы, тексту запроса и времени старта.
Сравнение способов прерывания
Самый быстрый и безопасный, но работает только пока клиент отвечает и платформа может принять команду
Надёжно снимает зависший вызов, нужны права администратора кластера; транзакции сеанса откатываются
Снимает запрос, застрявший внутри СУБД; требует прав администратора СУБД и аккуратной идентификации сессии
Почему прерывание может не сработать
Наиболее частая причина — запрос выполняется внутри СУБД, и платформа ждёт ответа, не имея технической возможности вмешаться до завершения операции. Второй случай — толстый клиент в файловом режиме, где длительная операция идёт в одном потоке с интерфейсом, и окно просто не обрабатывает нажатия клавиш.
Также прерывание не поможет, если зависание вызвано не запросом, а блокировками: сеанс ждёт освобождения ресурса, захваченного другим сеансом. В этом случае нужно искать и снимать блокирующий сеанс, а не тот, что ждёт.
Как проверить, что запрос действительно остановлен
После прерывания убедитесь, что нагрузка снята не только визуально в клиенте, но и на серверах. Проверьте три точки: клиент вернул управление и консоль доступна; в консоли кластера нет зависшего соединения с длительным вызовом; в мониторинге СУБД нет активного запроса от вашего сеанса.
Как проверить результат
Консоль отвечает, можно выполнить другой запрос
Окно не отвечает более нескольких минут
Сеанс завершён или без длительного вызова
Сеанс висит с длительным серверным вызовом
Нет активного запроса от вашего сеанса, CPU и диски в норме
Запрос продолжает выполняться, растёт tempdb или логи
Профилактика: как не доводить до зависания
Большинство «вечных» запросов в консоли — результат отсутствия ограничений. Перед запуском на рабочей базе добавляйте отбор по периоду или по конкретному объекту, используйте РАЗРЕШЕННЫЕ и ПЕРВЫЕ N там, где достаточно выборки-образца. Проверяйте запрос сначала на копии базы или на малом периоде.
Полезные приёмы: анализ плана запроса в СУБД перед запуском на полных данных, использование временных таблиц вместо глубоких вложенных подзапросов, индексация полей соединений. Если консоль поддерживает ограничение количества выводимых строк — включайте его по умолчанию.
Для отладки тяжёлых запросов удобно выполнять их порциями: сначала проверить корректность на одном документе или одном дне, затем расширять диапазон. Это дешевле, чем снимать зависший сеанс и разбираться с последствиями.
Что важно запомнить
Сначала пробуйте Ctrl+Break, при заблокированном клиенте завершайте конкретный сеанс через консоль кластера, а застрявший в СУБД запрос снимайте средствами СУБД. Не трогайте рабочие процессы целиком и проверяйте результат на всех трёх уровнях: клиент, сервер 1С, СУБД.
Частые вопросы
Почему Ctrl+Break не реагирует вообще?
Клиент полностью заблокирован ожиданием ответа сервера и не обрабатывает ввод. Подождите до минуты, затем завершайте сеанс через консоль кластера. На ноутбуках также проверьте, не требует ли клавиша Break нажатия Fn.
Можно ли прервать запрос в тонком или веб-клиенте?
Да, механизм прерывания серверных вызовов работает и там, но сочетание клавиш может перехватываться браузером. Надёжнее завершать сеанс административно через консоль кластера.
Откатятся ли данные, если прервать запрос?
Запросы на выборку ничего не изменяют, откатывать нечего. Если через консоль выполнялся код с записью в транзакции, при прерывании транзакция откатится целиком — частичной записи не останется.
Запрос прерван в 1С, но сервер СУБД всё ещё нагружен. Что делать?
Запрос продолжает выполняться внутри СУБД. Найдите сессию через Activity Monitor (MS SQL) или pg_stat_activity (PostgreSQL) и завершите её командой KILL или pg_cancel_backend/pg_terminate_backend.
Как понять, что сеанс висит из-за блокировки, а не из-за тяжёлого запроса?
В мониторинге СУБД у такого сеанса статус ожидания (suspended/waiting) и указан блокирующий сеанс. Снимать нужно блокирующий сеанс или дождаться освобождения ресурса — прерывание ожидающего сеанса проблему не решит.
Опасно ли завершать свой сеанс через консоль кластера?
Для читающих запросов — практически нет: данные не пострадают. Риск только в потере несохранённых данных самого клиента (например, несохранённого текста запроса в консоли), поэтому сохраняйте тексты запросов в файл перед экспериментами.