Администрирование · 9 мин
Как остановить выполнение запроса в консоли запросов 1С
Как остановить зависший запрос в консоли запросов 1С: прерывание через Ctrl+Break, завершение сеанса, отмена запроса на уровне СУБД и профилактика зависаний.
Консоль запросов — стандартный инструмент разработчика и аналитика 1С для отладки запросов на встроенном языке. Однако запрос к большой таблице без отборов, с соединением «все ко всем» или с левым соединением по неиндексированному полю может выполняться десятки минут и блокировать работу пользователей. В такой ситуации важно знать, как корректно прервать выполнение — и чем различаются способы для файловой и клиент-серверной базы.
Главная сложность в том, что кнопки «Стоп» в самой консоли запросов обычно нет: после нажатия «Выполнить» управление возвращается только после завершения запроса. Поэтому остановить выполнение можно либо штатным прерыванием платформы, либо завершением сеанса, либо отменой запроса на стороне СУБД. Выбор способа зависит от режима работы базы и ваших прав.
Почему запрос «зависает» и что происходит при выполнении
При нажатии кнопки «Выполнить» консоль запросов передаёт текст запроса платформе, та формирует обращение к данным и ждёт результата. В файловом режиме данные читаются напрямую из файла 1Cv8.1CD, в клиент-серверном — запрос транслируется в SQL и выполняется на сервере СУБД. Пока результат не получен, форма консоли заблокирована.
Типичные причины длительного выполнения: отсутствие отбора по периоду в запросе к большой таблице движений, соединение таблиц без условия (декартово произведение), обход в цикле вместо одного запроса, использование функций в условиях соединения, а также ожидание на блокировках — когда данные удерживает другая транзакция.
Попробуйте Ctrl+Break — платформа прервёт выполнение на ближайшей контрольной точке
Завершите сеанс через консоль кластера, конфигуратор или диспетчер задач
Найдите и отмените запрос средствами СУБД (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 по идентификатору процесса.
-- 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С получит ошибку выполнения и разблокируется — консоль запросов снова станет доступной. Этот способ требует прав администратора СУБД и аккуратности: убедитесь, что завершаете именно тот процесс, иначе можно оборвать работу другого пользователя.
Как выбрать способ в разных ситуациях
Как выбрать действие
Общий принцип: двигайтесь от наименее разрушительного способа к более жёсткому. Сначала штатное прерывание, затем завершение сеанса, затем отмена на СУБД или снятие процесса. Это снижает риск потери несохранённых данных в других окнах клиента и лишней нагрузки на сервер.
Профилактика: как не доводить до зависания
Большинство «вечных» запросов в консоли — следствие отладки на полных данных без ограничений. Перед выполнением добавляйте отбор по периоду или по конкретному документу, используйте конструкцию РАЗНОСТЬДАТ и виртуальные таблицы с параметрами вместо соединений с полными таблицами движений.
Полезные приёмы: сначала выполняйте запрос с ограничением выборки (например, выбрать первые 1000 записей), проверяйте план запроса на стороне СУБД для подозрительных соединений, избегайте вложенных запросов в условиях соединений и не используйте функции в условиях связи таблиц. Если консоль позволяет, выполняйте пакетный запрос по частям, отлаживая каждую временную таблицу отдельно.
Проверка результата после остановки
Как проверить результат
Консоль разблокирована, доступны кнопки и текст запроса
Форма не отвечает — сеанс не завершён, повторите завершение через кластер
Долгий запрос исчез из списка активных процессов
Процесс продолжает выполняться — отмените его на СУБД
База открывается, журнал регистрации доступен
Ошибки открытия — выполните тестирование и исправление в конфигураторе
Если после прерывания вы планируете повторно выполнить запрос, обязательно скорректируйте его: добавьте отборы, ограничьте выборку или разбейте на этапы. Повторный запуск того же текста приведёт к тому же зависанию.
Что важно запомнить
Штатный способ остановить запрос в консоли 1С — Ctrl+Break. При зависшем клиенте завершайте сеанс через консоль кластера или конфигуратор, а тяжёлый SQL-запрос можно отменить прямо на СУБД. Лучшая защита — отладка запросов с отборами и ограничением выборки.
Частые вопросы
Почему Ctrl+Break не останавливает запрос сразу?
Прерывание срабатывает на контрольных точках платформы. Если выполняется один длинный SQL-оператор на сервере СУБД, клиент дождётся его завершения. В этом случае отмените запрос на стороне СУБД или завершите сеанс.
Опасно ли снимать процесс 1cv8.exe через диспетчер задач?
Если выполнялся только запрос на чтение, риск минимален. Если шла запись данных, в файловой базе возможна незавершённая транзакция — после перезапуска проверьте базу и при необходимости выполните тестирование и исправление.
Как понять, что запрос завис, а не просто долго выполняется?
Проверьте активность на сервере: в консоли кластера виден рабочий процесс сеанса, на СУБД — активный запрос с растущей длительностью. Если запрос ждёт блокировки, в pg_stat_activity или Activity Monitor будет видно состояние ожидания.
Можно ли ограничить время выполнения запроса заранее?
На уровне СУБД можно задать тайм-ауты (например, statement_timeout в PostgreSQL), после которых запрос отменяется автоматически. На уровне платформы универсального таймера для консоли запросов нет — контролируйте выборку отборами и ограничением числа записей.
Что делать, если зависла консоль в веб-клиенте?
Обновление страницы браузера разорвёт соединение, но сеанс на сервере может остаться активным некоторое время. Надёжнее завершить сеанс через консоль кластера или конфигуратор, чтобы сервер освободил ресурсы сразу.