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

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

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

Как прервать выполнение запроса в 1С: сочетание Ctrl+Break, консоль кластера, консоль запросов, отладчик, SQL Server. Причины зависания и способы профилактики.

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

Ключевой момент: запрос, отправленный на сервер баз данных (MS SQL, PostgreSQL, Oracle), не прерывается мгновенно даже при закрытии клиента. СУБД должна завершить или откатить операцию, а это может занять заметное время. Поэтому правильная последовательность действий важнее скорости: сначала определяем, где «застрял» запрос, затем выбираем инструмент остановки.

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

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

Признаки, помогающие локализовать проблему: если «висит» только один пользователь, а остальные работают нормально — скорее всего, проблема в его сеансе. Если тормозит вся база — смотрите активные запросы на СУБД и блокировки. Консоль кластера показывает текущие сеансы и соединения, а в технологическом журнале видны длительные запросы с длительностью и текстом.

Завис один клиентЛокальная проблема сеанса

Попробуйте Ctrl+Break или снимите сеанс в консоли кластера

Тормозит вся базаТяжёлый запрос или блокировки на СУБД

Проверьте активные запросы на SQL-сервере

Соединение с СУБД активноЗапрос выполняется на сервере БД

Прерывать нужно на уровне СУБД, а не клиента

Прерывание на клиенте: Ctrl+Break

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

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

Признак того, что прерывание сработало: платформа выводит сообщение «Обработка прервана пользователем» и возвращает управление форме. Если сообщения нет и приложение продолжает «висеть» — переходите к остановке через консоль кластера.

Остановка через консоль кластера серверов 1С

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

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

Альтернатива — вкладка «Соединения»: здесь видны соединения рабочих процессов с СУБД. Разрыв соединения действует жёстче, но и последствия те же — откат транзакции на стороне базы данных.

Прерывание запроса на стороне СУБД

Если запрос выполняется на SQL-сервере, самый надёжный способ — остановить его там. В MS SQL Server откройте Activity Monitor в Management Studio или выполните запрос к представлению sys.dm_exec_requests, чтобы найти session_id проблемного процесса, затем выполните команду KILL.

sql
-- Найти долгие запросы
SELECT session_id, status, command, wait_type, total_elapsed_time
FROM sys.dm_exec_requests
WHERE session_id > 50;
-- Прервать процесс
KILL 57;

В PostgreSQL используется представление pg_stat_activity и функция pg_cancel_backend (мягкая отмена запроса) или pg_terminate_backend (разрыв соединения). Сначала пробуйте pg_cancel_backend — она отменяет только текущий запрос, не рвя соединение.

Помните про откат: после KILL процесс в MS SQL может оставаться в состоянии KILLED/ROLLBACK долгое время, если транзакция была большой. Принудительно перезапускать службу SQL Server в этот момент нельзя — при старте база всё равно будет восстанавливаться, и вы потеряете ещё больше времени.

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

Прерывание из кода и отладчика

В конфигураторе при отладке выполнение прерывается кнопкой «Остановить» или Shift+F5 — отладчик завершает отлаживаемый предмет отладки. Это работает и для фоновых заданий, если они запущены под отладкой.

Для программной остановки фоновых заданий используется метод Отменить() объекта «ФоновоеЗадание»: найдите задание через ФоновыеЗадания.ПолучитьФоновыеЗадания() с отбором по состоянию «Активно» и вызовите Отменить(). Метод сигнализирует заданию о необходимости завершиться, но фактическая остановка произойдёт в ближайшей точке, где код возвращает управление платформе.

Если вы разрабатываете собственные длительные операции, предусмотрите в коде проверку отмены и вывод прогресса — тогда пользователю не придётся «убивать» процесс с риском для данных.

bsl
Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для Каждого Задание Из Задания Цикл
    Задание.Отменить();
КонецЦикла;

Почему запросы зависают и как это предотвратить

Чаще всего «вечный» запрос — это не ошибка платформы, а неоптимальный запрос: соединение с виртуальными таблицами без отборов, отсутствие индексов по условиям, сканирование больших таблиц, блокировки от параллельных сеансов. Прерывание решает симптом, но не причину.

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

Типичные ошибки
01
Перезапуск службы сервера 1С вместо точечной остановки сеанса — страдают все пользователи
02
Перезапуск SQL Server во время отката транзакции — база уходит в длительное восстановление
03
Повторный запуск того же отчёта сразу после прерывания — нагрузка и блокировки только растут
04
Ожидание, что Ctrl+Break прервёт серверный запрос — теряется время, пока СУБД продолжает работать

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

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

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

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

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

Сеанс в консоли кластера
Норма

Сеанс отсутствует в списке

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

Сеанс висит со статусом, время простоя не растёт

Процесс на СУБД
Норма

Процесс завершён, блокировок нет

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

Статус KILLED/ROLLBACK или растёт число блокировок

Прикладные данные
Норма

Документы и регистры согласованы, обмены идут

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

Непроведённые документы, зависшие сообщения обмена

Итог

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

Сначала определите, где выполняется запрос: клиент, сервер 1С или СУБД. Используйте минимально достаточный способ остановки — Ctrl+Break, удаление сеанса, отмену фонового задания или KILL на СУБД. Учитывайте время отката транзакций и после прерывания проверяйте целостность данных, а причину зависания устраняйте оптимизацией запроса.

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

Почему Ctrl+Break не останавливает зависший отчёт?

Потому что отчёт выполняется на сервере: клиент только ждёт результат. Ctrl+Break прерывает лишь код, выполняющийся в клиентском процессе. Останавливайте сеанс через консоль кластера или запрос на СУБД.

Что будет с данными, если удалить сеанс во время проведения документа?

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

Как прервать запрос в файловой базе 1С?

В локальной файловой базе работает Ctrl+Break, либо закрытие клиентского приложения через диспетчер задач. Если файловая база опубликована через веб-сервер, сеанс снимается на стороне сервера публикации.

Чем отличается pg_cancel_backend от pg_terminate_backend в PostgreSQL?

Первая функция отменяет только текущий запрос, сохраняя соединение, вторая разрывает соединение целиком. Для точечной остановки зависшего запроса предпочтительнее pg_cancel_backend.

Можно ли задать таймаут, чтобы запрос прерывался сам?

Да. Для фоновых и регламентных заданий ограничения настраиваются в свойствах, а на уровне СУБД можно задать таймаут выполнения запроса (например, через Resource Governor в MS SQL или statement_timeout в PostgreSQL). Это защищает систему от «вечных» запросов без ручного вмешательства.

Что делать, если зависший запрос появляется регулярно?

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