Зависла операция в 1С: как остановить её и не повредить данные
Содержание
Прервать процедуру в 1С 8.3 проще всего клавишами Ctrl+Break прямо в окне программы: платформа спросит подтверждение и откатит незавершённую транзакцию. Если операция идёт фоновым заданием, её отменяют кнопкой в форме ожидания или в списке фоновых заданий. Зависший серверный вызов чужого пользователя администратор останавливает в консоли кластера.
Частое заблуждение — «снять 1С через диспетчер задач, и процедура остановится». В клиент-серверной базе это не так: закрывается только окно клиента, а серверный вызов продолжает работать в рабочем процессе rphost и держит блокировки. Ниже способы по нарастанию жёсткости: от безопасных к радикальным.
Что происходит с данными при прерывании процедуры
Прежде чем жать кнопки, полезно понять, что именно вы обрываете. От этого зависит, нужно ли потом что-то проверять.
- 🔄 Операция в одной транзакции (проведение документа, запись набора записей). При прерывании транзакция откатывается целиком. Документ остаётся в прежнем состоянии, движений «наполовину» не будет.
- 📦 Групповая обработка (перепроведение за месяц, закрытие месяца , загрузка из файла). Обычно каждый объект пишется в своей транзакции. Прервали на 300-м документе из 1000 — первые 299 уже проведены, остальные нет.
- 📤 Обмен данными. Часть сообщений может быть загружена, номер принятого сообщения не обновлён. Следующий сеанс обмена обычно догружает данные, но результат стоит проверить.
- 🧮 Регламентные операции закрытия месяца. Часть шагов выполнена, часть нет. Запустите закрытие месяца повторно — оно пересчитает всё заново.
Правило простое: после прерывания групповой операции запустите её повторно с теми же параметрами. Типовые обработки перепроведения и закрытия месяца рассчитаны на повторный запуск.
Не прерывайте обновление конфигурации и реструктуризацию базы. Это не обычная процедура: обрыв на этапе изменения структуры таблиц может оставить базу в неработоспособном состоянии. Если обновление идёт часами, сначала проверьте нагрузку на сервер СУБД и диск, а не убивайте процесс.
Способ 1. Прервать операцию из своего сеанса
Это первое, что стоит попробовать. Способ безопасен и не требует прав администратора.
Клавиши Ctrl+Break
- Убедитесь, что окно 1С активно (щёлкните по заголовку).
- Нажмите
Ctrl+Break. На ноутбуках без клавиши Break часто работаетCtrl+Fn+BилиCtrl+Fn+Pause— зависит от производителя. - Подтвердите прерывание в появившемся вопросе.
- Дождитесь сообщения о том, что выполнение прервано. Откат большой транзакции может занять заметное время — не жмите повторно.
Во время длинных операций платформа сама пишет в строке состояния подсказку «Для прерывания нажмите Ctrl+Break». Если подсказка есть — способ сработает.
Кнопка отмены в форме длительной операции
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) тяжёлые операции запускаются фоновым заданием. На экране появляется форма ожидания с индикатором и кнопкой «Отмена». Нажатие отменяет фоновое задание на сервере.
| Что видите на экране | Чем прервать | Что произойдёт |
|---|---|---|
| Курсор-часы, окно «не отвечает», подсказка в строке состояния | Ctrl+Break | Серверный вызов прерывается, транзакция откатывается |
| Форма ожидания с индикатором | Кнопка «Отмена» | Отменяется фоновое задание |
| Окно закрыли, а операция «висит» у всех | Консоль кластера (способ 3) | Прерывается вызов или завершается сеанс |
Если Ctrl+Break не реагирует 5-10 минут, значит, процедура не возвращает управление клиенту: ждёт блокировку или долгий запрос к СУБД. Переходите к анализу блокировок, а не к диспетчеру задач.
Способ 2. Отменить фоновые и регламентные задания
Многие «зависшие процедуры» на самом деле работают без пользователя: обмен по расписанию, загрузка курсов, обновление полнотекстового индекса, отложенное обновление после установки релиза.
Где увидеть фоновые задания
В конфигурациях на БСП откройте Администрирование → Обслуживание и перейдите по ссылке «Регламентные и фоновые задания». На вкладке фоновых заданий видно состояние каждого: «Активно», «Завершено», «Завершено аварийно», «Отменено».
- Найдите задание в состоянии «Активно».
- Посмотрите время начала: если операция обычно идёт 2 минуты, а работает 40, это ваш кандидат.
- Выделите задание и отмените его командой из командной панели формы.
- Обновите список и убедитесь, что состояние сменилось на «Отменено».
Отмена фонового задания работает так же, как Ctrl+Break: текущая транзакция откатывается.
Временно запретить регламентные задания
Если задание запускается снова и снова (например, обмен каждые 5 минут), одной отмены мало. Варианты:
- ⏸️ В конфигурации: откройте карточку регламентного задания в той же форме и снимите флажок «Включено». Не забудьте вернуть его после разбора проблемы.
- 🖥️ В консоли кластера: в свойствах информационной базы установите флажок «Блокировка регламентных заданий включена». Платформа перестанет запускать любые регламентные задания этой базы.
Блокировку регламентных заданий в консоли удобно включать перед ручным обслуживанием базы. Многие забывают её снять — и неделю удивляются, почему не приходят курсы валют и не работает обмен.
Способ 3. Остановить процедуру через консоль администрирования кластера
Способ для клиент-серверного варианта. Нужны права администратора кластера и установленная оснастка «Администрирование серверов 1С:Предприятия». Консоль подключается к агенту сервера (по умолчанию порт 1540).
Найти сеанс, который выполняет процедуру
- Откройте консоль, разверните
Кластеры → <кластер> → Информационные базы → <база> → Сеансы. - Добавьте или найдите колонки с временем текущего вызова и временем вызова СУБД — по ним видно, какой сеанс работает долго.
- Сеанс фонового задания отображается с приложением «Фоновое задание», пользовательский — с именем пользователя и компьютера.
Прервать вызов или завершить сеанс
В актуальных версиях платформы 8.3 в контекстном меню сеанса есть команда «Прервать текущий серверный вызов». Это самый мягкий вариант: сеанс остаётся жив, пользователь видит сообщение об ошибке, транзакция откатывается.
Если команды нет или она не помогла, выделите сеанс и выберите «Удалить». Сеанс завершается принудительно, несохранённые данные пользователя в открытых формах теряются.
Из командной строки то же самое делает утилита rac. Список сеансов выводит rac session list --cluster=<id> --infobase=<id>. Точный синтаксис прерывания вызова и завершения сеанса для вашей версии смотрите в rac help session.
Перед удалением сеанса предупредите пользователя: он потеряет несохранённую работу. Удаление сеанса — точечное действие, остальных пользователей оно не затрагивает.
Способ 4. Найти, кто держит блокировку
Очень часто «зависание» — это ожидание. Процедура стоит, потому что нужные ей данные заблокировал другой сеанс. Прерывать надо не ту операцию, что висит, а ту, что мешает.
Признаки ожидания блокировки
- ⏳ У нескольких пользователей одновременно «висит» проведение документов одного вида.
- 🧾 Через некоторое время появляется ошибка
Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки. - 🔒 В режиме автоматических блокировок или на СУБД — ошибки взаимоблокировки (deadlock).
Время ожидания управляемой блокировки задаётся в свойствах информационной базы на сервере, по умолчанию 20 секунд. Если процедура «висит» намного дольше, причина обычно не в управляемой блокировке, а в долгом запросе или блокировке на уровне СУБД.
Где смотреть
- Консоль кластера. В ветке информационной базы есть узел «Блокировки»: видно, какой сеанс и на какие объекты держит блокировки. Сопоставьте с узлом «Сеансы».
- Технологический журнал. Его включают файлом
logcfg.xmlв каталогеconfплатформы (например,C:\Program Files\1cv8\conf\). Для разбора блокировок собирают событияTLOCK,TTIMEOUT,TDEADLOCK. - Средства СУБД. На MS SQL Server — монитор активности или процедура
sp_who2: колонка блокирующего процесса покажет виновника.
Пример минимального logcfg.xml для сбора событий блокировок:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\techlog" history="24">
<event>
<eq property="name" value="TLOCK"/>
</event>
<event>
<eq property="name" value="TTIMEOUT"/>
</event>
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<property name="all"/>
</log>
</config>
Технологический журнал с property name="all" на нагруженном сервере быстро растёт. Пишите его на диск с запасом места, держите включённым только на время разбора, затем удалите файл logcfg.xml.
Нашли сеанс-виновник — прерывайте его вызов через консоль (способ 3). Завершать процесс СУБД командой KILL в обход 1С не стоит: платформа узнает об обрыве только по ошибке соединения.
Способ 5. Прервать выполнение через отладчик и код
Этот вариант нужен программисту, который пишет или дорабатывает обработку.
Отладчик
- Запустите Конфигуратор и подключитесь к нужному сеансу через
Отладка → Подключение. Для серверной отладки на сервере должна быть включена отладка (параметр-debugу службы агента или настройка в актуальных версиях). - Когда процедура зависла, выполните команду прерывания из меню
Отладка. Выполнение остановится на текущей строке. - Посмотрите стек вызовов: сразу видно, в каком цикле или запросе застряла процедура.
- Завершите отладку, чтобы снять процедуру.
Обработка прерывания в цикле
Если пишете длинный клиентский цикл, дайте пользователю возможность его остановить. Для этого в теле цикла вызывают ОбработкаПрерыванияПользователя():
&НаКлиенте
Процедура ОбработатьСтроки(Команда)
Для Каждого Строка Из Объект.Товары Цикл
ОбработкаПрерыванияПользователя();
// обработка строки
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;
КонецПроцедуры
Метод проверяет, нажал ли пользователь Ctrl+Break, и если да — спрашивает подтверждение и прерывает выполнение. Работает он только на клиенте.
Для долгих серверных операций правильнее выносить работу в фоновое задание. Тогда его можно отменить из кода методом Отменить() объекта фонового задания, а пользователю показать форму ожидания с кнопкой отмены.
Способ 6. Когда программа не реагирует ни на что
Крайние меры. Каждая следующая обрывает больше сеансов, поэтому идите по порядку.
| Мера | Что затрагивает | Когда допустимо |
|---|---|---|
Снять процесс клиента 1cv8c.exe / 1cv8.exe в диспетчере задач | Только этот клиент | Файловая база или окно не отвечает, а серверный вызов уже прерван |
Завершить рабочий процесс rphost в консоли или диспетчере задач сервера | Все сеансы на этом процессе | Сеанс не удаляется из консоли, процесс «съел» память или процессор |
| Перезапустить службу «Агент сервера 1С:Предприятия 8.3» | Все базы кластера | Консоль не отвечает, процессы не завершаются |
| Перезагрузить сервер | Всё на сервере | Ничего из перечисленного не помогло |
Перед завершением rphost, перезапуском службы или сервера предупредите всех пользователей: у них оборвутся сеансы и пропадут несохранённые данные. Делайте это в обед, вечером или после рассылки предупреждения.
Выгнать всех пользователей штатно
Если нужно остановить всё и сразу, но мягко, используйте блокировку работы пользователей. В БП 3.0, ЗУП 3.1 и УТ 11 она находится в Администрирование → Обслуживание, ссылка «Блокировка работы пользователей». Задайте текст сообщения, время начала и код разрешения. Пользователи получат предупреждение, затем сеансы завершатся.
Из командной строки то же делают параметрами запуска:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Администратор" /P"пароль" /C"ЗавершитьРаботуПользователей" /UC"КОД123"
Снимают блокировку запуском с /C"РазрешитьРаботуПользователей" и тем же кодом в /UC.
Особенности файловой базы
В файловом варианте нет консоли и сервера: процедура выполняется прямо в процессе клиента. Поэтому снятие процесса в диспетчере задач действительно её останавливает.
- 💾 После аварийного закрытия запустите базу снова и проверьте последние документы.
- 🧰 Если база не открывается, сделайте копию каталога базы и запустите тестирование и исправление в Конфигураторе. Для него нужен монопольный доступ — все пользователи должны выйти.