К статье
Практический материал

Администрирование · 10 мин

Сколько живет COM-соединение 1С и как управлять его временем жизни

Разбираем, сколько живет COM-соединение 1С: время жизни объекта, причины разрывов, пул соединений, диагностика зависших сеансов и корректное закрытие.

COM-соединение 1С (объект V83.COMConnector или V82.COMConnector) не имеет фиксированного «срока жизни» в секундах или минутах. Соединение существует, пока жив клиентский объект-коннектор, пока сервер 1С не разорвал сеанс по тайм-ауту или пока соединение не закрыто явно. На практике это означает: время жизни определяется тремя факторами — настройками кластера серверов 1С, поведением клиентского кода и стабильностью сети.

Чаще всего вопрос «сколько живет COM-соединение» возникает в двух ситуациях: либо внешняя программа (скрипт, служба, другая база 1С) периодически теряет связь с базой и выдаёт ошибки, либо на сервере копятся «зависшие» сеансы от COM-подключений, которые занимают лицензии и память. Оба случая связаны с одним механизмом — управлением временем жизни сеанса, который создаётся при COM-подключении.

Ниже разобрано, что именно происходит с соединением после установки, какие тайм-ауты на него влияют, как диагностировать преждевременный разрыв и как правильно закрывать подключение, чтобы не плодить «мертвые» сеансы.

Что происходит при установке COM-соединения

Когда внешнее приложение вызывает метод Connect объекта COMConnector, на сервере 1С (или в файловой базе — в процессе клиента) создаётся полноценный сеанс. Этот сеанс занимает программную лицензию, выделяет память в рабочем процессе rphost и регистрируется в консоли кластера так же, как сеанс обычного пользователя тонкого клиента.

Сам COM-объект на стороне клиента — это лишь «ручка» (proxy) к этому сеансу. Пока переменная, содержащая соединение, существует и периодически используется, сеанс считается активным и живёт неограниченно долго. Проблемы начинаются, когда соединение простаивает: сервер 1С и операционная система начинают применять к нему механизмы очистки неактивных ресурсов.

Какие тайм-ауты определяют время жизни соединения

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

Типовые значения по умолчанию: сеанс без активности может считаться спящим примерно через 20 минут, а завершаться — ориентировочно через сутки. Эти значения администратор может менять, поэтому точные цифры на конкретном сервере нужно смотреть в консоли кластера, а не полагаться на умолчания.

Кроме тайм-аутов кластера, на время жизни влияют: сетевые тайм-ауты (разрыв TCP-соединения файрволом или NAT при длительном простое), перезапуск рабочих процессов кластера (например, по расписанию для освобождения памяти) и аварийное завершение клиентского приложения, которое держит соединение.

Ошибка «Соединение с сервером разорвано» при обращенииСеанс уже завершён сервером

Проверить тайм-ауты кластера и время простоя между вызовами

Сеансы висят в консоли кластера часамиКлиент не закрывает соединение явно

Найти в коде место создания COMConnector и проверку освобождения объекта

Разрывы ровно через одинаковый интервалСрабатывает тайм-аут (кластер, файрвол или NAT)

Сопоставить интервал с настройками кластера и сетевого оборудования

Как проверить, сколько живут сеансы на вашем сервере

Откройте консоль администрирования серверов 1С, выберите кластер и посмотрите список сеансов по нужной информационной базе. Сеансы COM-подключений отображаются с типом приложения «COM-соединение» (COMConnection). Для каждого сеанса видны время начала, время последней активности и потребляемая память.

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

Порядок проверки времени жизни сеанса
  1. 1
    Откройте консоль кластера и список сеансов нужной базы
  2. 2
    Установите COM-соединение из внешней программы и зафиксируйте время
  3. 3
    Наблюдайте за колонкой «Время последней активности» и статусом сеанса
  4. 4
    Дождитесь перехода сеанса в спящий режим и его завершения, запишите интервалы
  5. 5
    Сопоставьте замеры со свойствами кластера и при необходимости скорректируйте тайм-ауты

Как правильно закрывать COM-соединение

Единственный надёжный способ завершить сеанс — освободить все ссылки на COM-объект в клиентском коде. В 1С-коде это делается присваиванием переменной значения Неопределено; в скриптах на VBScript/JScript — установкой переменной в Nothing/null; в .NET — вызовом Marshal.ReleaseComObject или Marshal.FinalReleaseComObject.

Важно освобождать не только сам коннектор, но и все объекты, полученные через соединение: ссылки на объекты базы, результаты запросов, менеджеры объектов. Каждый такой объект держит внутреннюю ссылку на соединение, и пока он жив, сеанс не закроется — это самая частая причина «зависших» сеансов.

bsl
Соединение = Неопределено;
V83 = Новый COMОбъект("V83.COMConnector");
Попытка
    Соединение = V83.Connect(СтрокаПодключения);
    Результат = Соединение.Запросы.ВыполнитьВыборку();
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;
Соединение = Неопределено;
V83 = Неопределено;

Обратите внимание: простое завершение клиентского приложения не всегда мгновенно закрывает сеанс. Если процесс завершён аварийно, сервер узнает об обрыве только по тайм-ауту, и сеанс продолжит числиться активным до его срабатывания.

Повторное использование соединения вместо постоянного пересоздания

Установка COM-соединения — дорогая операция: создаётся сеанс, загружается конфигурация, проверяются права. Если внешняя программа обращается к базе часто, правильнее держать одно долгоживущее соединение и периодически выполнять через него лёгкие вызовы, чем создавать новое на каждую операцию.

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

Маршрут решения

Как выбрать стратегию работы

Обращения к базе редкие (реже одного раза в 10–15 минут)Создавайте соединение на каждую операцию и сразу освобождайте его
Обращения частые и регулярныеДержите одно соединение, поддерживайте его пингом и пересоздавайте при ошибке
Соединение периодически «отваливается» с ошибкойДобавьте перехват исключения с повторным подключением и логированием разрыва
В консоли копятся зависшие сеансыИщите в коде неосвобождённые COM-объекты и добавьте явное обнуление всех ссылок

Типичные ошибки и риски

Самая опасная ошибка — массовое создание соединений без закрытия в цикле или при каждом вызове веб-сервиса. Каждый такой сеанс занимает лицензию и память; при исчерпании лицензий пользователи не смогут войти в базу, а рабочий процесс сервера может упасть по памяти, уронив и обычные сеансы.

Вторая частая проблема — хранение COM-объекта в глобальной переменной или статическом поле службы Windows «на всякий случай» без контроля его состояния. После разрыва такой объект превращается в источник непонятных ошибок при каждом обращении, а диагностика усложняется тем, что сам объект формально существует.

Типичные ошибки
01
Создание нового соединения на каждую операцию без закрытия — исчерпание лицензий и памяти сервера
02
Освобождение только коннектора, но не объектов базы — сеанс остаётся жить до тайм-аута
03
Отсутствие обработки разрыва — приложение падает на первом же вызове после тайм-аута вместо переподключения
04
Пинг соединения чаще, чем раз в несколько минут — лишняя нагрузка на сервер без выигрыша в стабильности

Как проверить, что всё настроено правильно

После внедрения корректного закрытия и стратегии переподключения проверьте результат по консоли кластера: количество сеансов COM-соединений должно соответствовать числу реально работающих внешних приложений, а время жизни каждого сеанса — логике работы программы. Сеансы не должны накапливаться сутками, если приложение их уже не использует.

Контрольные точки

Как проверить результат

Количество сеансов COM в консоли кластера
Норма

Совпадает с числом активных внешних подключений

Тревожный признак

Сеансов больше, чем подключений, и они стареют без активности

Поведение приложения после простоя
Норма

При ошибке выполняется переподключение, работа продолжается

Тревожный признак

Приложение завершается с необработанной ошибкой разрыва

Потребление лицензий
Норма

Стабильное, без роста во времени

Тревожный признак

Постоянно растёт до исчерпания

Итог

Что важно запомнить

COM-соединение 1С живёт, пока существует клиентский объект и пока сервер не завершил сеанс по тайм-ауту. Управляйте временем жизни явно: освобождайте все COM-объекты после работы, для частых обращений держите одно соединение с пингом, при разрывах переподключайтесь, а фактическое время жизни сеансов контролируйте в консоли кластера.

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

Есть ли у COM-соединения жёсткий лимит времени жизни?

Нет, жёсткого лимита нет. Соединение живёт неограниченно долго, пока оно активно и клиентский объект существует. Ограничивают его только тайм-ауты неактивных сеансов кластера, сетевые разрывы и перезапуск рабочих процессов сервера.

Почему соединение рвётся примерно через 20 минут простоя?

Это характерный признак срабатывания механизма перевода неактивного сеанса в спящий режим с последующим завершением, либо сетевого тайм-аута (NAT, файрвол) на простаивающих TCP-соединениях. Точное значение смотрите в свойствах кластера и настройках сетевого оборудования.

Занимает ли COM-соединение лицензию 1С?

Да. Сеанс COM-соединения потребляет программную лицензию наравне с сеансом пользователя. Поэтому незакрытые соединения могут привести к исчерпанию лицензий и невозможности входа пользователей в базу.

Что произойдёт с сеансом, если аварийно завершить клиентскую программу?

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

Как безопасно держать соединение открытым постоянно?

Храните одно соединение в службе или приложении, выполняйте лёгкий «пинг» реже, чем срабатывает тайм-аут кластера, оборачивайте каждый вызов в обработчик ошибок с переподключением и периодически пересоздавайте соединение для сброса накопленной памяти на стороне сервера.