Зависла обработка или отчёт: как прервать код 1С без потери данных
Содержание
Остановить выполнение процедуры в 1С:Предприятии 8.3 можно сочетанием Ctrl+Break прямо в окне программы. Если код не реагирует, процедуру прерывают из отладчика Конфигуратора, отменой фонового задания или завершением сеанса в консоли кластера серверов.
Частое заблуждение — сразу «снимать» программу через диспетчер задач. Это самый грубый способ: транзакция откатится, но в файловой базе можно получить повреждённые данные. Начинайте с мягких способов и переходите к жёстким, только если предыдущий не сработал.
| Способ | Когда подходит | Что теряется |
|---|---|---|
Ctrl+Break в окне 1С | Цикл или запрос в вашем же сеансе | Изменения незавершённой транзакции |
| Отладчик → «Прервать» | Нужно понять, где именно зависло | Ничего, если потом продолжить |
| Отмена фонового задания | Длительная операция, регламентное задание | Результат задания |
| Удаление сеанса в консоли | Клиент завис намертво, база клиент-серверная | Несохранённые данные пользователя |
| Завершение процесса ОС | Последний вариант | Несохранённые данные, риск для файловой базы |
Как прервать выполнение кода из режима пользователя
Первое, что стоит сделать, — нажать Ctrl+Break в окне клиента, где идёт долгая операция. На ноутбуках без клавиши Break обычно работает Ctrl+Fn+B или Ctrl+Fn+Pause: комбинация зависит от производителя клавиатуры.
Платформа реагирует на нажатие в момент, когда код проверяет прерывание. В типовых обработках такая проверка стоит внутри циклов, поэтому остановка срабатывает за секунды. После подтверждения выполнение прерывается с ошибкой, а открытая транзакция откатывается целиком.
Что важно знать про Ctrl+Break:
- ✅ Работает для кода, который выполняется в вашем сеансе: отчёт, обработка, групповое перепроведение.
- ⏳ Если сервер выполняет один тяжёлый запрос, реакция может прийти только после его окончания.
- 🔁 Самописный цикл без проверки прерывания может не реагировать до конца цикла.
- 🚫 На фоновые задания и чужие сеансы клавиша не действует.
Если окно 1С «побелело» и не отвечает, подождите 1–2 минуты. Тонкий клиент часто просто ждёт ответа сервера. Повторное нажатие Ctrl+Break или клики по окну процесс не ускорят.
Закрыть окно крестиком во время выполнения не получится: клиент сначала дождётся окончания серверного вызова. Поэтому, если Ctrl+Break не помог, переходите к следующим разделам.
Почему одни обработки прерываются, а другие нет
Встроенный язык проверяет нажатие Ctrl+Break через процедуру ОбработкаПрерыванияПользователя(). Разработчик вызывает её в теле долгого цикла на клиенте:
Для Каждого Строка Из ТаблицаДанных Цикл
ОбработкаПрерыванияПользователя();
// обработка строки
КонецЦикла;
Если в самописной обработке такого вызова нет, единственный способ её остановить — завершить сеанс. Это повод попросить программиста добавить проверку.
Остановка процедуры в отладчике Конфигуратора
Отладчик нужен, когда важно не просто остановить код, а увидеть, на какой строке он крутится. Типичный случай — бесконечный цикл в доработке или запрос, который вдруг стал выполняться минутами.
Порядок действий:
- Откройте базу в Конфигураторе.
- Запустите пользовательский режим из Конфигуратора с отладкой (
F5) или подключитесь к уже запущенному клиенту черезОтладка → Подключение. - Повторите действие, которое зависает.
- В Конфигураторе выберите
Отладка → Прервать. Выполнение остановится на текущей строке. - Откройте стек вызовов (
Отладка → Стек вызовов). Он покажет цепочку процедур до места остановки. - Чтобы продолжить —
F5. Чтобы снять отлаживаемое приложение —Отладка → Завершить отладку(Shift+F5).
Для серверного кода в клиент-серверной базе нужна отладка на сервере. Её включают параметром -debug в строке запуска службы агента сервера (ragent). Перезапуск службы агента обрывает все сеансы на этом сервере — делайте это вне рабочего времени и не на рабочем сервере, если есть тестовый.
Подключать отладчик к сеансу пользователя в рабочей базе можно, но остановленный на точке останова код держит блокировки. Остальные пользователи в это время могут получать ошибки ожидания блокировки.
Что смотреть в точке остановки
- 🔍 Счётчики циклов в «Табло»: растёт ли значение или стоит на месте.
- 📋 Текст запроса и параметры: часто виноват пустой отбор, из-за которого выбирается вся таблица.
- 🧭 Стек вызовов: в какой процедуре и из какой формы пришёл вызов.
Включать в отладчике «Остановку по ошибке» полезно, когда процедура зависает после исключения, которое кто-то перехватил и молча продолжил цикл.
Отмена фоновых и регламентных заданий
Многие длительные операции типовых конфигураций работают в фоновом задании: закрытие месяца , обновление курсов, загрузка классификаторов, обмены. Пользователь видит «колесо ожидания», но сама процедура идёт на сервере отдельно от его окна.
В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) список заданий открывается так:
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания
Дальше:
- Перейдите на вкладку фоновых заданий.
- Найдите задание в состоянии «Выполняется» по наименованию и времени начала.
- Выделите строку и выполните команду отмены задания.
- Обновите список: состояние должно смениться на «Отменено».
Отмена срабатывает не мгновенно. Если задание в этот момент ждёт ответа СУБД, статус поменяется после возврата управления.
Чтобы регламентное задание не запустилось снова сразу после отмены, откройте его карточку на вкладке регламентных заданий и снимите флажок «Включено». Только запишите себе, что выключили: забытые выключенные задания потом выглядят как «перестали обновляться курсы».
Отмена фонового задания кодом
Администратору с правами на внешние обработки пригодится короткий пример. Он находит активные задания по ключу и отменяет их:
Отбор = Новый Структура("Ключ, Состояние", "МойКлючЗадания", СостояниеФоновогоЗадания.Активно);
Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Для Каждого Задание Из Задания Цикл
Задание.Отменить();
КонецЦикла;
Код выполняется на сервере. Ключ задания видно в карточке задания в списке выше.
Массовая блокировка регламентных заданий
Если регламентные задания мешают обновлению или переносу базы, их можно заблокировать для всей информационной базы. В консоли кластера откройте свойства базы и включите флажок «Блокировка регламентных заданий включена». Задания, которые уже выполняются, это не остановит — их отменяют отдельно.
Как завершить сеанс и прервать серверный вызов в консоли кластера
Когда клиент завис и ни Ctrl+Break, ни отмена не помогли, в клиент-серверной базе процедуру останавливают на стороне сервера. Инструмент — «Администрирование серверов 1С Предприятия» (консоль кластера). Она подключается к агенту сервера по порту 1540.
Порядок действий:
- Откройте консоль, разверните
Центральные серверы 1С:Предприятия → <сервер> → Кластеры → <кластер> → Информационные базы → <база> → Сеансы. - Найдите сеанс по имени пользователя и приложению. Колонки с длительностью текущего вызова и временем вызовов подскажут, кто сейчас нагружает сервер.
- Если версия консоли позволяет, сначала выберите в контекстном меню прерывание текущего серверного вызова. Сеанс останется жив, оборвётся только зависшая процедура.
- Если не помогло — удалите сеанс через контекстное меню. Пользователь получит сообщение о разрыве связи.
Удаление сеанса обрывает работу пользователя без сохранения. Предупредите его заранее. Открытая транзакция откатится, и откат большой транзакции может занять почти столько же времени, сколько она шла.
То же из командной строки через rac
Для удалённой работы или скриптов есть утилита rac. Ей нужен запущенный сервер администрирования ras.
rac cluster list
rac session list --cluster=<uuid кластера>
rac session terminate --cluster=<uuid кластера> --session=<uuid сеанса>
Если на кластере задан администратор, добавьте параметры --cluster-user и --cluster-pwd. Другие подкоманды и точные параметры для вашей версии платформы смотрите в справке rac help session.
Если запрос продолжает выполняться в СУБД
Иногда сеанс 1С уже удалён, а нагрузка на сервер СУБД не падает. Значит, запрос ещё работает на стороне Microsoft SQL Server или PostgreSQL. Обычно СУБД сама отменяет его вслед за разрывом соединения, но не всегда сразу.
Как проверить и что делать:
- В SQL Server Management Studio откройте монитор активности или выполните
sp_who2, в PostgreSQL — запрос к представлениюpg_stat_activity. - Найдите соединение с базой 1С и самым долгим временем выполнения.
- Завершите его: в SQL Server командой
KILL <номер сеанса>, в PostgreSQL функциейpg_cancel_backend(<pid>)(мягко) илиpg_terminate_backend(<pid>)(жёстко).
Это крайняя мера для администратора СУБД. Убедитесь, что соединение принадлежит именно зависшей операции, иначе оборвёте работу другого пользователя.
Если завис рабочий процесс целиком
Бывает, что зависает не один сеанс, а рабочий процесс rphost: консоль показывает его, но сеансы на нём не удаляются. Тогда процесс завершают в узле «Рабочие процессы» консоли или в диспетчере задач сервера.
Завершение rphost обрывает ВСЕ сеансы, которые на нём работали, во всех базах кластера. Делайте это только после предупреждения пользователей. Обычно кластер сам поднимет новый процесс за несколько секунд.
Как прервать процедуру в файловой базе
В файловом варианте нет кластера и консоли. Код выполняется в процессе самого клиента: 1cv8c.exe для тонкого клиента
, 1cv8.exe для толстого и Конфигуратора. Фоновые задания тоже выполняются в процессе клиента, поэтому закрытие клиента останавливает и их.
Порядок действий, если Ctrl+Break не сработал:
- Подождите 2–3 минуты. Файловая база медленнее реагирует при большом объёме данных.
- Попросите остальных пользователей сохранить работу — следующий шаг затрагивает только один компьютер, но повреждение файла базы ударит по всем.
- Откройте диспетчер задач Windows, вкладку «Подробности».
- Найдите процесс
1cv8c.exeили1cv8.exeнужного пользователя и завершите его. - Запустите 1С заново и проверьте, что база открывается.
Если процесс был убит во время записи (проведение, перепроведение, загрузка данных), проверьте файл базы утилитой chdbfl.exe из папки bin платформы. Перед этим — копия файла 1Cv8.1CD, и все пользователи должны выйти из базы.
Если база опубликована на веб-сервере, код выполняется в процессе веб-сервера (для IIS — w3wp.exe, для Apache — httpd.exe). Его перезапуск разом отключит всех веб-пользователей этой публикации.
Для общего доступа к файловой базе по сети есть ещё одна неприятность. Зависший клиент на чужом компьютере держит файл базы открытым. Пока этот процесс жив, остальные могут ловить ошибки блокировки, даже если сами ничего не запускали.
Профилактика: чтобы процедуру не приходилось останавливать
Остановка — это лечение симптома. Если одна и та же операция зависает раз в неделю, ищите причину.
Что помогает со стороны кода:
- 🔁 Вызов
ОбработкаПрерыванияПользователя()в каждом долгом клиентском цикле. - 📦 Долгие операции — в фоновое задание. В конфигурациях на БСП для этого есть общий модуль
ДлительныеОперации, тогда пользователь видит прогресс и может отменить операцию из формы ожидания. - 🧮 Запросы вместо перебора объектов в цикле. Вызов
Ссылка.ПолучитьОбъект()на каждой итерации — частая причина «вечных» обработок. - ⏱ Короткие транзакции. Чем меньше транзакция, тем быстрее откат и тем меньше чужих сеансов ждёт блокировку.
- 🧪 Проверка на копии базы с реальным объёмом данных, а не на пустой демо-базе.
Что помогает со стороны администрирования:
- 📊 Счётчики и ограничения потребления ресурсов в консоли кластера. Ограничение можно настроить так, чтобы при превышении, например, длительности вызова сервер сам прерывал вызов или сеанс.
- 🗓 Тяжёлые регламентные задания — на ночь, а не на 10 утра.
- 🧹 Регламентное обслуживание СУБД: обновление статистики и индексов. Без него запросы со временем замедляются в разы.
- 🔐 Управляемые блокировки. Ошибка «Превышено время ожидания установки блокировки» в другом сеансе часто указывает на зависшую процедуру рядом.