Отчёт в 1С не формируется и не закрывается: остановка сеанса, поиск блокировок и причины
Содержание
Если отчёт в 1С завис, сначала попробуйте Ctrl+Break или закройте форму отчёта. Не помогло — в файловой базе завершите процесс 1cv8c.exe в Диспетчере задач, а в клиент-серверной удалите сеанс пользователя в консоли кластера серверов. Снятие процесса только на компьютере пользователя в клиент-серверном варианте не останавливает запрос на сервере: он продолжает грузить базу, пока не досчитается.
Отчёт только читает данные и ничего не записывает. Поэтому его принудительное завершение почти никогда не портит учёт. Теряются только несохранённые правки в других окнах того же сеанса. Главное — остановить именно тот процесс, который держит расчёт, и не задеть чужие сеансы.
Завис отчёт или просто долго считается: проверка за пару минут
Многие отчёты на большом периоде формируются 5–15 минут, и это нормально. Прежде чем что-то снимать, посмотрите на признаки.
| Что видно | Что это обычно значит |
|---|---|
| В форме отчёта крутится индикатор, окно перетаскивается и реагирует на клики | Отчёт формируется в фоне, программа работает |
| В заголовке окна Windows — «(Не отвечает)», окно белое | Клиент ждёт ответа от сервера или занят расчётом |
1cv8c.exe или rphost.exe грузят процессор на 10–25% и выше | Идёт расчёт, данные обрабатываются |
| Нагрузка на процессор около 0%, диск и сеть молчат, проходит 10+ минут | Похоже на ожидание блокировки или обрыв связи |
| У других пользователей тоже встали проведение и запись | Почти наверняка блокировка в базе |
Ещё два быстрых вопроса к пользователю:
- 📅 Какой период и какие отборы стоят в отчёте? Год детализации по дням и документам без отбора по организации — частая причина многочасового расчёта.
- 👥 Работает ли кто-то сейчас с закрытием месяца, перепроведением или обменом? Эти операции надолго захватывают регистры, и отчёт ждёт своей очереди.
Если нагрузка есть и отчёт раньше на таком же периоде формировался, скажем, за 8 минут, дайте ему 15–20. Принудительная остановка сэкономит время только тогда, когда расчёт явно встал.
Как остановить формирование отчёта без принудительного завершения
Начните с самых мягких вариантов. Они не обрывают сеанс и не требуют прав администратора.
Закрыть форму отчёта
В типовых конфигурациях на базе БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) многие отчёты формируются фоновым заданием. Пока оно работает, форма остаётся живой и показывает индикатор. Если закрыть форму отчёта крестиком, фоновое задание отменяется.
После этого откройте отчёт заново, сократите период и добавьте отборы.
Нажать Ctrl+Break
Комбинация Ctrl+Break прерывает выполнение кода встроенного языка. Платформа спросит, прервать ли выполнение, — ответьте утвердительно. На клавиатурах без клавиши Break ищите сочетание с Fn или используйте экранную клавиатуру Windows.
Срабатывает не всегда. Если клиент ждёт ответа сервера и окно уже в состоянии «Не отвечает», нажатие может не дойти.
Проверить фоновые задания
Если отчёт запускался в фоне, задание видно в списке: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Найдите задание с нужным временем начала и пользователем и отмените его.
Отменяйте только своё задание. Рядом в списке могут быть обмены и закрытие месяца — их остановка в середине создаст другим пользователям больше проблем, чем зависший отчёт.
Принудительное завершение 1С через Диспетчер задач
Когда окно не реагирует, остаётся снять процесс. Для файловой базы этого достаточно: весь расчёт идёт в процессе клиента.
- Попросите пользователя сохранить всё, что открыто в других окнах 1С. Если окно не реагирует, сохранить не получится — предупредите, что несохранённые документы будут потеряны.
- Нажмите
Ctrl+Shift+Esc, откройте вкладку «Подробности». - Найдите процесс:
1cv8c.exe— тонкий клиент,1cv8.exe— толстый клиент или Конфигуратор. - Если процессов несколько, добавьте столбец «Командная строка» (правой кнопкой по заголовку таблицы → «Выбрать столбцы»). В строке запуска видно, к какой базе подключён процесс.
- Выделите нужный процесс и нажмите «Снять задачу».
На терминальном сервере то же самое делается на вкладке «Пользователи»: разверните пользователя и снимите только его процесс 1С, а не весь сеанс Windows.
Из командной строки процесс снимается так:
tasklist /fi "imagename eq 1cv8c.exe"
taskkill /pid 12345 /f
Вместо 12345 подставьте PID из вывода tasklist. Команда taskkill /im 1cv8c.exe /f закроет все тонкие клиенты на компьютере сразу — на терминальном сервере так делать нельзя, вылетят все пользователи.
В клиент-серверной базе снятие 1cv8c.exe не останавливает запрос на сервере. Сеанс в кластере какое-то время остаётся, занимает лицензию и продолжает держать нагрузку. Его нужно удалить отдельно — см. следующий раздел.
Как завершить зависший сеанс в консоли кластера серверов
Для клиент-серверной базы это основной способ. Консоль администрирования серверов 1С подключается к агенту сервера (по умолчанию порт 1540) и показывает все сеансы базы.
Найти сеанс
- Запустите «Администрирование серверов 1С Предприятия».
- Разверните:
Центральные серверы 1С:Предприятия → имя сервера → Кластеры → кластер → Информационные базы → нужная база → Сеансы. - Найдите сеанс по столбцам «Пользователь» и «Компьютер».
- Проверьте, что сеанс действительно занят. Смотрите на столбцы «Время вызова (текущее)» и «Время вызова СУБД (текущее)»: если они растут, сеанс прямо сейчас выполняет серверный вызов. Столбцы «Блокировано СУБД» и «Блокировано упр.» показывают, ждёт ли сеанс чужую блокировку.
Если нужных столбцов не видно, включите их через настройку списка в консоли.
Удалить сеанс
Правой кнопкой по сеансу → «Удалить». Пользователь увидит сообщение об ошибке вида Сеанс отсутствует или удален и должен будет перезайти в базу.
Удаление сеанса обрывает работу пользователя. Всё, что он не записал в других окнах, пропадёт. Перед удалением позвоните ему или напишите.
То же самое через 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 сеанса>
В выводе rac session list ищите сеанс по полям user-name и host. Если кластер защищён паролем, добавьте параметры администратора кластера; полный список ключей покажет rac help session.
Крайняя мера — перезапуск рабочего процесса
Если сеанс не удаляется или после удаления запрос продолжает грузить сервер, остаётся завершить рабочий процесс rphost.exe. Делается это в консоли через ветку «Рабочие процессы» или в Диспетчере задач на сервере.
Один процесс rphost обслуживает сразу много сеансов. Его завершение оборвёт работу всех пользователей, чьи сеансы были на нём, а начатые транзакции откатятся. Делайте это только вне рабочего времени или после того, как предупредили всех, кто в базе.
Блокировки и тяжёлые запросы: что держит отчёт
Отчёт может не считаться, а ждать. Он стоит в очереди за документом, который проводится, или за закрытием месяца. Типичная ошибка при этом:
Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки
Сам по себе отчёт обычно читает без блокировок. Но если в отчёте или в обработке, из которой он вызван, есть запись данных или явная блокировка, он попадает в общую очередь.
Где видно, кто кого держит
- 🔒 Консоль кластера, список сеансов: столбец «Блокировано упр.» у ожидающего сеанса указывает на управляемую блокировку, «Блокировано СУБД» — на блокировку на уровне базы данных.
- 🕒 Сеанс с большим «Временем вызова СУБД» и ростом «Захвачено СУБД» — кандидат в виновники: он долго держит транзакцию.
- 🗄️ В MS SQL виновника видно в мониторе активности SQL Server Management Studio или через системное представление сеансов. Для PostgreSQL — представление
pg_stat_activity.
Проверочный запрос для MS SQL:
SELECT session_id, blocking_session_id, wait_type, wait_time, status, command
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
Столбец blocking_session_id показывает сеанс СУБД, который держит блокировку. Номер сеанса СУБД сопоставьте с сеансом 1С через консоль кластера: у сеанса 1С есть соединение, а у соединения — процесс и сеанс в СУБД.
Команду KILL в SQL Server применяйте только когда понятно, чья это транзакция. Если это проведение или закрытие месяца, после отката пользователю придётся запускать операцию снова. Проще и безопаснее удалить сеанс 1С в консоли кластера.
Технологический журнал для повторяющихся зависаний
Если отчёт виснет регулярно, включите технологический журнал. Файл logcfg.xml кладут в каталог conf установленной платформы на сервере. Минимальная настройка для поиска блокировок:
<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>
События TTIMEOUT показывают, кто не дождался блокировки, TDEADLOCK — взаимоблокировки. Журнал быстро растёт, поэтому после сбора данных удалите logcfg.xml или закомментируйте события.
Почему отчёт в 1С зависает: частые причины и что ускорить
После того как процесс завершён, разберитесь с причиной. Иначе завтра будет то же самое.
Настройки самого отчёта
- 📆 Слишком длинный период. Отчёт за три года с детализацией по дням строит сотни тысяч строк.
- 📄 Группировка по регистратору (документу) без отбора. Каждая строка документа превращается в строку отчёта.
- 🧩 Много вложенных группировок и пустой отбор по организации, складу или контрагенту.
- 🔁 Отчёт формируется автоматически при открытии с последними сохранёнными настройками. Пользователь однажды поставил большой период — и теперь отчёт виснет сразу при запуске.
Последний случай лечится очисткой настроек отчёта у пользователя. В типовых конфигурациях это делается обработкой «Настройки пользователей» в разделе Администрирование → Настройки пользователей и прав: выберите пользователя и удалите его настройки нужного отчёта.
Права пользователя
Если у администратора отчёт формируется за минуту, а у бухгалтера висит полчаса, первым подозревайте ограничение доступа на уровне записей (RLS). Оно добавляет к каждому запросу дополнительные условия. Проверка простая: сформируйте отчёт с теми же настройками под пользователем с полными правами и сравните время.
База и сервер
| Причина | Как проверить | Что сделать |
|---|---|---|
| Устаревшая статистика и фрагментированные индексы в СУБД | Отчёты стали медленнее постепенно, за месяцы | Регламентные задания СУБД: обновление статистики, перестроение индексов |
| Отключены итоги регистров | Медленные все отчёты по остаткам, а не один | Включить итоги обработкой «Управление итогами» в разделе Администрирование → Обслуживание |
| Файловая база в сетевой папке, работают 5+ человек | Тормозит у всех при одновременной работе | Перевод на клиент-серверный вариант |
| Антивирус проверяет файлы базы и временные файлы | Нагрузка у антивируса во время отчёта | Добавить каталог базы и временных файлов 1С в исключения |
| Мало памяти на сервере, рабочие процессы перезапускаются | В журнале регистрации обрывы сеансов | Добавить память, настроить лимиты процессов |
Для файловой базы после зависаний и аварийных закрытий полезно прогнать тестирование и исправление информационной базы. Делается это из Конфигуратора, при монопольном доступе: все пользователи должны выйти из базы. Предварительно сделайте резервную копию.
Как не допустить повторного зависания: лимиты и таймауты
Полностью исключить тяжёлые отчёты нельзя, но можно ограничить ущерб от них.
Лимиты в кластере серверов
В свойствах рабочего сервера в консоли кластера есть параметр «Безопасный расход памяти за один вызов». Если отчёт пытается взять больше памяти за один серверный вызов, платформа прерывает его с ошибкой. Остальные пользователи на том же рабочем процессе не страдают.
Там же задаётся критический объём памяти рабочих процессов. Когда он превышен, сервер начинает принудительно обрывать самые тяжёлые вызовы. Значения подбирают под объём оперативной памяти сервера: например, на сервере с 32 ГБ оставляют запас под СУБД и систему.
Ожидание блокировок
Сеанс ждёт управляемую блокировку ограниченное время — порядка 20 секунд. Затем он получает ошибку о превышении времени ожидания вместо бесконечного зависания. Если пользователи видят эту ошибку постоянно, увеличивать время ожидания бесполезно: ищите, какая операция держит данные, через технологический журнал.
Организационные меры
Если ничего не помогло
Отчёт виснет даже на одном дне, без блокировок и при свободном сервере? Тогда проблема в самом отчёте или в данных:
- 🛠️ Нетиповой отчёт или доработанный запрос — передайте разработчику вместе с данными технологического журнала.
- 📦 Запустите тот же отчёт в свежей копии базы, развёрнутой из выгрузки
.dt. Если в копии быстро — дело в сервере или СУБД, если так же медленно — в данных или запросе. - 🔄 Проверьте, что платформа на сервере и у клиентов одного номера версии. Разные сборки на клиенте и сервере дают ошибки подключения, а не ускорение.