Остановка зависшей обработки, цикла и фонового задания в 1С 8.3
Содержание
Прервать выполнение в 1С 8.3 проще всего сочетанием Ctrl+Break: платформа спросит, остановить ли операцию, и после подтверждения выбросит исключение. В конфигураторе во время отладки ту же роль играет команда Отладка → Прервать, а из кода остановку дают операторы Прервать, Возврат и ВызватьИсключение.
Если не помогает ни одно из этого, остаётся принудительное завершение: отмена фонового задания, удаление сеанса в консоли кластера или снятие процесса клиента. Методы ниже идут от мягкого к жёсткому.
Клавиши прерывания в режиме 1С:Предприятие
Основная комбинация — Ctrl+Break (на части клавиатур клавиша подписана Pause). Она срабатывает, когда долгий код выполняется на клиенте: цикл в обработке, заполнение табличной части, вывод большого отчёта.
Что происходит после нажатия:
- Платформа показывает вопрос, прервать ли выполнение.
- Вы подтверждаете — в текущей строке кода возникает исключение.
- Если исключение не перехвачено, операция останавливается, на экране появляется сообщение об ошибке.
- Открытая транзакция откатывается, ничего «наполовину» не записывается.
На ноутбуке без отдельной клавиши Break попробуйте Ctrl+Fn+B или Ctrl+Fn+Pause — сочетание зависит от производителя. Ещё вариант — экранная клавиатура Windows (osk), в ней есть клавиша Pause.
Почему Ctrl+Break иногда «не слышат»
Клавиши работают не везде. Типичные случаи, когда нажатие ни на что не влияет:
- 🖥️ код выполняется на сервере (
&НаСервере) — длинный запрос или запись тысяч документов. Клиент в это время ждёт ответа и сам прервать серверный вызов не может; - 🔁 цикл не содержит ни одной точки, где платформа проверяет прерывание;
- ⏳ процесс ждёт блокировку данных — он висит не на вашем коде, а в очереди к СУБД;
- 🪟 окно 1С неактивно: фокус в другой программе, и нажатие уходит туда.
В этих ситуациях спасают способы из разделов про фоновые задания и аварийное завершение.
Отладчик конфигуратора: как остановить код на нужной строке
Разработчику мало просто «убить» операцию — нужно увидеть, где именно она крутится. Для этого в конфигураторе есть меню Отладка.
Порядок действий при зависшем цикле:
- Запустите базу из конфигуратора через
Отладка → Начать отладку(F5) — клиент сразу будет подключён к отладчику. - Повторите действие, которое приводит к зависанию.
- Вернитесь в конфигуратор и выберите
Отладка → Прервать. - Отладчик остановит код на текущей строке и откроет модуль. Стек вызовов покажет, через какие процедуры вы туда пришли.
- Посмотрите значения переменных в табло или через вычисление выражения (
Shift+F9) и решите, почему цикл не заканчивается.
Если база уже запущена без отладки, подключитесь к ней через Отладка → Подключение: в окне видны предметы отладки — клиентские и серверные сеансы, фоновые задания.
Основные команды отладчика
| Действие | Клавиша | Когда использовать |
|---|---|---|
| Начать / продолжить отладку | F5 | Запуск и продолжение после остановки |
| Точка останова | F9 | Остановиться на конкретной строке |
| Шагнуть в | F11 | Зайти внутрь вызываемой процедуры |
| Шагнуть через | F10 | Выполнить строку целиком, не заходя внутрь |
| Шагнуть из | Shift+F11 | Дойти до конца текущей процедуры |
| Идти до курсора | Shift+F10 | Пропустить кусок кода до строки с курсором |
| Вычислить выражение | Shift+F9 | Посмотреть значение переменной или выражения |
| Завершить отладку | Shift+F5 | Закончить сеанс отладки |
Остановка по условию и по ошибке
Когда цикл проходит 50 000 строк, а сбой на 37 412-й, ставить простую точку останова бессмысленно. Выручают два приёма:
- 🎯 Точка останова с условием — в меню
Отладказадаёте выражение, напримерНомерСтроки = 37412илиКонтрагент.ИНН = "7700000000". Отладчик остановится только тогда, когда условие истинно. - 🧯 Остановка по ошибке —
Отладка → Остановка по ошибке. Отладчик встанет на строке, где возникло исключение, даже если оно потом перехвачено вПопытка … Исключение. Можно отфильтровать по тексту ошибки.
Для отладки серверного кода в клиент-серверной базе сервер 1С должен быть запущен с разрешённой отладкой. Если серверных предметов в окне подключения нет — обратитесь к администратору сервера: включение отладки требует перезапуска службы, а значит, обрыва сеансов всех пользователей. Делайте это вне рабочего времени.
Программная остановка: Прервать, Возврат, Отказ и исключения
В коде «остановить выполнение» значит одно из четырёх. Выбор зависит от того, что именно нужно прекратить.
| Конструкция | Что останавливает | Типичный случай |
|---|---|---|
Прервать; | Текущий цикл | Нашли нужную строку — дальше искать не нужно |
Продолжить; | Текущую итерацию цикла | Пропустить строку с пустым значением |
Возврат; | Текущую процедуру или функцию | Проверка не прошла, дальше выполнять бессмысленно |
Отказ = Истина; | Запись или проведение объекта | Проверка в ПередЗаписью или ОбработкаПроведения |
ВызватьИсключение | Всю цепочку вызовов до ближайшей Попытка | Критическая ошибка, транзакцию нужно откатить |
Даём пользователю нажать Ctrl+Break внутри долгого цикла
Встроенная процедура ОбработкаПрерыванияПользователя() проверяет, не нажал ли пользователь Ctrl+Break. Если нажал — показывает вопрос и при подтверждении вызывает исключение. Вставьте её в тело длинного клиентского цикла:
&НаКлиенте
Процедура ОбработатьСтроки(Команда)
Всего = Объект.Товары.Количество();
Для Каждого Строка Из Объект.Товары Цикл
ОбработкаПрерыванияПользователя();
Строка.Сумма = Строка.Количество * Строка.Цена;
Состояние("Обработано строк: " + Формат(Строка.НомерСтроки, "ЧГ=0") + " из " + Формат(Всего, "ЧГ=0"));
КонецЦикла;
КонецПроцедуры
Состояние() выводит прогресс внизу окна — пользователь видит, что программа работает, и реже снимает её через диспетчер задач.
Остановка с понятным текстом через исключение
ВызватьИсключение прерывает не только процедуру, а всю цепочку вызовов. Если внутри была открыта транзакция и исключение не перехвачено, она откатится.
Процедура ЗагрузитьФайл(ПутьКФайлу)
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
ВызватьИсключение СтрШаблон("Файл не найден: %1", ПутьКФайлу);
КонецЕсли;
// загрузка данных
КонецПроцедуры
Попытка
ЗагрузитьФайл("C:\Обмен\prices.xml");
Исключение
Текст = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Загрузка прайса", УровеньЖурналаРегистрации.Ошибка, , , Текст);
Сообщить("Загрузка остановлена: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Не глушите исключения пустым блоком Исключение … КонецПопытки. Код молча продолжит работу с неполными данными, а причину потом не найдёт никто: в журнале регистрации ничего не останется.
Отказ от записи и проведения
В обработчиках событий объекта прерывать через исключение не нужно — для этого есть параметр Отказ. Установили Отказ = Истина — платформа не запишет и не проведёт документ, а пользователь увидит ваши сообщения. Само выполнение обработчика при этом продолжается до конца, поэтому после установки флага, если дальше идут тяжёлые действия, ставьте Возврат.
Как остановить фоновое задание и регламентную операцию
Фоновое задание выполняется на сервере без окна, нажать в нём Ctrl+Break нельзя. Остановить его можно тремя путями.
Из интерфейса типовой конфигурации
В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) откройте Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. На вкладке фоновых заданий выделите активное задание и отмените его командой из панели списка.
Чтобы регламентное задание не запустилось снова по расписанию, откройте его на соседней вкладке и снимите флажок использования. Иначе через несколько минут оно стартует опять.
Из кода
У объекта фонового задания есть метод Отменить():
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание <> Неопределено И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Задание.Отменить();
КонецЕсли;
Найти все работающие задания можно отбором:
Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
Активные = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для Каждого Задание Из Активные Цикл
Сообщить(Задание.Наименование + " — " + Задание.ИмяМетода);
КонецЦикла;
После отмены состояние задания станет Отменено, а незавершённая транзакция откатится.
Блокировка всех регламентных заданий базы
Когда нужно остановить все регламентные задания разом (например, перед обновлением), администратор открывает свойства информационной базы в консоли кластера и включает блокировку регламентных заданий. Задания перестанут запускаться по расписанию, пока флаг не снимут.
Аварийная остановка, когда 1С зависла
Если программа не реагирует ни на Ctrl+Break, ни на закрытие окна, действуйте по нарастающей. Перед каждым шагом подождите 2–3 минуты: долгий запрос часто выглядит как зависание, но завершается сам.
Завершение сеанса в консоли кластера
- Откройте «Администрирование серверов 1С Предприятия».
- Разверните кластер, затем
Информационные базы → нужная база → Сеансы. - Найдите сеанс по пользователю, компьютеру и приложению. Колонки с временем вызова и объёмом прочитанных данных подскажут, кто «тяжёлый».
- Удалите сеанс через контекстное меню.
Из командной строки то же делает утилита rac: список сеансов выводит rac session list, параметры завершения сеанса смотрите в rac help session.
Удаление сеанса обрывает работу пользователя без сохранения: несохранённые изменения в открытых формах пропадут. Предупредите человека, если он на связи.
Диспетчер задач — последний шаг
Процессы клиента: 1cv8c.exe — тонкий клиент, 1cv8.exe — толстый клиент и конфигуратор. Снятие процесса закрывает окно, но в клиент-серверной базе серверный вызов может продолжать работу ещё какое-то время. Поэтому для серверной базы сначала консоль, потом диспетчер.
Никогда не снимайте процесс rphost.exe на работающем сервере ради одного зависшего пользователя. Рабочий процесс обслуживает десятки сеансов — оборвутся все. Такой шаг допустим только по согласованию и в нерабочее время.
После аварийного снятия файловой базы запустите конфигуратор. Если база не открывается или ведёт себя странно — сделайте копию и выполните Администрирование → Тестирование и исправление в конфигураторе. Режим требует монопольного доступа: все пользователи должны выйти.
Почему выполнение не останавливается и как найти причину
Зависание — симптом. Пока не найдена причина, ситуация повторится завтра в то же время.
Частые источники «вечной» операции:
- 🔁 бесконечный цикл —
Покабез изменения условия, рекурсия без выхода; - 🗄️ тяжёлый запрос — отбор по неиндексированному реквизиту, соединение с виртуальной таблицей без параметров, запрос внутри цикла по 10 000 строк;
- 🔒 ожидание блокировки — другой сеанс держит те же данные. Характерный текст ошибки по таймауту:
Превышено максимальное время ожидания предоставления блокировки; - 📡 внешний ресурс — обмен с сайтом, ЭДО или банком, который не отвечает, а таймаут в соединении не задан;
- 💾 нехватка ресурсов — сервер ушёл в своп, диск забит.
Инструменты диагностики
| Инструмент | Что покажет | Где включается |
|---|---|---|
| Замер производительности | Какие строки кода выполняются дольше всего | Меню Отладка конфигуратора |
| Журнал регистрации | Что делал пользователь до зависания, ошибки | Администрирование в конфигураторе или раздел обслуживания в базе |
| Технологический журнал | Длинные запросы, ожидания блокировок, взаимоблокировки | Файл logcfg.xml в каталоге настроек сервера |
| Консоль кластера | Кто сейчас грузит сервер и кто держит блокировку | Список сеансов и соединений базы |
Замер производительности — самый быстрый путь для разработчика. Включили, повторили медленное действие, выключили: в отчёте видно, какая строка заняла 90% времени.
Профилактика
- ✅ Длинную обработку запускайте фоновым заданием, а не в клиентском цикле. В БСП для этого есть общий модуль
ДлительныеОперации— пользователь видит индикатор и может отменить операцию. - ✅ В клиентских циклах вызывайте
ОбработкаПрерыванияПользователя()и показывайте прогресс. - ✅ Задавайте таймаут в
HTTPСоединениеи других внешних подключениях. - ✅ Выносите запросы из циклов: один пакетный запрос вместо тысячи мелких.
- ✅ Разносите тяжёлые регламентные задания по времени, чтобы они не пересекались с закрытием месяца.