Отчёт в 1С завис — как остановить его формирование
Содержание
Самый быстрый способ — нажать Esc: платформа прервёт выполнение, как только дойдёт до ближайшей точки проверки прерывания. Если отчёт строится фоновым заданием, под индикатором есть кнопка отмены — жмите её. А вот тяжёлый запрос, уже ушедший в СУБД, с клиента не остановить: он досчитается до конца либо до тех пор, пока сеанс не завершат на сервере.
Поэтому дальше два разных сценария. Пока интерфейс откликается — хватает Esc и отмены. Если 1С висит намертво, «не отвечает» в заголовке окна, а индикатор не двигается, — снимать придётся либо процесс клиента, либо сеанс в консоли администрирования. И отдельно — как найти, какой именно запрос всё подвесил, чтобы это не повторялось.
Штатная остановка: Esc, кнопка отмены и фоновое задание
Начните с мягких средств — они не рвут сеанс и не грозят потерей данных.
- ⌨️ Клавиша
Esc. Нажмите один раз и подождите. Платформа периодически проверяет, не запросил ли пользователь прерывание, и останавливается на ближайшей такой точке. Если отчёт в этот момент считает данные в памяти или обходит выборку — прервётся за секунды. - 🛑 Кнопка отмены у индикатора. Многие отчёты формируются фоновым заданием: внизу формы крутится индикатор прогресса, рядом — кнопка отмены (чаще всего подписана
ОтменаилиПрервать). Это штатный механизм, именно для него он и сделан. - ⏳ Подождать на длинном запросе. Если
Escне срабатывает мгновенно — скорее всего, управление сейчас внутри запроса к базе данных. Прерывание сработает, только когда запрос вернёт результат или платформа получит ответ от СУБД.
Разница принципиальная. Esc останавливает код на стороне 1С. Но пока СУБД выполняет сам запрос (соединяет таблицы, считает итоги), платформа ждёт и прервать это с клиента не может. Поэтому «не реагирует на Esc» почти всегда значит «ушёл тяжёлый запрос в базу».
Если отчёт строится синхронно (без фонового задания), на время расчёта окно блокируется целиком — это нормально. Дайте платформе 10–20 секунд после Esc, прежде чем считать, что всё зависло.
Если интерфейс завис полностью
Окно побелело, в заголовке «(Не отвечает)», мышь по форме не кликается. Здесь важно понимать, какой у вас вариант работы, — от этого зависит, что снимать и чем это грозит.
Esc. Если снимаете — сделайте это после того, как остальные вышли.Как снять процесс клиента вручную:
- Откройте
Диспетчер задач(сочетаниеCtrl+Shift+Esc). - На вкладке
Подробностинайдите процесс клиента 1С —1cv8.exe(толстый клиент) или1cv8c.exe(тонкий клиент). - Если у вас открыто несколько баз, ориентируйтесь по столбцу с объёмом памяти: зависший сеанс обычно самый «тяжёлый».
- Нажмите
Снять задачу.
Снятие процесса клиента закрывает ваш сеанс. Несохранённые изменения в открытых формах потеряются. В файловой базе аварийное закрытие изредка оставляет базу в состоянии, требующем Тестирования и исправления (chdbfl для файловой базы). Перед снятием процесса убедитесь, что вы не в середине записи или проведения документа.
Отдельный случай — веб-клиент: процесс 1С на вашей машине не запущен, работа идёт в браузере. Снимать там нечего — достаточно закрыть вкладку. Но сам сеанс на сервере от этого не закроется сразу, и запрос продолжит выполняться. Поэтому для веб-клиента путь один: завершить сеанс в консоли администрирования сервера.
В клиент-серверном варианте есть важный нюанс: вы сняли клиента, а рабочий процесс на сервере продолжает крутить тот же запрос, нагружая СУБД. Чтобы остановить и его, переходите к завершению сеанса на сервере.
Завершение сеанса в консоли администрирования сервера
Это основной инструмент администратора клиент-серверной базы. Он убивает ровно один сеанс, не трогая остальных пользователей.
Через консоль (графический режим):
- Запустите
Администрирование серверов 1С Предприятия. - Раскройте ветку: ваш центральный сервер →
Кластеры→ кластер →Сеансы. - Отсортируйте список по пользователю или по времени последней активности. Зависший отчёт виден по большому значению в столбцах активности и по «висящему» текущему действию — колонка с текущим действием сеанса подскажет, что он сейчас делает (вызов сервера, обращение к СУБД), а время старта этого действия покажет, насколько давно он завис.
- Выделите нужную строку и выберите удаление сеанса (команда
Удалитьв контекстном меню или на панели).
Через утилиту rac (командная строка):
Утилита rac ставится вместе с сервером. Общая логика — сначала узнать идентификаторы, потом завершить сеанс:
rac cluster list
rac session list --cluster=<идентификатор кластера>
rac session terminate --cluster=<идентификатор кластера> --session=<идентификатор сеанса>
Точный синтаксис параметров вашей версии платформы смотрите в rac help и rac session help — набор ключей между релизами немного меняется.
Завершайте именно сеанс (session), а не рабочий процесс и тем более не службу. Снятие рабочего процесса rphost оборвёт все сеансы, которые на нём висят, а остановка службы 1C:Enterprise Server выкинет из базы вообще всех. К этим мерам прибегают, только когда зависло всё и завершить отдельный сеанс не удаётся, — и предупредив пользователей.
Завершение сеанса на сервере посылает в СУБД сигнал на отмену текущего запроса. Обычно этого достаточно: и 1С, и база освобождаются за несколько секунд.
Поиск тяжёлого запроса в СУБД
Если отчёт регулярно подвешивает всех, полезно увидеть на уровне базы данных, что именно он делает и кого блокирует. Инструмент зависит от СУБД.
PostgreSQL. Активные запросы и их длительность:
SELECT pid, now() - query_start AS длительность, state, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY длительность DESC;
Отменить один конкретный запрос по его pid (соединение при этом сохраняется):
SELECT pg_cancel_backend(<pid>);
Блокировки, которые мешают запросу, смотрят в представлении pg_locks в связке с pg_stat_activity.
Microsoft SQL Server. Активные запросы — через sys.dm_exec_requests и sys.dm_exec_sql_text; кто кого блокирует — быстрее всего видно в sp_who2 по столбцу BlkBy (кем заблокирован). Остановить сессию SQL можно командой KILL <spid>.
Гасить запрос средствами СУБД — крайняя мера. После KILL на стороне SQL сеанс 1С может остаться в подвешенном состоянии, и его всё равно придётся закрывать в консоли. Правильный порядок: сначала пытаемся завершить сеанс в консоли 1С, и только если база продолжает молотить запрос — гасим его на уровне СУБД.
Чтобы разобраться без постоянного «ручного» наблюдения, включите технологический журнал (ТЖ) платформы с фильтром по длительным событиям DBMSSQL или DBPOSTGRS. Журнал покажет текст запроса, его длительность и имя сеанса — по этим данным легко вычислить проблемный отчёт.
Отладка зацикливания и бесконечного кода
Бывает, что виноват не запрос, а код: обработка отчёта попала в бесконечный цикл и крутит пустое место. Снаружи это выглядит как зависание, но СУБД при этом простаивает, а процессор клиента или сервера загружен на 100 %.
Чтобы найти такое место, используют отладчик в Конфигураторе:
- В Конфигураторе включите отладку по нужному протоколу (
Сервис → Параметры → Запуск 1С:Предприятия → Дополнительные → Отладка). - Запустите
Отладка → Подключениеи выберите подвисший сеанс (клиентский или серверный) из списка предметов отладки. - Нажмите паузу — отладчик остановится на той строке, где код выполняется прямо сейчас. Если это одна и та же строка в цикле — вы нашли зацикливание.
- По стеку вызовов видно, из какой процедуры и с какими данными пришли в этот цикл.
Типичная причина зацикливания — обратный обход коллекции с изменением её внутри цикла или условие выхода, которое никогда не выполняется. Для обхода выборки с удалением элементов идут с конца:
Для Сч = 1 По Строки.Количество() Цикл
Элемент = Строки[Строки.Количество() - Сч];
// обработка элемента
КонецЦикла;
Если отчёт сделан на СКД, в отладчик заходить обычно не нужно: причина почти всегда в структуре запроса или в соединениях набора данных, а не в коде. Смотрите план запроса в СУБД.
Отдельный полезный инструмент — Замер производительности в Конфигураторе (Отладка → Замер производительности). Он показывает, сколько миллисекунд съела каждая строка кода, и сразу выделяет узкое место.
Как не доводить отчёт до зависания
Лучше, чтобы отчёт вообще не приходилось прерывать. Разработчику и пользователю помогают несколько приёмов.
- 📅 Сужайте период и отборы. Отчёт за год по всей номенклатуре считается в десятки раз дольше, чем за месяц по одному складу. Приучите пользователей задавать период и отбор до формирования.
- ⚙️ Выносите расчёт в фоновое задание. Долгие отчёты правильно строить фоновым заданием с индикатором и штатной кнопкой отмены — тогда интерфейс не блокируется и прерывание всегда под рукой.
- 🗂 Проверьте индексы и соединения в запросе. Запрос без нужных индексов и с соединением больших таблиц «многие ко многим» — главная причина тяжёлых отчётов. Оптимизация запроса даёт выигрыш в разы.
- ⏱ Ограничение времени сеанса. В свойствах рабочего сервера и в профилях безопасности кластера можно задать лимиты: максимальное время вызова и объём памяти на сеанс. По превышении платформа аварийно завершит зарвавшийся запрос сама.
- 🧮 Актуальная статистика и регламентные операции СУБД. Устаревшая статистика в SQL Server или «распухшие» таблицы в PostgreSQL заставляют оптимизатор выбирать плохой план. Регулярное обслуживание базы ускоряет все отчёты разом.
Частые вопросы
Esc не помогает, отчёт всё равно считается. Почему?
Esc сработает только когда запрос вернёт результат. Если ждать некогда — завершайте сеанс на сервере или гасите запрос средствами базы.Снял процесс клиента, но сервер по-прежнему загружен. Что делать?
Можно ли прервать отчёт у другого пользователя, не подходя к его компьютеру?
Сеансы и удалите именно этот сеанс. Остальные пользователи не пострадают.Чем опасно снятие рабочего процесса или остановка службы?
rphost оборвёт все сеансы на этом процессе, остановка службы сервера — вообще все. Это крайние меры: применяйте их, только когда отдельный сеанс завершить не удаётся, и предупредив людей.Отчёт зависает каждый раз. Как найти причину?
DBMSSQL/DBPOSTGRS или посмотрите активные запросы в СУБД. Если СУБД простаивает, а процессор загружен — причина в коде, ищите зацикливание отладчиком.