Зависла обработка или отчёт в 1С 8.3: как остановить её и не испортить базу
Содержание
Прервать выполнение процедуры в 1С 8.3 быстрее всего сочетанием Ctrl+Break в окне программы: платформа остановит код на ближайшей точке проверки и откатит незавершённую транзакцию. Если окно не реагирует, следующие ступени — завершить процесс клиента в Диспетчере задач, удалить сеанс в консоли администрирования сервера или отменить фоновое задание. Порядок именно такой: от мягкого к жёсткому.
Типичная картина: бухгалтер запустил перепроведение документов за квартал, через 20 минут понял, что выбрал не тот период, а прогресс всё ещё ползёт. Или отчёт с неудачным отбором повесил программу на полчаса. Ниже — что делать на каждом этапе, чтобы остановить процесс и не получить базу с полупроведёнными документами.
Что происходит при остановке процедуры: транзакции и откат
Прежде чем жать кнопки, полезно понимать, что именно вы обрываете. От этого зависит, в каком состоянии останутся данные.
- 🔄 Процедура внутри одной транзакции (запись документа, проведение одного документа, закрытие месяца по шагу). При прерывании СУБД откатывает всё, что сделано в транзакции. Документ остаётся в том виде, в каком был до запуска.
- 📦 Процедура обрабатывает объекты по одному (групповое перепроведение, обработка заполнения, загрузка из файла). Каждый объект пишется в своей транзакции. При остановке на 400-м документе из 1000 первые 399 уже изменены, а остальные — нет.
- 📊 Отчёт или запрос на чтение. Данные не меняются, остановка безопасна в любой момент.
Перед остановкой групповой обработки запишите, на каком документе или дате она была. Потом проще перезапустить её с этого места, а не гонять всё заново.
Ещё одна неочевидная вещь: откат длинной транзакции на стороне СУБД занимает время, иногда сопоставимое с тем, что уже успело выполниться. Если обработка писала в базу 15 минут одной транзакцией, после прерывания сервер может ещё несколько минут держать блокировки. Это не зависание, а нормальный откат.
Способ 1. Ctrl+Break и штатное прерывание в окне 1С:Предприятия
Это первый и самый безопасный способ. Он работает в тонком, толстом и веб-клиенте, в файловой и клиент-серверной базе.
Как прервать выполнение с клавиатуры
- Переключитесь на окно 1С, в котором идёт операция. Курсор должен быть в окне программы.
- Нажмите
Ctrl+Break. - Дождитесь сообщения о прерывании. Если появился вопрос о прерывании выполнения, подтвердите его.
- Проверьте результат: обновите список документов или откройте объект, с которым шла работа.
На ноутбуках клавиши Break (Pause) часто нет. Варианты:
- ⌨️
Ctrl+Fn+PauseилиCtrl+Fn+B— зависит от производителя, ищите подписьPause/Breakна клавишах; - 🖱️ экранная клавиатура Windows (
osk.exe): включите на нейCtrl, затем нажмитеPause.
Почему Ctrl+Break срабатывает не сразу
Платформа не может оборвать код в произвольной точке. Она проверяет флаг прерывания между операциями встроенного языка. Если в этот момент сервер ждёт ответа СУБД на тяжёлый запрос, прерывание наступит только после возврата управления.
Отсюда практическое правило: после Ctrl+Break подождите 1–3 минуты. Повторные нажатия ничего не ускоряют.
Кнопка отмены в длительных операциях
В типовых конфигурациях на базе БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) тяжёлые действия часто выполняются в фоне. На экране при этом крутится индикатор ожидания с кнопкой «Отмена». Нажатие отменяет фоновое задание на сервере — это аналог Ctrl+Break, только для фоновой операции.
Закрыть окно ожидания крестиком — не то же самое, что «Отмена». В ряде форм задание продолжит работать на сервере, и результат просто никто не увидит.
Если процедура запущена под отладкой
Разработчику проще: зависший код можно остановить прямо из Конфигуратора. В меню Отладка есть команда «Прервать» — выполнение встанет на текущей строке, и вы увидите, где именно крутится цикл. Дальше можно посмотреть значения переменных в табло и решить, продолжать или завершить отладку командой «Остановить отладку» (Shift+F5).
Это лучший способ найти причину зависания самописной обработки: вместо гадания вы видите строку кода и номер итерации. Отладку на клиент-серверной базе включают заранее — на сервере 1С должен быть разрешён режим отладки, иначе Конфигуратор не подключится к серверным вызовам.
Способ 2. Завершение процесса 1С через Диспетчер задач
Когда окно «Не отвечает», а Ctrl+Break не помогает 5–10 минут, остаётся снять процесс клиента.
Какой процесс завершать
| Процесс | Что это | Когда снимать |
|---|---|---|
1cv8c.exe | тонкий клиент | зависла работа в обычном пользовательском режиме |
1cv8.exe | толстый клиент и Конфигуратор | завис Конфигуратор или толстый клиент |
1cestart.exe | стартер, окно выбора баз | обычно не нужен, он только запускает клиент |
Порядок действий
- Откройте Диспетчер задач:
Ctrl+Shift+Esc. - На вкладке «Подробности» найдите нужный процесс. Если открыто несколько окон 1С, ориентируйтесь по столбцу «Имя пользователя» и потреблению ЦП: зависший процесс обычно грузит ядро.
- Выделите процесс и нажмите «Снять задачу».
Через командную строку то же самое делается так:
tasklist /fi "imagename eq 1cv8c.exe"
taskkill /pid 12345 /f
12345 замените на PID из вывода первой команды. Команда taskkill /im 1cv8c.exe /f закроет все тонкие клиенты на компьютере сразу, на терминальном сервере — у всех пользователей. На терминальном сервере снимайте процесс только по PID конкретного пользователя.
Важный нюанс для клиент-серверной базы
Убийство клиента в клиент-серверном варианте не всегда останавливает код. Серверный вызов продолжает выполняться в рабочем процессе rphost.exe, пока не закончится или пока сервер не обнаружит разрыв соединения. Поэтому если после закрытия клиента база всё ещё тормозит у остальных, переходите к способу 3.
Способ 3. Как остановить сеанс на сервере 1С:Предприятия
Для клиент-серверной базы это самый точный инструмент: вы обрываете конкретный сеанс конкретного пользователя, не трогая остальных.
Через консоль администрирования серверов
- Запустите «Администрирование серверов 1С Предприятия».
- Раскройте: центральный сервер →
Кластеры→ нужный кластер →Информационные базы→ ваша база →Сеансы. - Найдите сеанс по пользователю, компьютеру и приложению. Полезные столбцы: время начала, «Время вызова (текущее)», захваченные СУБД данные.
- В контекстном меню сеанса выберите «Удалить».
В свежих версиях платформы в контекстном меню сеанса есть и мягкий вариант — прерывание текущего серверного вызова. Он останавливает только выполняемую операцию, а сам сеанс и окно пользователя остаются живы. Если такая команда есть — начните с неё.
Удаление сеанса закрывает программу у пользователя без сохранения. Несохранённые формы пропадут. Предупредите человека заранее, если это возможно.
Через утилиту rac
Если консоли под рукой нет, работает утилита rac из каталога платформы. Нужен запущенный сервер администрирования ras.
rac cluster list
rac session list --cluster=<uuid-кластера>
rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса>
Если на кластере задан администратор, добавьте --cluster-user=<имя> --cluster-pwd=<пароль>. Для прерывания только текущего вызова в новых версиях есть команда rac session interrupt-current-server-call; её параметры уточните в справке rac help session.
Крайняя мера: рабочий процесс rphost
Если сеанс не удаляется, а сервер упёрся в 100% ЦП, можно завершить процесс rphost.exe, который этот сеанс обслуживает. Кластер поднимет новый рабочий процесс автоматически.
Завершение rphost обрывает работу всех пользователей, которых обслуживал этот процесс, а не только одного. Делайте это в обед или вечером и после предупреждения пользователей. Службу агента сервера 1С перезапускать ради одной зависшей процедуры не нужно.
Способ 4. Отмена фоновых и регламентных заданий
Часть «зависших процедур» вообще не видна пользователю: это обмен данными, загрузка курсов, полнотекстовый поиск, обновление версии ИБ, работающие по расписанию.
Из пользовательского режима
В конфигурациях на БСП:
- Откройте
Администрирование → Обслуживание. - В группе регламентных операций откройте «Регламентные и фоновые задания».
- На вкладке фоновых заданий найдите задание в состоянии «Активно».
- Выделите его и нажмите «Отменить».
Чтобы задание не запустилось снова через 5 минут, откройте его на вкладке регламентных заданий и снимите флажок «Включено» или поменяйте расписание.
Из кода
Если вы знаете уникальный идентификатор задания (его, например, пишет в журнал своя обработка), отмена выглядит так:
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание <> Неопределено И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Задание.Отменить();
КонецЕсли;
Код выполняется на сервере и требует административных прав.
Блокировка всех регламентных заданий базы
Для клиент-серверной базы в консоли администрирования откройте свойства информационной базы и включите флажок «Блокировка регламентных заданий включена». Новые регламентные задания перестанут стартовать. Уже запущенные при этом не прерываются — их нужно отменить отдельно.
Это удобно перед обновлением конфигурации или когда регламентный обмен раз за разом вешает базу.
Как прервать процедуру в файловой базе 1С
В файловом варианте нет сервера: весь код выполняется внутри процесса клиента на компьютере пользователя. Это упрощает задачу.
- ✅
Ctrl+Breakи кнопка «Отмена» работают так же, как в клиент-серверной базе. - ✅ Снятие процесса
1cv8c.exeили1cv8.exeгарантированно останавливает код — продолжать его негде. - ⚠️ Фоновые задания в файловой базе выполняются в процессе одного из запущенных клиентов. Закрыли этот клиент — задание прервалось.
Что сделать после аварийного завершения
Жёсткое завершение процесса в момент записи может оставить файл базы 1Cv8.1CD в несогласованном состоянии. Риск невелик, но проверка займёт 5–15 минут на базе средних размеров:
- Попросите всех выйти из базы.
- Сделайте копию каталога базы или выгрузку
.dt. - Откройте базу в Конфигураторе и запустите
Администрирование → Тестирование и исправление. - Для начала отметьте только проверку логической целостности, без реструктуризации.
Этот режим требует монопольного доступа, поэтому его проводят вне рабочего времени.
Как выгнать других пользователей из файловой базы
Удалить чужой сеанс, как в консоли сервера, в файловой базе нельзя. Вместо этого в конфигурациях на БСП используйте блокировку: Администрирование → Обслуживание → Блокировка работы пользователей. Пользователи получат предупреждение и будут отключены к назначенному времени.
Почему 1С зависает на процедуре и как это предотвратить
Остановить процедуру — полдела. Если причина не устранена, завтра всё повторится.
Частые причины
- 🔒 Ожидание блокировки. Процедура ждёт, пока другой сеанс освободит данные. Признак — ошибка с текстом
Конфликт блокировок при выполнении транзакцииилиПревышено максимальное время ожидания предоставления блокировки. - 🐢 Тяжёлый запрос. Отчёт без отбора по периоду или организации читает всю базу за годы.
- 🔁 Бесконечный цикл во внешней обработке или доработке, особенно в самописном коде.
- 🌐 Ожидание внешнего ресурса. Обмен с сайтом, банком, ЭДО: сервер ждёт ответа, а таймаут не задан.
- 💾 Нехватка ресурсов: память рабочего процесса, место на диске, переполненный
tempdbна MS SQL.
Что делать заранее
- Длинные операции (перепроведение, закрытие месяца) запускайте вечером, когда в базе нет людей, — меньше конфликтов блокировок.
- В отчётах всегда ставьте период и отбор, прежде чем жать «Сформировать».
- Внешние обработки сначала прогоняйте на копии базы.
- Следите за журналом регистрации:
Администрирование → Обслуживание → Журнал регистрации, отбор по уровню «Ошибка».
Совет разработчику
Если вы пишете обработку с циклом по тысячам объектов, вставьте в цикл вызов ОбработкаПрерыванияПользователя() — тогда Ctrl+Break сработает между итерациями, а не после всего цикла. Метод доступен в клиентском коде. Серверные тяжёлые операции выносите в фоновое задание с кнопкой отмены, как это сделано в типовых конфигурациях.