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

Разработка и Конфигурация · 10 мин

Консоль запросов 1С: как прервать выполнение запроса

Как остановить зависший запрос в консоли запросов 1С: Ctrl+Break, завершение сеанса, отмена на сервере СУБД. Причины зависания, профилактика и типичные ошибки.

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

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

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

Почему запрос в консоли зависает

Прежде чем прерывать, полезно понимать причину: от неё зависит, получится ли остановить выполнение штатно. Самая частая причина — отсутствие отборов. Запрос вида «выбрать всё из регистра накопления» по базе за несколько лет может выбирать десятки миллионов строк, и консоль ждёт завершения выборки.

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

Отдельный случай — блокировки. Запрос может не «думать», а ждать освобождения данных, которые удерживает другой сеанс (например, незавершённое проведение документа). В этом случае прерывание запроса не решит проблему: при повторном запуске он снова встанет в очередь ожидания.

Клиент отвечает на действияЗапрос выполняется в клиенте

Попробуйте Ctrl+Break — штатная отмена, скорее всего, сработает

Клиент полностью зависПоток занят ожиданием ответа сервера

Проверьте активность на сервере 1С и СУБД, готовьтесь завершать сеанс

На SQL-сервере высокая нагрузкаЗапрос выполняется на СУБД

Найдите сессию запроса и снимите её на стороне сервера баз данных

Запрос ждёт блокировкуДанные заняты другим сеансом

Найдите блокирующий сеанс, прерывание самого запроса не поможет

Штатная отмена: Ctrl+Break

В толстом клиенте и в файловом варианте работы платформа поддерживает прерывание длительной операции сочетанием клавиш Ctrl+Break (на многих клавиатурах клавиша Break совмещена с Pause). Нажмите комбинацию и подождите несколько секунд: платформа проверяет флаг прерывания не непрерывно, а в определённые моменты выполнения.

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

В тонком клиенте и веб-клиенте штатной клавиши отмены запроса нет: вся логика выполняется на сервере, и единственный способ остановить выполнение — завершить сеанс или снять запрос на СУБД.

Порядок действий при зависании
  1. 1
    Нажмите Ctrl+Break и подождите 10–15 секунд — часто этого достаточно
  2. 2
    Если не помогло, откройте консоль кластера и найдите свой сеанс по пользователю
  3. 3
    Попробуйте завершить сеанс штатно через консоль кластера
  4. 4
    Если нагрузка на СУБД сохраняется — найдите и снимите запрос на сервере баз данных
  5. 5
    После восстановления доступа исправьте запрос: добавьте отборы и параметры виртуальных таблиц

Завершение сеанса через консоль кластера

Если клиент не отвечает, а работа идёт в клиент-серверном варианте, самый управляемый способ — завершить сеанс через консоль администрирования серверов 1С. Откройте консоль, найдите нужный кластер, раскройте список сеансов и отыщите свой по имени пользователя и времени подключения.

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

Если консоль кластера недоступна (нет прав администратора кластера), остаётся локальный вариант: завершить процесс клиента через диспетчер задач Windows (процесс 1cv8.exe). Эффект тот же — сеанс на сервере закроется по тайм-ауту или при обнаружении разрыва соединения.

Снятие запроса на стороне СУБД

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

В MS SQL Server откройте SQL Server Management Studio, найдите проблемную сессию через Activity Monitor или запросом к sys.dm_exec_requests, определите её session_id и выполните команду KILL. В PostgreSQL используйте представление pg_stat_activity и функцию pg_cancel_backend(pid) — она штатно отменяет выполняющийся запрос без разрыва соединения.

sql
-- MS SQL: найти и снять запрос
SELECT session_id, status, command, wait_type, total_elapsed_time
FROM sys.dm_exec_requests WHERE session_id > 50;
KILL <session_id>;

-- PostgreSQL
SELECT pid, state, query FROM pg_stat_activity WHERE state = 'active';
SELECT pg_cancel_backend(<pid>);

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

Как не доводить консоль до зависания

Главная профилактическая мера — ограничивать выборку на этапе отладки. Добавляйте в запрос отбор по периоду или по конкретному документу, а для проверки структуры результата используйте ограничение количества строк: в языке запросов 1С это конструкция «ВЫБРАТЬ ПЕРВЫЕ 1000».

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

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

Типичные ошибки
01
Запуск запроса без отборов по полной таблице регистра — гарантированное длительное выполнение на большой базе
02
Соединение таблиц без условия связи — декартово произведение и рост результата до миллиардов строк
03
Виртуальные таблицы без параметров — пересчёт по всем движениям вместо нужного периода
04
Принудительное завершение rphost вместо своего сеанса — обрыв работы всех пользователей сервера
05
Повторный запуск того же запроса сразу после прерывания — повторное зависание и накопление нагрузки на СУБД

Особенности разных режимов и клиентов

В файловом варианте всё проще и одновременно жёстче: запрос выполняется в процессе клиента, поэтому Ctrl+Break обычно срабатывает, а в крайнем случае достаточно завершить процесс 1cv8.exe — это не затрагивает других пользователей (кроме сценария, когда файловая база опубликована на веб-сервере и используется несколькими людьми).

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

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

Контрольные точки

Как проверить результат

Состояние клиента после Ctrl+Break
Норма

Появилось сообщение о прерывании, интерфейс отвечает

Тревожный признак

Клиент по-прежнему не реагирует — переходите к завершению сеанса

Нагрузка на сервере СУБД после завершения сеанса
Норма

Активность запроса исчезла, CPU и диски вернулись к норме

Тревожный признак

Запрос продолжает выполняться — снимите его на стороне СУБД

Блокировки в базе
Норма

Управляемые и СУБД-блокировки освобождены

Тревожный признак

Остались зависшие блокировки — ищите владельца через консоль кластера

Часто задаваемые вопросы

Ctrl+Break не срабатывает, что делать?

Проверьте раскладку и саму клавишу: на ноутбуках Break часто требует Fn. Если комбинация нажата верно, но реакции нет в течение 15–20 секунд, значит платформа ждёт ответа сервера и флаг прерывания не проверяется. Переходите к завершению сеанса через консоль кластера или диспетчер задач.

Потеряю ли я текст запроса при завершении клиента?

Да, если запрос не сохранён. Большинство консолей запросов хранят текст только в памяти сеанса, поэтому при принудительном завершении несохранённый запрос пропадёт. Заведите привычку сохранять запрос в файл консоли перед запуском тяжёлых вариантов.

Можно ли прервать запрос в тонком клиенте?

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

Запрос завершился, но база всё равно тормозит. Почему?

Вероятно, остались последствия выполнения: незавершённая транзакция с блокировками или запрос продолжает работать на СУБД несмотря на закрытие клиента. Проверьте активные сессии на сервере баз данных и список блокировок в консоли кластера, при необходимости снимите запрос на СУБД.

Как ограничить время выполнения запроса заранее?

На уровне языка запросов прямого тайм-аута нет, но можно ограничить объём: использовать «ВЫБРАТЬ ПЕРВЫЕ N», задавать параметры виртуальных таблиц и отборы. В MS SQL администратор может настроить ограничения через Resource Governor, а на уровне платформы — контролировать длительные вызовы через технологический журнал.

Опасно ли прерывать запрос на выборку данных?

Запросы на чтение (ВЫБРАТЬ) прерывать безопасно: они не изменяют данные, а блокировки освобождаются при отмене. Осторожность нужна только если запрос выполняется внутри транзакции с изменениями — тогда отмена вызовет откат транзакции, что штатно, но может занять время на большой транзакции.

Итог

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

Сначала пробуйте Ctrl+Break, затем завершение сеанса через консоль кластера, в крайнем случае — снятие запроса на СУБД. Не трогайте процессы rphost и агента сервера. Лучшая защита от зависаний — отборы, параметры виртуальных таблиц и «ВЫБРАТЬ ПЕРВЫЕ N» при отладке.