Администрирование · 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.
-- Найти долгие запросы
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Определите, кто пострадал: один пользователь или вся база
- 2Попробуйте Ctrl+Break в клиентском приложении
- 3Если не помогло — найдите сеанс в консоли кластера и удалите его
- 4Если запрос на СУБД — найдите session_id и выполните KILL или pg_cancel_backend
- 5Дождитесь завершения отката транзакции, проверьте состояние процесса
- 6Проверьте целостность данных и повторите операцию после устранения причины
Прерывание из кода и отладчика
В конфигураторе при отладке выполнение прерывается кнопкой «Остановить» или Shift+F5 — отладчик завершает отлаживаемый предмет отладки. Это работает и для фоновых заданий, если они запущены под отладкой.
Для программной остановки фоновых заданий используется метод Отменить() объекта «ФоновоеЗадание»: найдите задание через ФоновыеЗадания.ПолучитьФоновыеЗадания() с отбором по состоянию «Активно» и вызовите Отменить(). Метод сигнализирует заданию о необходимости завершиться, но фактическая остановка произойдёт в ближайшей точке, где код возвращает управление платформе.
Если вы разрабатываете собственные длительные операции, предусмотрите в коде проверку отмены и вывод прогресса — тогда пользователю не придётся «убивать» процесс с риском для данных.
Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для Каждого Задание Из Задания Цикл
Задание.Отменить();
КонецЦикла;Почему запросы зависают и как это предотвратить
Чаще всего «вечный» запрос — это не ошибка платформы, а неоптимальный запрос: соединение с виртуальными таблицами без отборов, отсутствие индексов по условиям, сканирование больших таблиц, блокировки от параллельных сеансов. Прерывание решает симптом, но не причину.
Практические меры профилактики: сначала тестируйте запрос в консоли запросов на копии базы или с ограничением периода; в отчётах СКД проверяйте, что отборы накладываются до соединений; на СУБД следите за планами выполнения и актуальностью статистики; регламентные задания обслуживания (обновление статистики, реиндексация) должны выполняться по расписанию.
Проверка результата после прерывания
После остановки убедитесь, что процесс действительно завершён: в консоли кластера сеанс исчез из списка, на СУБД процесс не числится активным и не находится в состоянии отката. Если остался откат — дождитесь его завершения, контролируя прогресс.
Затем проверьте прикладные данные: если прерывалась операция проведения или обмена, убедитесь, что документы не остались в промежуточном состоянии, а очереди обмена не содержат «застрявших» сообщений. При сомнениях выполните тестирование и исправление базы на копии или штатные проверки целостности средствами СУБД.
Как проверить результат
Сеанс отсутствует в списке
Сеанс висит со статусом, время простоя не растёт
Процесс завершён, блокировок нет
Статус 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). Это защищает систему от «вечных» запросов без ручного вмешательства.
Что делать, если зависший запрос появляется регулярно?
Не боритесь с симптомом: снимите текст запроса через технологический журнал или средства СУБД, проанализируйте план выполнения и оптимизируйте — добавьте отборы, индексы, уберите лишние соединения. Регулярные зависания почти всегда означают проблему в запросе или настройках СУБД.