Разработка и Конфигурация · 11 мин
Как прервать выполнение программы в 1С
Как прервать выполнение программы в 1С: остановка отладки, длительных операций и фоновых заданий, работа с точками останова и серверными процессами.
Длительная обработка, зависший отчёт или бесконечный цикл в коде — ситуации, с которыми сталкивается почти каждый пользователь и разработчик 1С. Способ прерывания зависит от того, где выполняется код: на клиенте, на сервере, в отладчике или в фоновом задании. Универсальной «красной кнопки» в платформе нет, поэтому важно понимать, какой инструмент подходит в конкретном случае и какие последствия влечёт принудительная остановка.
Некорректное прерывание способно оставить в базе незавершённые транзакции, заблокированные записи или частично записанные данные. Особенно осторожно нужно действовать при остановке серверных процедур и регламентных заданий в рабочей базе. Ниже разобраны все основные сценарии: от остановки отладки в конфигураторе до снятия зависшего фонового задания на сервере.
Как прервать выполнение кода в отладчике
Самый контролируемый способ остановки — работа через встроенный отладчик конфигуратора. Если программа запущена под отладкой, выполнение можно прервать в любой момент: меню «Отладка» → «Остановить» или комбинация клавиш Shift+F5. При этом сеанс предприятия завершит выполнение текущего обработчика, а отладка прекратится корректно.
Если нужно не завершить, а приостановить выполнение в конкретном месте, используются точки останова. Установите курсор на нужную строку в модуле и нажмите F9 — при достижении этой строки выполнение остановится, и вы сможете посмотреть значения переменных через табло. Команда «Прервать» (иконка паузы на панели отладки) останавливает выполнение в произвольной точке без заранее установленной точки останова.
Полезная возможность — остановка по ошибке. В настройках отладки (меню «Отладка» → «Остановка по ошибке») можно включить автоматическую паузу при возникновении исключения. Это позволяет увидеть состояние программы ровно в момент сбоя, а не после того, как ошибка уже обработана.
- 1Откройте конфигуратор и запустите отладку (F5) или подключитесь к уже работающему сеансу через меню «Отладка» → «Подключение»
- 2Дождитесь входа в нужный участок кода или установите точку останова клавишей F9
- 3Для паузы в произвольном месте нажмите кнопку «Прервать» на панели отладки
- 4Для полного завершения выполнения нажмите Shift+F5 («Остановить»)
- 5Проверьте в предприятии, что сеанс завершился без зависших блокировок
Как прервать длительную операцию на клиенте
Когда пользователь запускает тяжёлый отчёт или обработку, интерфейс может «подвиснуть» на время выполнения. Если операция написана с поддержкой интерактивного прерывания, работает клавиша Ctrl+Break (на ноутбуках иногда Ctrl+Fn+Pause) — платформа выдаст запрос на прерывание обработки. В файловой базе и при клиентском исполнении кода это основной способ остановки.
В современных конфигурациях длительные операции часто выполняются через механизм «Длительные операции» БСП: на экране появляется форма ожидания с кнопкой «Отмена». Нажатие этой кнопки посылает сигнал фоновому заданию, и задание завершается штатно — это самый безопасный сценарий, поскольку разработчик обычно предусматривает откат изменений.
Если клиентское приложение полностью зависло и не отвечает, остаётся завершить процесс через диспетчер задач Windows: найдите процесс 1cv8.exe (толстый клиент), 1cv8c.exe (тонкий клиент) или процесс браузера для веб-клиента и снимите задачу. Учтите: при клиент-серверном режиме сеанс на сервере может продолжить жить ещё некоторое время, пока не истечёт таймаут.
Как остановить фоновое и регламентное задание
Фоновые задания выполняются на сервере, поэтому закрытие клиента их не остановит. В типовых конфигурациях на базе БСП есть обработка «Активные пользователи» и консоль «Регламентные и фоновые задания» (раздел «Администрирование» → «Обслуживание»). В списке заданий выберите активное задание и нажмите «Отменить» — платформа отправит заданию команду завершения.
Отмена фонового задания работает не мгновенно: задание завершится в ближайшей точке, где платформа может обработать сигнал. Если код задания выполняет один длинный запрос к СУБД, отмена произойдёт только после его завершения. В этом случае помогает остановка на уровне СУБД — администратор базы данных может снять соответствующий процесс в MS SQL Server или PostgreSQL.
Программно фоновое задание отменяется методом ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Ид).Отменить(). Для регламентных заданий дополнительно можно отключить расписание, чтобы задание не запустилось повторно сразу после отмены.
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание <> Неопределено Тогда
Задание.Отменить();
КонецЕсли;Как прервать выполнение на сервере 1С
В клиент-серверном режиме основная нагрузка ложится на рабочие процессы кластера (rphost). Если серверный вызов завис, откройте консоль кластера серверов 1С, найдите нужный сеанс в списке сеансов информационной базы и выполните команду «Удалить» для сеанса. Платформа завершит сеанс и освободит занятые ресурсы.
Более грубый вариант — завершить зависший рабочий процесс rphost через диспетчер задач на сервере. Это допустимо, только если процесс действительно «утёк» по памяти или завис, поскольку вместе с ним завершатся все сеансы, обслуживаемые этим процессом. Кластер автоматически запустит новый рабочий процесс, но пользователи потеряют несохранённые данные.
Для профилактики зависаний в свойствах рабочего сервера и информационной базы кластера настраиваются ограничения: максимальный объём памяти рабочих процессов, допустимое время вызова СУБД, интервал перезапуска процессов. Эти параметры позволяют кластеру самостоятельно прерывать «заблудившиеся» вызовы без ручного вмешательства.
Как программно прервать выполнение кода
Внутри самого кода выполнение прерывается стандартными конструкциями встроенного языка. Оператор Возврат завершает текущую процедуру или функцию, Прервать — выходит из цикла, Продолжить — переходит к следующей итерации. Для аварийного завершения с сообщением об ошибке используется оператор ВызватьИсключение, который разворачивает стек вызовов до ближайшего обработчика Попытка...Исключение.
Если нужно полностью завершить работу приложения из кода, применяется команда ЗавершитьРаботуСистемы() или ПрекратитьРаботуСистемы(). Разница в том, что первая предлагает пользователю штатное завершение с вопросами, а вторая прекращает работу принудительно — её стоит использовать только в служебных сценариях, например при регламентном обслуживании.
В длительных циклах обработки данных хорошей практикой считается проверка запроса на прерывание: периодически вызывайте ОбработкаПрерыванияПользователя(), чтобы пользователь мог остановить выполнение через Ctrl+Break, иначе платформа проигнорирует нажатие до конца цикла.
Способы прерывания: что выбрать
Для разработки и диагностики. Безопасна, но требует запуска под отладкой
Для пользователя при длительной операции. Работает, только если код поддерживает прерывание
Для серверных фоновых операций. Не мгновенна при длинных запросах к СУБД
Для зависших серверных сеансов. Требует прав администратора кластера
Крайняя мера при полном зависании. Риск обрыва транзакций и потери данных других пользователей
Частые ошибки и как проверить результат
Самая распространённая ошибка — завершение клиентского процесса в надежде остановить серверное фоновое задание. Задание продолжает работать на сервере, а пользователь запускает обработку повторно, получая параллельное выполнение двух одинаковых операций и конфликт блокировок. Всегда проверяйте список фоновых заданий после прерывания.
Вторая типичная ситуация — повторный запуск обработки, которая не была откатана: часть документов уже проведена, и повторный запуск создаёт дубли. Перед повторным запуском убедитесь, что обработка либо транзакционна (откатывается целиком), либо умеет пропускать уже обработанные объекты.
После прерывания проверьте состояние базы: откройте список активных сеансов и убедитесь, что зависший сеанс исчез; посмотрите журнал регистрации на предмет ошибок и незавершённых операций; при работе с СУБД проверьте отсутствие долгоживущих блокировок. Если обработка писала данные, сверьте контрольные итоги по затронутым регистрам.
Как проверить результат прерывания
Зависший сеанс отсутствует
Сеанс висит со старым временем последнего вызова
Задание в состоянии «Отменено» или отсутствует
Задание продолжает выполняться
Есть запись о завершении или отмене операции
Ошибки транзакций, обрывы соединений
Итоги согласованы, дублей нет
Частично записанные или задвоенные данные
Что важно запомнить
Выбирайте способ прерывания по месту выполнения кода: отладчик — Shift+F5, клиент — Ctrl+Break или «Отмена», фоновое задание — консоль заданий, серверный сеанс — консоль кластера. Принудительное завершение процессов — крайняя мера, после любого прерывания проверяйте целостность данных и отсутствие блокировок.
Частые вопросы
Почему Ctrl+Break не останавливает обработку?
Платформа обрабатывает прерывание только в точках, где это разрешено. Если код выполняет длинный запрос к СУБД или цикл без вызова ОбработкаПрерыванияПользователя(), нажатие игнорируется до конца текущей операции. В серверном коде пользовательское прерывание вообще недоступно — там нужна отмена фонового задания.
Что произойдёт с данными при принудительном завершении сеанса?
Если в момент завершения выполнялась транзакция, СУБД и платформа откатят её автоматически. Однако если обработка записывала данные порциями вне общей транзакции, уже записанная часть останется в базе. Поэтому после принудительной остановки стоит проверить затронутые данные.
Как остановить обмен данными, который завис?
Обмен обычно выполняется фоновым заданием. Найдите его в консоли регламентных и фоновых заданий и отмените. Если обмен запущен интерактивно и клиент не отвечает — завершите сеанс через консоль кластера. После этого проверьте, не остались ли зарегистрированные, но не выгруженные изменения в узлах плана обмена.
Можно ли автоматически прерывать слишком долгие операции?
Да, на уровне кластера настраиваются ограничения: максимальное время вызова СУБД, лимиты памяти рабочих процессов, принудительный перезапуск процессов. В коде длительных операций можно задавать таймауты и проверять превышение допустимого времени выполнения с вызовом исключения.
Как завершить работу всех пользователей базы срочно?
В консоли кластера для информационной базы установите блокировку сеансов, а затем удалите активные сеансы. В типовых конфигурациях есть штатный механизм «Блокировка работы пользователей» в разделе «Администрирование», который завершает сеансы по расписанию с предупреждением пользователей.
Чем «ЗавершитьРаботуСистемы» отличается от «ПрекратитьРаботуСистемы»?
ЗавершитьРаботуСистемы инициирует штатное закрытие приложения с возможностью задать вопрос пользователю и выполнить обработчики завершения. ПрекратитьРаботуСистемы завершает приложение немедленно без вопросов — несохранённые данные будут потеряны, поэтому метод применяют только в служебных сценариях.