Зависло фоновое задание в клиент-серверной базе: как его остановить и не дать запуститься снова
Содержание
Снять фоновое задание на сервере 1С проще всего в консоли кластера: откройте базу, раздел Сеансы, найдите строку, где в колонке «Приложение» стоит «Фоновое задание», и удалите этот сеанс. Если задание регламентное и запускается по расписанию, сначала включите в свойствах базы блокировку регламентных заданий, иначе через минуту оно стартует заново.
Частое заблуждение — что зависшее задание лечится перезапуском службы сервера 1С. Это работает, но обрывает работу всех пользователей всех баз кластера. Почти всегда хватает точечной остановки одного сеанса или вызова Отменить() из кода. Перезапуск службы и снятие процесса rphost — крайние меры.
Что проверить перед остановкой задания
Фоновое задание в клиент-серверной базе выполняется на сервере 1С, в одном из рабочих процессов rphost. Для кластера это обычный сеанс, только без пользователя за экраном. Поэтому и останавливают его через сеансы, а не через «диспетчер задач» в самой программе.
Перед тем как что-то снимать, ответьте себе на три вопроса:
- 🔍 Что это за задание. Обмен, загрузка курсов, обновление полнотекстового индекса, проведение по расписанию или задание, запущенное пользователем (например, закрытие месяца в фоне).
- ⏳ Оно действительно зависло или просто долгое. Пересчёт итогов или первичная загрузка обмена могут идти часами и при этом работать.
- 🔒 Держит ли оно блокировки. Если пользователи жалуются на
Конфликт блокировок при выполнении транзакцииили на долгое проведение, задание почти наверняка держит транзакцию.
Прерванная транзакция откатывается целиком. Если задание три часа загружало данные одной транзакцией, после остановки база вернётся к исходному состоянию, а откат тоже займёт время. Учитывайте это, когда решаете, ждать или снимать.
В файловом варианте базы фоновые задания работают в процессе клиентского приложения. Там нет консоли кластера, и всё, что ниже про rphost, rac и сеансы кластера, к файловой базе не относится.
Как найти зависшее задание в консоли кластера
Консоль «Администрирование серверов 1С Предприятия» ставится вместе с сервером. Если оснастка не открывается или пишет об ошибке класса, перерегистрируйте radmin.dll той же версии, что и сервер, командой от администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1586\bin\radmin.dll"
Номер версии в пути подставьте свой — он должен совпадать с версией агента сервера.
Дальше порядок такой:
- Раскройте
Центральные серверы → имя сервера → Кластеры → Локальный кластер → Информационные базы → ваша база → Сеансы. - Отсортируйте список по колонке «Приложение» и найдите строки «Фоновое задание».
- Посмотрите колонки «Начало работы» и «Время вызова». Сеанс, который начался вчера и всё ещё активен, — первый кандидат.
- Обратите внимание на «Соединение с СУБД» и «Захвачено СУБД». Если задание прямо сейчас выполняет запрос, тут будет номер процесса СУБД и время, сколько он занят.
- Посмотрите «Рабочий процесс» — пригодится, если дело дойдёт до уровня операционной системы.
💡 Сеанс фонового задания не показывает имя метода. Чтобы понять, какой это обмен или регламент, сверьте время начала сеанса с журналом регистрации или со списком заданий внутри программы (о нём — в следующем разделе).
Блокировка регламентных заданий на время работ
В свойствах информационной базы в консоли есть флажок «Блокировка регламентных заданий включена». Пока он стоит, планировщик не запускает регламентные задания этой базы. Уже работающие задания он не останавливает — их снимают отдельно.
Это главный приём при борьбе с «бессмертным» заданием: сначала поставьте блокировку, потом снимайте сеанс. В обратном порядке задание часто успевает подняться по расписанию.
Остановка задания из программы и из консоли
Через обработку «Регламентные и фоновые задания»
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) есть штатный список заданий. В Бухгалтерии путь такой: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания.
- Откройте вкладку «Фоновые задания».
- Найдите активное задание по наименованию и времени начала.
- Выделите его и выберите команду отмены задания в командной панели списка.
- Обновите список: состояние должно смениться на «Отменено».
Здесь же, на вкладке «Регламентные задания», можно снять флажок использования у конкретного задания. Тогда оно перестанет запускаться, а остальные регламенты будут работать.
Нужны права администратора информационной базы. Обычному пользователю обработка либо не откроется, либо покажет только его собственные задания.
Через удаление сеанса в консоли
Если отмена из программы не сработала или база не открывается из-за блокировок, удалите сеанс в консоли: правая кнопка на строке «Фоновое задание» → Удалить. Платформа завершит сеанс, задание перейдёт в состояние «Завершено аварийно», открытая транзакция откатится.
Проверьте, что удаляете именно сеанс фонового задания. Строки в списке похожи, и по ошибке легко снять сеанс бухгалтера с несохранённым документом.
Через rac из командной строки
Если консоли нет под рукой, используйте утилиту rac. Перед ней должен работать сервер администрирования ras.
rac cluster list
rac infobase summary list --cluster=<uuid-кластера>
rac session list --cluster=<uuid-кластера> --infobase=<uuid-базы>
rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса>
В выводе session list ищите сеансы с app-id : BackgroundJob. Поля started-at, db-proc-info и db-proc-took дают те же сведения, что и колонки консоли. Если на кластере задан администратор, добавьте --cluster-user и --cluster-pwd. Остальные параметры смотрите в справке rac help session.
Управление фоновыми заданиями из кода 1С
Когда обработки заданий нет (нетиповая конфигурация) или нужно снять сразу несколько заданий по признаку, пригодится код. Его выполняют на сервере с правами администратора — например, из внешней обработки в режиме «Предприятие».
Пример: отменить все активные фоновые задания с заданным методом.
&НаСервереБезКонтекста
Процедура ОтменитьЗаданияПоМетоду(ИмяМетода)
Отбор = Новый Структура;
Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
Отбор.Вставить("ИмяМетода", ИмяМетода);
Задания = ФоновыеЗадания.ПолучитьФоновые(Отбор);
Для Каждого Задание Из Задания Цикл
Задание.Отменить();
Сообщить(СтрШаблон("Отменено: %1, начато %2", Задание.Наименование, Задание.Начало));
КонецЦикла;
КонецПроцедуры
Отбор в ПолучитьФоновые() принимает и другие ключи: Ключ, Наименование, УникальныйИдентификатор, Начало, Конец, РегламентноеЗадание. Чтобы найти конкретное задание по известному идентификатору, используйте ФоновыеЗадания.НайтиПоУникальномуИдентификатору().
Отмена срабатывает не мгновенно. Платформа прерывает задание, когда оно доходит до точки, где проверяет признак отмены. Если в этот момент выполняется длинный запрос к СУБД, задание остановится после него.
Отключить регламентное задание программно
Чтобы задание не запускалось по расписанию, выключите у него использование:
&НаСервереБезКонтекста
Процедура ОтключитьРегламент(ИмяЗадания)
Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания[ИмяЗадания]);
Если Задание <> Неопределено Тогда
Задание.Использование = Ложь;
Задание.Записать();
КонецЕсли;
КонецПроцедуры
Имя задания — это имя объекта метаданных из ветки «Регламентные задания» в конфигураторе, а не синоним. Для непредопределённых заданий (например, созданных обработкой обмена) используйте РегламентныеЗадания.ПолучитьРегламентныеЗадания() с отбором по метаданным.
💡 Задание с непустым Ключ нельзя запустить второй раз, пока активна первая копия: платформа выдаст ошибку. Этим пользуются, чтобы обмен не стартовал параллельно сам с собой.
Принудительное завершение на стороне СУБД
Бывает, что сеанс удалён в консоли, а запрос в СУБД продолжает работать и держит таблицы. Тогда снимают сам процесс СУБД. Номер процесса берите из колонки «Соединение с СУБД» или поля db-proc-info в выводе rac.
Microsoft SQL Server:
-- кто сейчас выполняется и кого блокирует
SELECT session_id, blocking_session_id, status, command, wait_type,
total_elapsed_time / 1000 AS sec, DB_NAME(database_id) AS db
FROM sys.dm_exec_requests
WHERE database_id = DB_ID('имя_базы');
-- завершить соединение
KILL 87;
PostgreSQL:
SELECT pid, state, now() - query_start AS duration, left(query, 80)
FROM pg_stat_activity
WHERE datname = 'имя_базы' AND state <> 'idle';
-- сначала мягко: отменить запрос
SELECT pg_cancel_backend(12345);
-- если не помогло: оборвать соединение
SELECT pg_terminate_backend(12345);
Никогда не правьте таблицы 1С в СУБД вручную, чтобы «пометить задание выполненным». Состояние фоновых заданий хранит сервер 1С, а не таблица базы. Прямые UPDATE и DELETE только испортят данные и лишат вас поддержки.
Снимать соединение на стороне СУБД — это то же прерывание транзакции. Откат большой транзакции в SQL Server и PostgreSQL может длиться столько же, сколько она шла.
Если ничего не помогло: процесс rphost и служба
Последний уровень — операционная система. Рабочий процесс rphost обслуживает сразу много сеансов, часто нескольких баз. Завершив rphost, вы оборвёте всех пользователей, чьи сеансы в нём работали. Делайте это вне рабочего времени или после предупреждения пользователей.
- В консоли раскройте
Рабочие процессыи узнайте PID процесса, в котором сидит сеанс задания. - Проверьте, какие ещё сеансы в этом процессе. Если там рабочие сеансы пользователей — попросите их сохраниться и выйти.
- Завершите процесс.
Windows:
taskkill /PID 4812 /F
Linux:
ps -eo pid,etime,cmd | grep rphost
kill 4812
# если процесс не реагирует
kill -9 4812
Менеджер кластера сам поднимет новый рабочий процесс. Перезапуск службы агента сервера 1С нужен, только если завис менеджер кластера и консоль не отвечает. Это обрывает все сеансы всех баз кластера.
| Способ | Когда применять | Что затронет |
|---|---|---|
Отмена из обработки или Отменить() | Первым делом | Только задание |
Удаление сеанса в консоли или rac | Отмена не сработала | Только сеанс задания |
KILL или pg_terminate_backend | Висит запрос в СУБД | Одно соединение с СУБД |
Завершение rphost | Сеанс не удаляется | Все сеансы этого процесса |
| Перезапуск службы | Не отвечает кластер | Все базы и все пользователи |
Как найти причину зависания по журналу регистрации
Остановить задание — полдела. Если причину не найти, завтра оно повиснет снова.
Откройте журнал: в конфигурациях на БСП — Администрирование → Обслуживание → Журнал регистрации. Настройте отбор:
- 📌 Приложение — «Фоновое задание».
- 📌 Событие — события группы «Фоновое задание»: запуск, успешное завершение, ошибка выполнения, отмена.
- 📌 Период — от запуска зависшего задания до момента остановки.
- 📌 Сеанс — номер сеанса из консоли, если вы его записали.
На что смотреть:
- ⛔ запуск есть, а завершения нет — задание оборвали или упал рабочий процесс;
- ⛔ ошибки транзакции и блокировок в том же сеансе — задание конкурировало с пользователями;
- ⛔ последнее событие перед «тишиной» — после него задание и застряло, часто это конкретный узел обмена или документ.
Текст ошибки завершившегося задания можно получить и из кода: у объекта задания есть свойство ИнформацияОбОшибке, а метод ПолучитьСообщенияПользователю() вернёт сообщения, которые задание успело вывести.
Если журнал молчит, включите технологический журнал (файл logcfg.xml в каталоге conf платформы) с событиями DBMSSQL, TLOCK, TTIMEOUT, TDEADLOCK и фильтром по базе. Так видно, какой запрос выполнялся и кого он ждал. Не оставляйте технологический журнал включённым надолго: он быстро занимает диск.
Профилактика: расписание, таймауты, настройки кластера
Меры, после которых задания виснут заметно реже:
- Разведите задания по времени. Обмен, пересчёт итогов и обновление полнотекстового индекса в одну минуту конкурируют за одни и те же таблицы.
- Задайте время завершения в расписании. В расписании регламентного задания можно указать время, после которого платформа прерывает выполнение. Для ночных регламентов это страховка от работы до утра.
- Настройте повтор при аварийном завершении. В свойствах регламентного задания есть количество повторов и интервал повтора. Без них упавший обмен ждёт следующего запуска по расписанию.
- Ограничьте память рабочих процессов. В свойствах кластера задаются допустимый объём памяти, интервал его превышения и безопасный расход памяти за один вызов. Задание, которое «съело» всю память, будет остановлено платформой, а не положит сервер.
- Настройте интервал перезапуска рабочих процессов в свойствах кластера, если процессы со временем распухают. Перезапуск плавный: новые сеансы уходят в новый процесс.
- Не держите длинные транзакции в коде заданий. Загрузку тысяч объектов лучше вести порциями по 100-500 штук, каждая в своей транзакции.
💡 Перед обновлением конфигурации или загрузкой .dt ставьте блокировку регламентных заданий заранее, за 10-15 минут. Тогда к началу работ активных заданий не останется и снимать нечего.
Частые вопросы
Чем отличается фоновое задание от регламентного?
Можно ли остановить задание без прав администратора кластера?
rac может только администратор кластера, если он задан.