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

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

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

Как остановить зависший запрос в 1С: прерывание в консоли, завершение сеанса, отмена запроса в MS SQL и PostgreSQL, защита от бесконечных циклов.

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

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

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

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

Полезные источники информации: консоль кластера серверов 1С (список сеансов и соединений, колонка «Прочитано» / «Записано»), технологический журнал с событием DBMSSQL или DBPOSTGRS, динамические представления sys.dm_exec_requests в MS SQL и pg_stat_activity в PostgreSQL. Если запрос активно читает данные — он работает; если стоит в ожидании блокировки — проблема в конкурирующем сеансе.

CPU сервера 100%, диск почти не работаетВозможен бесконечный цикл в коде

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

Запрос ждёт блокировкуКонфликт с другим сеансом

Найти блокирующий сеанс и завершить его, а не зависший

Активное чтение данныхЗапрос просто тяжёлый

Оценить, стоит ли дождаться завершения

Прерывание операции в клиенте 1С

В толстом клиенте (обычное приложение) длительную операцию можно прервать комбинацией Ctrl+Break (на многих клавиатурах это Ctrl+Pause). Платформа остановит выполнение встроенного кода и выдаст сообщение «Обработка прервана пользователем». Это работает для циклов, обхода выборок и другого клиентского кода.

В тонком клиенте и веб-клиенте Ctrl+Break не срабатывает, потому что код выполняется на сервере. Здесь прерывание возможно только если разработчик предусмотрел его: типовые механизмы БСП (длительные операции) показывают форму с кнопкой «Отмена», которая завершает фоновое задание. Если кнопки нет и окно зависло — остаётся завершение сеанса.

Ограничения прерывания в клиенте

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

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

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

После удаления сеанса рабочий процесс rphost прекратит выполнение кода, а открытая транзакция будет откачена. У пользователя появится сообщение о разрыве соединения с сервером. Этот способ безопасен для целостности данных благодаря транзакционности, но пользователь потеряет несохранённые данные в открытых формах.

Если зависший процесс — фоновое задание, его можно завершить точечно, не трогая сеанс пользователя: в консоли кластера откройте ветку «Сеансы», найдите сеанс с типом «Фоновое задание» и завершите его. В конфигурациях на БСП фоновые задания также отменяются программно через метод ФоновыеЗадания.Отменить.

Остановка запроса на стороне СУБД

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

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

sql
-- MS SQL: найти и отменить запрос
SELECT session_id, status, wait_type, text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t;
KILL 75; -- подставьте реальный session_id

-- PostgreSQL: отменить запрос, не разрывая соединение
SELECT pg_cancel_backend(12345);

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

Файловая база: что можно сделать

В файловом варианте нет ни кластера серверов, ни отдельной СУБД, поэтому инструментов меньше. Если операция выполняется в вашем клиенте — пробуйте Ctrl+Break. Если база опубликована на веб-сервере и завис сеанс другого пользователя, единственный доступный способ — завершить сеанс через функциональность «Активные пользователи» (в типовых конфигурациях: Администрирование → Обслуживание → Активные пользователи) с принудительным завершением.

Крайний вариант — перезапуск службы веб-сервера (IIS или Apache), при котором завершатся все сеансы базы. Применяйте его только когда другие пользователи предупреждены, иначе потеряете их несохранённые данные.

Программная защита: как не допустить зависания заранее

Если вы разрабатываете обработки и отчёты, встройте защиту от бесконечного выполнения в сам код. Для циклов добавляйте счётчик итераций или проверку времени с принудительным выходом через ВызватьИсключение. Для фоновых заданий БСП периодически вызывайте проверку отмены, чтобы задание корректно реагировало на команду «Отмена».

Для запросов используйте ограничение выборки (ПЕРВЫЕ N), отбор по периоду и индексированные поля в условиях — большинство «зависаний» это не сбои, а неоптимальные запросы по миллионам записей. На уровне MS SQL можно задать ресурсные ограничения через Resource Governor, чтобы один тяжёлый отчёт не забирал весь сервер.

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

Частые ошибки при остановке запросов

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

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

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

Как проверить, что запрос действительно остановлен

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

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

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

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

Зависшего сеанса нет, остальные работают

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

Сеанс остался или появился новый с тем же запросом

Активность на СУБД
Норма

Нет долгих активных запросов и блокировок

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

Процесс в состоянии rollback или killed долго не завершается

Доступность базы
Норма

Пользователи входят и работают

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

Ошибки соединения или массовые блокировки

Итог

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

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

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

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

Напрямую — нет, потому что код выполняется на сервере. Если операция запущена как длительная через механизмы БСП, используйте кнопку «Отмена» в форме ожидания. В остальных случаях сеанс завершается администратором через консоль кластера.

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

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

Как найти, кто блокирует мой запрос?

В MS SQL выполните запрос к sys.dm_tran_locks и sys.dm_exec_requests с фильтром по blocking_session_id, или используйте Activity Monitor. В PostgreSQL посмотрите pg_locks в связке с pg_stat_activity. В консоли кластера 1С взаимоблокировки видны в разделе «Блокировки» информационной базы.

Почему после KILL процесс в MS SQL долго не исчезает?

Идёт откат транзакции: сервер должен вернуть данные в исходное состояние, и для больших изменений это занимает время, иногда сопоставимое с длительностью самого запроса. Статус отката виден по команде KILL <номер> WITH STATUSONLY. Прерывать откат нельзя — остаётся ждать.

Как остановить бесконечный цикл в коде 1С?

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

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

Штатной настройки таймаута запроса на уровне платформы 1С нет. Косвенные способы: ограничение выборки через ПЕРВЫЕ N и отборы, настройка query timeout на стороне СУБД (например, query governor cost limit в MS SQL), а также перевод тяжёлых операций в фоновые задания с возможностью отмены.