Зависла операция в 1С: как остановить её и не повредить данные

· 9 мин

Содержание

Прервать процедуру в 1С 8.3 проще всего клавишами Ctrl+Break прямо в окне программы: платформа спросит подтверждение и откатит незавершённую транзакцию. Если операция идёт фоновым заданием, её отменяют кнопкой в форме ожидания или в списке фоновых заданий. Зависший серверный вызов чужого пользователя администратор останавливает в консоли кластера.

Частое заблуждение — «снять 1С через диспетчер задач, и процедура остановится». В клиент-серверной базе это не так: закрывается только окно клиента, а серверный вызов продолжает работать в рабочем процессе rphost и держит блокировки. Ниже способы по нарастанию жёсткости: от безопасных к радикальным.

Что происходит с данными при прерывании процедуры

Прежде чем жать кнопки, полезно понять, что именно вы обрываете. От этого зависит, нужно ли потом что-то проверять.

  • 🔄 Операция в одной транзакции (проведение документа, запись набора записей). При прерывании транзакция откатывается целиком. Документ остаётся в прежнем состоянии, движений «наполовину» не будет.
  • 📦 Групповая обработка (перепроведение за месяц, закрытие месяца , загрузка из файла). Обычно каждый объект пишется в своей транзакции. Прервали на 300-м документе из 1000 — первые 299 уже проведены, остальные нет.
  • 📤 Обмен данными. Часть сообщений может быть загружена, номер принятого сообщения не обновлён. Следующий сеанс обмена обычно догружает данные, но результат стоит проверить.
  • 🧮 Регламентные операции закрытия месяца. Часть шагов выполнена, часть нет. Запустите закрытие месяца повторно — оно пересчитает всё заново.

Правило простое: после прерывания групповой операции запустите её повторно с теми же параметрами. Типовые обработки перепроведения и закрытия месяца рассчитаны на повторный запуск.

Не прерывайте обновление конфигурации и реструктуризацию базы. Это не обычная процедура: обрыв на этапе изменения структуры таблиц может оставить базу в неработоспособном состоянии. Если обновление идёт часами, сначала проверьте нагрузку на сервер СУБД и диск, а не убивайте процесс.

Способ 1. Прервать операцию из своего сеанса

Это первое, что стоит попробовать. Способ безопасен и не требует прав администратора.

Клавиши Ctrl+Break

  1. Убедитесь, что окно 1С активно (щёлкните по заголовку).
  2. Нажмите Ctrl+Break. На ноутбуках без клавиши Break часто работает Ctrl+Fn+B или Ctrl+Fn+Pause — зависит от производителя.
  3. Подтвердите прерывание в появившемся вопросе.
  4. Дождитесь сообщения о том, что выполнение прервано. Откат большой транзакции может занять заметное время — не жмите повторно.

Во время длинных операций платформа сама пишет в строке состояния подсказку «Для прерывания нажмите Ctrl+Break». Если подсказка есть — способ сработает.

Кнопка отмены в форме длительной операции

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) тяжёлые операции запускаются фоновым заданием. На экране появляется форма ожидания с индикатором и кнопкой «Отмена». Нажатие отменяет фоновое задание на сервере.

Что видите на экранеЧем прерватьЧто произойдёт
Курсор-часы, окно «не отвечает», подсказка в строке состоянияCtrl+BreakСерверный вызов прерывается, транзакция откатывается
Форма ожидания с индикаторомКнопка «Отмена»Отменяется фоновое задание
Окно закрыли, а операция «висит» у всехКонсоль кластера (способ 3)Прерывается вызов или завершается сеанс

Если Ctrl+Break не реагирует 5-10 минут, значит, процедура не возвращает управление клиенту: ждёт блокировку или долгий запрос к СУБД. Переходите к анализу блокировок, а не к диспетчеру задач.

Способ 2. Отменить фоновые и регламентные задания

Многие «зависшие процедуры» на самом деле работают без пользователя: обмен по расписанию, загрузка курсов, обновление полнотекстового индекса, отложенное обновление после установки релиза.

Где увидеть фоновые задания

В конфигурациях на БСП откройте Администрирование → Обслуживание и перейдите по ссылке «Регламентные и фоновые задания». На вкладке фоновых заданий видно состояние каждого: «Активно», «Завершено», «Завершено аварийно», «Отменено».

  1. Найдите задание в состоянии «Активно».
  2. Посмотрите время начала: если операция обычно идёт 2 минуты, а работает 40, это ваш кандидат.
  3. Выделите задание и отмените его командой из командной панели формы.
  4. Обновите список и убедитесь, что состояние сменилось на «Отменено».

Отмена фонового задания работает так же, как Ctrl+Break: текущая транзакция откатывается.

Временно запретить регламентные задания

Если задание запускается снова и снова (например, обмен каждые 5 минут), одной отмены мало. Варианты:

  • ⏸️ В конфигурации: откройте карточку регламентного задания в той же форме и снимите флажок «Включено». Не забудьте вернуть его после разбора проблемы.
  • 🖥️ В консоли кластера: в свойствах информационной базы установите флажок «Блокировка регламентных заданий включена». Платформа перестанет запускать любые регламентные задания этой базы.

Блокировку регламентных заданий в консоли удобно включать перед ручным обслуживанием базы. Многие забывают её снять — и неделю удивляются, почему не приходят курсы валют и не работает обмен.

Способ 3. Остановить процедуру через консоль администрирования кластера

Способ для клиент-серверного варианта. Нужны права администратора кластера и установленная оснастка «Администрирование серверов 1С:Предприятия». Консоль подключается к агенту сервера (по умолчанию порт 1540).

Найти сеанс, который выполняет процедуру

  1. Откройте консоль, разверните Кластеры → <кластер> → Информационные базы → <база> → Сеансы.
  2. Добавьте или найдите колонки с временем текущего вызова и временем вызова СУБД — по ним видно, какой сеанс работает долго.
  3. Сеанс фонового задания отображается с приложением «Фоновое задание», пользовательский — с именем пользователя и компьютера.

Прервать вызов или завершить сеанс

В актуальных версиях платформы 8.3 в контекстном меню сеанса есть команда «Прервать текущий серверный вызов». Это самый мягкий вариант: сеанс остаётся жив, пользователь видит сообщение об ошибке, транзакция откатывается.

Если команды нет или она не помогла, выделите сеанс и выберите «Удалить». Сеанс завершается принудительно, несохранённые данные пользователя в открытых формах теряются.

Из командной строки то же самое делает утилита rac. Список сеансов выводит rac session list --cluster=<id> --infobase=<id>. Точный синтаксис прерывания вызова и завершения сеанса для вашей версии смотрите в rac help session.

Перед удалением сеанса предупредите пользователя: он потеряет несохранённую работу. Удаление сеанса — точечное действие, остальных пользователей оно не затрагивает.

Способ 4. Найти, кто держит блокировку

Очень часто «зависание» — это ожидание. Процедура стоит, потому что нужные ей данные заблокировал другой сеанс. Прерывать надо не ту операцию, что висит, а ту, что мешает.

Признаки ожидания блокировки

  • ⏳ У нескольких пользователей одновременно «висит» проведение документов одного вида.
  • 🧾 Через некоторое время появляется ошибка Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки.
  • 🔒 В режиме автоматических блокировок или на СУБД — ошибки взаимоблокировки (deadlock).

Время ожидания управляемой блокировки задаётся в свойствах информационной базы на сервере, по умолчанию 20 секунд. Если процедура «висит» намного дольше, причина обычно не в управляемой блокировке, а в долгом запросе или блокировке на уровне СУБД.

Где смотреть

  1. Консоль кластера. В ветке информационной базы есть узел «Блокировки»: видно, какой сеанс и на какие объекты держит блокировки. Сопоставьте с узлом «Сеансы».
  2. Технологический журнал. Его включают файлом logcfg.xml в каталоге conf платформы (например, C:\Program Files\1cv8\conf\). Для разбора блокировок собирают события TLOCK, TTIMEOUT, TDEADLOCK.
  3. Средства СУБД. На 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. Прервать выполнение через отладчик и код

Этот вариант нужен программисту, который пишет или дорабатывает обработку.

Отладчик

  1. Запустите Конфигуратор и подключитесь к нужному сеансу через Отладка → Подключение. Для серверной отладки на сервере должна быть включена отладка (параметр -debug у службы агента или настройка в актуальных версиях).
  2. Когда процедура зависла, выполните команду прерывания из меню Отладка. Выполнение остановится на текущей строке.
  3. Посмотрите стек вызовов: сразу видно, в каком цикле или запросе застряла процедура.
  4. Завершите отладку, чтобы снять процедуру.

Обработка прерывания в цикле

Если пишете длинный клиентский цикл, дайте пользователю возможность его остановить. Для этого в теле цикла вызывают ОбработкаПрерыванияПользователя():

&НаКлиенте
Процедура ОбработатьСтроки(Команда)
	Для Каждого Строка Из Объект.Товары Цикл
		ОбработкаПрерыванияПользователя();
		// обработка строки
		Строка.Сумма = Строка.Количество * Строка.Цена;
	КонецЦикла;
КонецПроцедуры

Метод проверяет, нажал ли пользователь 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.

Особенности файловой базы

В файловом варианте нет консоли и сервера: процедура выполняется прямо в процессе клиента. Поэтому снятие процесса в диспетчере задач действительно её останавливает.

  • 💾 После аварийного закрытия запустите базу снова и проверьте последние документы.
  • 🧰 Если база не открывается, сделайте копию каталога базы и запустите тестирование и исправление в Конфигураторе. Для него нужен монопольный доступ — все пользователи должны выйти.

Частые вопросы

Почему после Ctrl+Break 1С ещё долго не отвечает?
Платформа откатывает транзакцию. Чем больше записей успела изменить процедура, тем дольше откат — иногда он сравним со временем самой работы. Прерывать откат нельзя.
Сохранятся ли документы, проведённые до прерывания?
В групповых обработках — да: каждый документ пишется в своей транзакции. Не сохранится только тот документ, который проводился в момент прерывания.
Можно ли прервать процедуру другого пользователя без консоли кластера?
Штатно — нет. В конфигурациях на БСП можно завершить чужой сеанс из списка активных пользователей, но для этого нужны права администратора и клиент-серверный вариант.
Что будет, если прервать закрытие месяца?
Часть регламентных операций останется выполненной. Запустите закрытие месяца заново: обработка перевыполнит все шаги и сформирует итог корректно.
Безопасно ли завершать процесс rphost?
Для данных — обычно да, незавершённые транзакции откатит СУБД. Для пользователей — нет: оборвутся все сеансы на этом процессе. Используйте это только когда точечное удаление сеанса не сработало.