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

Администрирование · 9 мин

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

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

Консоль запросов — стандартный инструмент разработчика и аналитика 1С для отладки запросов на встроенном языке. Однако запрос к большой таблице без отборов, с соединением «все ко всем» или с левым соединением по неиндексированному полю может выполняться десятки минут и блокировать работу пользователей. В такой ситуации важно знать, как корректно прервать выполнение — и чем различаются способы для файловой и клиент-серверной базы.

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

Почему запрос «зависает» и что происходит при выполнении

При нажатии кнопки «Выполнить» консоль запросов передаёт текст запроса платформе, та формирует обращение к данным и ждёт результата. В файловом режиме данные читаются напрямую из файла 1Cv8.1CD, в клиент-серверном — запрос транслируется в SQL и выполняется на сервере СУБД. Пока результат не получен, форма консоли заблокирована.

Типичные причины длительного выполнения: отсутствие отбора по периоду в запросе к большой таблице движений, соединение таблиц без условия (декартово произведение), обход в цикле вместо одного запроса, использование функций в условиях соединения, а также ожидание на блокировках — когда данные удерживает другая транзакция.

Клиент реагирует на действияМожно прервать штатно

Попробуйте Ctrl+Break — платформа прервёт выполнение на ближайшей контрольной точке

Клиент полностью зависНужно завершение извне

Завершите сеанс через консоль кластера, конфигуратор или диспетчер задач

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

Найдите и отмените запрос средствами СУБД (kill сессии)

Способ 1. Прерывание через Ctrl+Break

Стандартное прерывание длительной операции в платформе 1С — комбинация клавиш Ctrl+Break (на многих клавиатурах клавиша называется Pause или Pause/Break). После нажатия появляется диалог с вопросом, прервать ли выполнение обработки. Подтвердите — и управление вернётся в форму консоли.

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

Способ 2. Завершение сеанса пользователя

Если клиентское приложение не отвечает, сеанс можно завершить принудительно. В клиент-серверном режиме откройте консоль кластера серверов 1С, найдите нужный сеанс в списке и выполните команду «Удалить». Рабочий процесс прервёт обработку запроса, а выполняющийся на СУБД запрос будет отменён при разрыве соединения.

Альтернатива — конфигуратор: меню «Администрирование» → «Активные пользователи», выбор сеанса и кнопка «Завершить сеанс». Этот способ удобен, если консоль кластера недоступна, но есть административный доступ к базе. Учтите, что завершение сеанса в конфигураторе также может происходить с задержкой, пока платформа пытается корректно уведомить клиент.

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

Способ 3. Отмена запроса на стороне СУБД

В клиент-серверной базе тяжёлый запрос фактически выполняет SQL-сервер, и его можно отменить напрямую, не трогая клиент 1С. Это самый точечный способ: вы завершаете конкретный запрос, а не весь сеанс пользователя.

Для Microsoft SQL Server откройте SQL Server Management Studio, найдите нужную сессию в Activity Monitor (по имени компьютера, приложения или тексту запроса) и выполните команду KILL с номером сессии. Для PostgreSQL используйте представление pg_stat_activity и функцию pg_cancel_backend или pg_terminate_backend по идентификатору процесса.

sql
-- PostgreSQL: найти долгий запрос и отменить его
SELECT pid, state, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active' ORDER BY duration DESC;

SELECT pg_cancel_backend(<pid>); -- мягкая отмена запроса
SELECT pg_terminate_backend(<pid>); -- принудительный разрыв сессии

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

Как выбрать способ в разных ситуациях

Маршрут решения

Как выбрать действие

Форма консоли заблокирована, но клиент отвечает на клавиатуруНажмите Ctrl+Break и подтвердите прерывание
Клиент не реагирует, база клиент-серверная, есть доступ к кластеруЗавершите сеанс в консоли кластера серверов
Есть доступ к СУБД и нужно снять только тяжёлый запросНайдите процесс на SQL-сервере и отмените его командой KILL или pg_cancel_backend
Файловая база, клиент завис, других инструментов нетСнимите задачу 1cv8.exe в диспетчере задач и проверьте базу после перезапуска

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

Профилактика: как не доводить до зависания

Большинство «вечных» запросов в консоли — следствие отладки на полных данных без ограничений. Перед выполнением добавляйте отбор по периоду или по конкретному документу, используйте конструкцию РАЗНОСТЬДАТ и виртуальные таблицы с параметрами вместо соединений с полными таблицами движений.

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

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

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

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

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

Форма консоли запросов
Норма

Консоль разблокирована, доступны кнопки и текст запроса

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

Форма не отвечает — сеанс не завершён, повторите завершение через кластер

Нагрузка на сервере СУБД
Норма

Долгий запрос исчез из списка активных процессов

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

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

Целостность данных (файловая база после снятия процесса)
Норма

База открывается, журнал регистрации доступен

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

Ошибки открытия — выполните тестирование и исправление в конфигураторе

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

Итог

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

Штатный способ остановить запрос в консоли 1С — Ctrl+Break. При зависшем клиенте завершайте сеанс через консоль кластера или конфигуратор, а тяжёлый SQL-запрос можно отменить прямо на СУБД. Лучшая защита — отладка запросов с отборами и ограничением выборки.

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

Почему Ctrl+Break не останавливает запрос сразу?

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

Опасно ли снимать процесс 1cv8.exe через диспетчер задач?

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

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

Проверьте активность на сервере: в консоли кластера виден рабочий процесс сеанса, на СУБД — активный запрос с растущей длительностью. Если запрос ждёт блокировки, в pg_stat_activity или Activity Monitor будет видно состояние ожидания.

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

На уровне СУБД можно задать тайм-ауты (например, statement_timeout в PostgreSQL), после которых запрос отменяется автоматически. На уровне платформы универсального таймера для консоли запросов нет — контролируйте выборку отборами и ограничением числа записей.

Что делать, если зависла консоль в веб-клиенте?

Обновление страницы браузера разорвёт соединение, но сеанс на сервере может остаться активным некоторое время. Надёжнее завершить сеанс через консоль кластера или конфигуратор, чтобы сервер освободил ресурсы сразу.