Разработка и Конфигурация · 11 мин
Как отменить запрос в 1С: инструкция для разных ситуаций
Как отменить запрос в 1С: прерывание длительного запроса, отказ от запроса разрешений при запуске, отмена запроса в консоли и программная отмена.
Фраза «отменить запрос в 1С» может означать сразу несколько разных задач: прервать «зависший» запрос, который выполняется слишком долго, отказаться от диалога запроса разрешений при запуске внешней обработки, отменить запрос в консоли запросов или программно остановить фоновое выполнение. Действия в каждом случае различаются, и важно сначала понять, какой именно сценарий у вас.
Чаще всего вопрос возникает у разработчиков и администраторов, когда запрос к базе данных выполняется минутами, блокирует работу пользователей и его нужно остановить. Реже — когда при запуске обработки появляется окно «Запрос разрешений» и пользователь хочет отказаться от него без последствий.
Ниже разобраны основные сценарии отмены запроса: интерактивное прерывание в клиенте, остановка запроса на сервере СУБД, отказ от запроса разрешений, отмена в консоли запросов и программные способы. Для каждого случая указаны ограничения и риски.
Определяем, какой именно запрос нужно отменить
Прежде чем действовать, уточните ситуацию. От этого зависит и инструмент, и возможные последствия. Слово «запрос» в 1С используется в нескольких значениях, и спутать их легко.
- Запрос на языке запросов 1С, выполняющийся в моменте (в коде, в консоли запросов, при формировании отчёта) — его прерывают как длительную операцию.
- Диалог «Запрос разрешений» при запуске внешних обработок или при обращении к защищённым ресурсам — отменяется кнопкой в самом диалоге.
- Запрос, ушедший на сервер СУБД (MS SQL, PostgreSQL) — иногда останавливается только со стороны базы данных.
- Фоновое задание, внутри которого выполняется запрос — отменяется как задание целиком.
Скорее всего, выполняется тяжёлый запрос — попробуйте Ctrl+Break
Это механизм защиты от опасных действий — отменяется кнопкой в диалоге
Запрос удерживает ресурсы на сервере СУБД — может понадобиться остановка на стороне базы
Прерывание выполняющегося запроса в клиенте 1С
Если запрос выполняется в толстом или тонком клиенте и интерфейс «подвис», первое, что стоит попробовать, — стандартное прерывание пользовательской операции. Нажмите комбинацию клавиш Ctrl+Break (на многих клавиатурах клавиша Break совмещена с Pause). Платформа попытается остановить выполнение текущего встроенного кода, включая выполнение запроса.
Важно понимать ограничение: прерывание срабатывает не мгновенно и не всегда. Если запрос уже ушёл на сервер СУБД и выполняется там, клиентское прерывание может не остановить его немедленно — сервер баз данных продолжит работу до завершения или до отмены со стороны самой СУБД. В файловой базе прерывание обычно срабатывает быстрее.
Если Ctrl+Break не помог в течение разумного времени, остаётся завершить сеанс: через диспетчер задач для локального клиента или через консоль кластера — для серверного сеанса. Это крайняя мера, потому что несохранённые данные сеанса будут потеряны.
Отмена запроса на стороне сервера СУБД
В клиент-серверном варианте работы тяжёлый запрос фактически выполняет MS SQL Server, PostgreSQL или другая СУБД. Если клиентское прерывание не сработало, запрос останавливают на уровне базы данных. Для этого нужны права администратора СУБД.
В MS SQL Server откройте SQL Server Management Studio, найдите проблемную сессию через Activity Monitor или запросом к представлению sys.dm_exec_requests, определите её session_id и выполните команду KILL с этим номером. В PostgreSQL используются функции pg_cancel_backend (мягкая отмена запроса) или pg_terminate_backend (завершение соединения) с указанием идентификатора процесса из pg_stat_activity.
Альтернатива — консоль кластера серверов 1С. В ней видны сеансы и соединения, можно найти сеанс, который выполняет длительный запрос, и завершить его. Это не требует прямого доступа к СУБД, но также обрывает работу пользователя, поэтому применяйте осознанно.
Перед тем как убивать сессию на СУБД, посмотрите текст выполняемого запроса: в MS SQL это видно в Activity Monitor, в PostgreSQL — в колонке query представления pg_stat_activity. Так вы поймёте, какая операция вызвала проблему, и сможете устранить причину, а не только симптом.
Отказ от диалога «Запрос разрешений»
При запуске внешних обработок и отчётов, а также при обращении к файловой системе, интернету или COM-объектам платформа может показать окно «Запрос разрешений» с описанием требуемых доступов. Это штатный механизм защиты от потенциально опасных действий.
Отменить такой запрос просто: нажмите кнопку «Отмена» (или «Нет» — в зависимости от версии платформы). Обработка при этом либо не запустится вовсе, либо продолжит работу без запрошенного действия — например, не сможет прочитать файл. Никаких изменений в базе при отказе не произойдёт.
Если диалог появляется постоянно и мешает работе, его частота регулируется настройками профилей безопасности в кластере серверов или параметром «Режим использования модальных окон» и настройками защиты от опасных действий в свойствах пользователя (флажок «Защита от опасных действий» в форме пользователя). Отключать защиту полностью стоит только для доверенных обработок.
Отмена запроса в консоли запросов
Консоль запросов — типовой инструмент разработчика для отладки. Если вы запустили запрос в консоли и он выполняется слишком долго, действуют те же правила, что и для клиентского прерывания: нажмите Ctrl+Break. В большинстве консолей (в том числе в консоли запросов с ИТС и популярных аналогах) выполнение идёт в контексте клиентского вызова, поэтому прерывание платформой работает.
Если консоль выполняет запрос на сервере через длительный вызов, прерывание может не сработать до возврата управления. В этом случае поможет только остановка запроса на СУБД, описанная выше.
Чтобы не попадать в ситуацию «вечного» запроса, отлаживайте запросы на ограниченной выборке: используйте конструкцию ПЕРВЫЕ (TOP) с небольшим числом, добавляйте отборы по периоду и проверяйте план запроса до полного выполнения.
- 1Нажмите Ctrl+Break и подождите 10–30 секунд
- 2Если не помогло — проверьте на сервере СУБД, выполняется ли запрос ещё
- 3При необходимости отмените сессию на СУБД (KILL / pg_cancel_backend) или завершите сеанс в консоли кластера
- 4После остановки найдите причину: откройте план запроса, проверьте индексы и условия соединений
Программная отмена: фоновые задания и длительные операции
Если запрос выполняется внутри фонового задания, его останавливают отменой самого задания. В коде это делается методом Отменить() объекта фонового задания; интерактивно — через обработку «Консоль заданий» или стандартный список фоновых заданий в разделе администрирования.
В конфигурациях на базе БСП длительные операции реализуются через подсистему «Длительные операции», и там предусмотрен программный интерфейс отмены, а внутри выполняемой процедуры — проверка признака отмены, чтобы корректно завершить работу. Если вы разрабатываете собственную длительную операцию, предусмотрите в цикле обработки данных проверку отмены, иначе задание будет останавливаться грубо.
Учтите: отмена фонового задания прерывает весь его код, а не только запрос. Если задание уже успело записать часть данных вне транзакции, эти изменения останутся в базе — проектируйте длительные операции так, чтобы отмена оставляла данные в согласованном состоянии.
Как выбрать действие
Частые ошибки и как их избежать
Самая распространённая ошибка — многократный повторный запуск одного и того же тяжёлого отчёта или обработки, когда пользователь думает, что «не сработало». В результате на сервере копятся параллельные запросы, нагрузка растёт, и ситуация ухудшается. Прежде чем запускать повторно, убедитесь, что предыдущий экземпляр действительно завершён.
Вторая типичная ошибка — отключение защиты от опасных действий «насовсем», чтобы не мешал диалог запроса разрешений. Это открывает дорогу вредоносным обработкам. Правильнее добавить доверенную обработку в исключения или настроить профиль безопасности точечно.
Как проверить, что запрос действительно отменён
После прерывания убедитесь, что запрос прекратил выполняться не только в клиенте, но и на сервере. В клиенте признак успешной отмены — возврат управления интерфейсу и, как правило, сообщение об ошибке «Операция прервана пользователем».
На стороне СУБД проверьте список активных запросов: в MS SQL — Activity Monitor или sys.dm_exec_requests, в PostgreSQL — pg_stat_activity с фильтром по состоянию active. Проблемного запроса в списке быть не должно. Дополнительно убедитесь, что не осталось открытых транзакций от прерванного сеанса — они могут удерживать блокировки.
Как проверить результат
Управление вернулось, появилось сообщение о прерывании
Клиент по-прежнему не отвечает — запрос продолжается на сервере
Проблемного запроса нет в списке активных
Запрос в состоянии активного выполнения или отката
Нет долгоживущих блокировок от прерванного сеанса
Открытая транзакция удерживает блокировки — требуется завершение сессии
Что важно запомнить
Способ отмены зависит от типа запроса: клиентский запрос прерывается Ctrl+Break, диалог разрешений — кнопкой «Отмена», запрос на СУБД — остановкой сессии, фоновое задание — методом Отменить(). После любой отмены проверяйте, что запрос завершился на сервере и не оставил блокировок.
Частые вопросы
Что делать, если Ctrl+Break не работает?
Комбинация прерывает выполнение только на контрольных точках платформы и не останавливает запрос, уже выполняющийся на СУБД. Если в течение 30–60 секунд реакции нет, проверьте активность на сервере баз данных и при необходимости отмените сессию там или завершите сеанс через консоль кластера.
Безопасно ли нажимать «Отмена» в окне «Запрос разрешений»?
Да, это штатный сценарий. При отказе обработка либо не запустится, либо продолжит работу без запрошенного действия. Изменений в базе сам факт отказа не вызывает.
Может ли отмена запроса повредить данные в базе?
Читающий запрос отменяется без последствий. Если прерывается запись внутри транзакции, СУБД выполнит откат, и данные останутся в исходном состоянии, но откат большой транзакции может занять заметное время. Риск появляется, когда изменения писались порциями вне общей транзакции — тогда часть данных может остаться записанной.
Как отменить запрос, запущенный регламентным заданием?
Регламентные задания порождают фоновые, поэтому найдите соответствующее фоновое задание в консоли заданий или консоли кластера и завершите его. Если задание периодическое, дополнительно отключите расписание, иначе оно запустится снова по расписанию.
Как избежать необходимости отменять запросы в будущем?
Оптимизируйте сам запрос: добавьте отборы по индексированным полям, уберите соединения с виртуальными таблицами без отборов, используйте ПЕРВЫЕ при отладке, проверяйте план запроса. Для длительных операций предусмотрите возможность отмены и вывод прогресса, чтобы пользователь понимал, что процесс идёт.