Почему в 1С 8.3 остаются сеансы без соединений и как решить проблему их зависания?

Системный администратор 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Перевод информационных баз 1С:Предприятие на новые версии платформы (например, при переходе с 8.1 или 8.2 на 8.3) часто сопровождается неожиданным поведением системы. Одной из самых распространенных и неприятных проблем является появление так называемых «сеансов без соединений». В консоли администрирования серверов 1С мы можем наблюдать картину, когда за одним пользователем числится несколько сеансов, при этом у части из них отсутствует активное соединение, но они продолжают удерживать лицензии. Это приводит к преждевременному исчерпанию пула клиентских лицензий и блокирует работу других пользователей.

В этой статье мы подробно разберем, почему возникают подобные «сеансы-призраки», проанализируем внутренние механизмы платформы 1С 8.3 и рассмотрим пошаговые инструкции по устранению этой проблемы.

1. Как работает механизм «спящих сеансов» в 1С 8.3

Начиная с версии платформы 8.3.5, разработчики внедрили специальный механизм повышения отказоустойчивости. Если клиентское приложение аварийно закрывается, зависает или теряет связь с сервером из-за нестабильного сетевого соединения, сервер 1С:Предприятия не уничтожает сеанс мгновенно. Он переводит его в статус «Спящий» (в консоли кластера в колонке «Спящий» устанавливается значение «Да»).

Этот механизм задуман для блага: если у пользователя на несколько секунд пропал Wi-Fi или перезагрузился роутер, при восстановлении связи он сможет продолжить работу в той же сессии без потери несохраненных данных. Однако на практике, если клиентское приложение закрылось «намертво» (например, процесс завершился аварийно), сеанс зависает на сервере без привязанного соединения. При этом он продолжает занимать рабочую лицензию. Когда пользователь заходит в систему заново, создается еще один, уже активный сеанс, расходующий очередную лицензию.

Если в параметрах информационной базы значения времени засыпания и завершения установлены в 0 (по умолчанию), платформа использует внутренние алгоритмы, из-за которых такие зависшие сеансы могут оставаться в памяти до 24 часов (86400 секунд).

2. Настройка параметров автоматического завершения спящих сеансов

Первым шагом для борьбы с сеансами без соединений является жесткое ограничение времени жизни неактивных сессий в настройках самой базы. Давайте разберем, как это сделать:

  1. Откроем нужную информационную базу в режиме Конфигуратора с административными правами.
  2. В главном меню перейдем по пути: Администрирование -> Параметры информационной базы...
  3. В открывшемся окне нас интересуют два ключевых параметра:
    • Время засыпания пассивного сеанса: указывает время бездействия пользователя (в секундах), по истечении которого сеанс считается пассивным и может быть переведен в спящий режим. Рекомендуется установить значение 1200 (20 минут) или 1800 (30 минут). Не стоит ставить значение менее 10 минут (600 секунд), чтобы избежать ложных срабатываний из-за кратковременных пауз в работе.
    • Время завершения спящего сеанса: указывает интервал времени (в секундах), после которого неактивный спящий сеанс будет окончательно удален сервером, а занятая им лицензия вернется в общий пул. Рекомендуется установить значение от 600 (10 минут) до 3600 (1 час) в зависимости от интенсивности работы пользователей.
  4. Нажмем кнопку Применить для сохранения настроек.

Важное предупреждение для крупных систем: Обратите внимание, что в современных версиях платформы (начиная с 8.3.15) изменение этих параметров на базах с числом пользователей более 10 может потребовать наличия КОРП-лицензий. Если после изменения параметров пользователи столкнулись с ошибкой лицензирования, эти значения придется вернуть в положение 0, а проблему решать другими административными методами, описанными ниже.

3. Решение проблемы зависания в терминальном режиме (RDP) и процесса splwow64.exe

Если ваши пользователи работают в терминальном режиме на сервере под управлением 64-битной ОС Windows (x64), а сама платформа 1С установлена в 32-битном варианте (что часто встречается на обычных формах и толстом клиенте), возникает классический конфликт подсистемы печати.

При отправке любого документа на печать из 1С операционная система запускает специальный транслятор splwow64.exe (Spooler Windows on Windows 64-bit), который связывает 32-битное приложение 1С с 64-битными драйверами принтеров. Проблема заключается в том, что после закрытия 1С процесс splwow64.exe остается активным в операционной системе еще некоторое время. Из-за этого терминальная сессия пользователя RDP не может корректно завершиться (она переходит в статус «Дисконнект» или «Зависла»), а сеанс 1С остается висеть на сервере приложений, удерживая лицензию.

Для принудительного завершения процесса печати при закрытии основного приложения необходимо внести изменения в системный реестр терминального сервера:

  1. Нажмите комбинацию клавиш Win + R, введите regedit и нажмите Enter.
  2. Перейдите по следующему пути реестра:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\SysProcs
  3. В этом разделе создайте новый параметр типа DWORD (32 бита).
  4. Присвойте параметру имя splwow64.exe и установите для него значение 0.

Для автоматизации этой операции на нескольких серверах можно запустить командную строку от имени Администратора и выполнить следующую команду:


reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\SysProcs" /v splwow64.exe /t REG_DWORD /d 0 /f

Данная настройка указывает операционной системе Windows принудительно гасить процесс печати splwow64.exe сразу же после того, как пользователь закрывает клиентское приложение 1С. Это позволит терминальной сессии корректно закрываться, предотвращая появление зависших сеансов.

4. Устранение аварийных вылетов 1С при сохранении отчетов в формат XLS

Еще одной неочевидной причиной массового появления «сеансов без соединений» является аварийное падение (краш) платформы 1С при работе с табличными документами. Очень часто пользователи по привычке сохраняют сформированные отчеты в старый формат Excel 97-2003 (*.xls) вместо современного Excel 2007-... (*.xlsx).

Рассмотрим причины, по которым это приводит к критическому сбою:

Решение проблемы:

  1. Переход на формат XLSX: Настоятельно рекомендуем провести разъяснительную работу с пользователями и обязать их сохранять любые документы исключительно в формате XLSX. Этот формат базируется на современной разметке OpenXML, обрабатывается оптимизированными алгоритмами платформы, практически не имеет ограничений по строкам (до 1 048 576 строк) и требует в разы меньше оперативной памяти при конвертации.
  2. Использование промежуточных форматов: Если отчет критически огромен и его необходимо передать внешним обработчикам, используйте сохранение в формат HTML или MXL (внутренний формат 1С) с последующим открытием файла непосредственно в Microsoft Excel и пересохранением в нужный формат.
  3. Административный запрет: В коде конфигурации (например, в общих модулях печати или в процедурах вывода отчетов) можно переопределить стандартный диалог сохранения файлов, исключив формат XLS из доступных для выбора типов файлов или установив XLSX в качестве значения по умолчанию.

5. Как безопасно удалить зависшие сеансы без перезагрузки сервера приложений

Что делать, если сеанс уже завис «намертво», обычное удаление через консоль администрирования серверов 1С не помогает (сеанс снова возвращается в список через несколько секунд), а перезагружать всю службу ragent нельзя, так как в базе работают десятки активных пользователей?

Существует эффективный метод точечного уничтожения зависшего рабочего процесса без вреда для остальных пользователей. Разберем эту процедуру по шагам:

  1. Откроем утилиту Администрирование серверов 1С Предприятия.
  2. Перейдем в ветку нашего кластера, откроем список Сеансы и найдем зависший сеанс без соединения. Нам нужно определить, на каком конкретно рабочем процессе он запущен.
  3. Дважды кликнем по зависшему сеансу и в свойствах найдем поле Рабочий процесс. Запишем его сетевой порт и системный идентификатор процесса (PID), например, PID: 4512.
  4. Перейдем в ветку Рабочие процессы нашего кластера. Нам нужно временно изолировать проблемный процесс.
  5. Откроем свойства рабочего процесса с нужным портом/PID и снимем флаг Использовать (переведем параметр в значение «Выключено»).
  6. Если в системе включен автоматический запуск новых рабочих процессов, сервер 1С мгновенно создаст новый, активный процесс rphost.exe. Если автоматический запуск выключен, создайте новый рабочий процесс вручную на том же сервере приложений.
  7. Все «живые» пользователи в этот момент бесшовно и незаметно для них перетекут на новый запущенный рабочий процесс. На старом (выключенном) процессе останутся висеть только наши «мертвые» зависшие сеансы.
  8. Теперь мы можем безопасно завершить работу зависшего системного процесса. Для этого откроем Диспетчер задач на сервере приложений (или запустим командную строку от Администратора) и принудительно «убьем» процесс с зафиксированным ранее PID:

    taskkill /F /PID 4512
  9. После успешного завершения процесса вернемся в консоль администрирования 1С и удалим старый выключенный рабочий процесс из списка (или снова включим его флаг «Использовать», чтобы система могла задействовать его ресурсы при необходимости).

Используя данный комплексный подход — от настройки таймаутов в конфигураторе и оптимизации реестра терминального сервера до контроля форматов сохранения отчетов — мы гарантированно избавимся от проблемы зависания сеансов без соединений, сэкономим лицензии 1С и повысим общую стабильность работы системы.

← На главную