Администрирование · 9 мин
Как отключить COM-соединение в 1С 8.3
Как правильно отключить COM-соединение в 1С 8.3: разрыв соединения в коде, снятие зависших процессов, работа с сеансами и типичные ошибки при закрытии V83.COMConnector.
COM-соединение в 1С 8.3 создаётся через объект V83.COMConnector и позволяет одной базе обращаться к другой: читать справочники, создавать документы, запускать обмены. Проблема в том, что такое соединение удерживает сеанс на сервере или в файловой базе до тех пор, пока оно явно не закрыто. Если соединения не отключать, накапливаются «висячие» сеансы, блокировки и утечки памяти, а файловая база может оказаться заблокированной для других пользователей.
Отключить COM-соединение можно несколькими способами: корректно освободить объект в коде, завершить сеанс через консоль кластера, снять зависший процесс или перезапустить службу агента сервера. Выбор способа зависит от того, где возникла проблема — в вашем коде, в чужой обработке или на уровне сервера 1С.
Как устроено COM-соединение и почему оно «зависает»
При вызове метода Connect объекта V83.COMConnector создаётся полноценный сеанс с информационной базой. В клиент-серверном варианте на стороне сервера 1С стартует рабочий процесс, который обслуживает это подключение, в файловом варианте соединение удерживает сам клиентский процесс. Пока объект соединения существует в памяти вызывающей стороны, сеанс считается активным.
Типичная причина «зависания» — код, который создаёт соединение, но не освобождает его: обработка завершилась с ошибкой до строки отключения, объект сохранён в глобальной переменной или реквизите формы, либо COM-объект захвачен внешним приложением (скриптом, службой, планировщиком). В результате сеансы копятся, а администратор видит в консоли кластера десятки подключений с типом «COM-соединение».
Как отключить COM-соединение в коде 1С
Правильный способ разрыва соединения внутри кода — обнулить все переменные, которые ссылаются на объект соединения и на объекты, полученные через него. Важно освободить не только само соединение, но и экспортированные объекты: если вы получили через COM ссылку на документ или выборку, они тоже удерживают сеанс.
Типовой фрагмент корректного закрытия выглядит так:
Попытка
// работа с соединением
Результат = Соединение.ВыполнитьОбмен();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
// Отключение: сначала дочерние объекты, потом само соединение
Выборка = Неопределено;
ДокументОбъект = Неопределено;
Соединение = Неопределено;
COMConnector = Неопределено;После присвоения Неопределено платформа освобождает COM-объекты при очередном проходе сборщика мусора. В тонком и толстом клиенте это происходит автоматически, но если соединение создавалось в фоновом задании на сервере, сеанс на удалённой стороне закроется после завершения вызова и очистки ссылок. Не храните COM-соединение в реквизитах формы или параметрах сеанса — это самая частая причина незакрытых подключений.
Как завершить сеанс COM-соединения через консоль кластера
Если соединение создала чужая обработка или внешняя программа и код вам недоступен, сеанс завершается административно. Откройте консоль администрирования серверов 1С, раскройте нужный кластер, перейдите в раздел «Сеансы» и отсортируйте список по колонке «Приложение» — COM-подключения отображаются с признаком COM-соединения.
- 1Откройте консоль администрирования серверов 1С и выберите нужный кластер
- 2Перейдите в раздел «Сеансы» и найдите строки с типом приложения «COM-соединение»
- 3Убедитесь по пользователю и времени начала, что сеанс действительно зависший, а не активный обмен
- 4Выделите сеанс и выполните команду «Завершить сеанс» из контекстного меню
- 5Проверьте, что сеанс исчез из списка, а блокировки сняты
Перед завершением убедитесь, что сеанс не выполняет активную длительную операцию: принудительный разрыв обмена на середине транзакции может оставить в базе незавершённые данные. Ориентируйтесь на колонки «Время начала», «Время последней активности» и объём прочитанных и записанных данных — «мёртвый» сеанс обычно долго не проявляет активности.
Как снять зависший процесс на сервере
Когда сеанс не завершается штатно или консоль кластера недоступна, соединение снимается на уровне операционной системы. В клиент-серверном варианте COM-сеансы обслуживают рабочие процессы rphost; в файловом варианте соединение удерживает процесс того приложения, которое его открыло — 1cv8.exe, wscript.exe для скриптов или собственный процесс внешней программы.
В диспетчере задач Windows найдите процесс, создавший соединение, и завершите его. Для rphost действуйте осторожно: один рабочий процесс обычно обслуживает несколько сеансов разных пользователей, и его завершение отключит их всех. Предпочтительнее сначала попробовать завершить конкретный сеанс через консоль кластера и только при её отказе снимать процесс.
Как предотвратить накопление незакрытых соединений
Разовое отключение решает симптом, но если обмены запускаются регулярно, стоит встроить закрытие соединения в саму логику. Основной приём — оборачивать работу с соединением в конструкцию Попытка/Исключение и освобождать объект в любой ветке завершения, включая ошибочную.
Дополнительные меры: не создавать новое соединение на каждую операцию в цикле, а открывать одно и закрывать после пакета операций; не хранить COM-объекты между вызовами сервера; для регламентных обменов использовать отдельного служебного пользователя, чтобы его сеансы было легко отличить в консоли кластера. Если обмен регулярный, рассмотрите переход с COM на веб-сервисы или HTTP-сервисы — они не удерживают постоянный сеанс и не требуют явного отключения.
Как проверить, что соединение действительно закрыто
После отключения убедитесь, что сеанс исчез, а не просто перестал использоваться. В клиент-серверном варианте обновите список сеансов в консоли кластера: строка с типом «COM-соединение» для вашего пользователя не должна появляться заново. В файловом варианте проверьте, что на файл базы не осталось блокировок и другие пользователи могут войти.
Как проверить результат
Сеанс с типом «COM-соединение» отсутствует или завершён
Сеанс снова появляется без активности — соединение где-то пересоздаётся
Управляемые блокировки сняты, пользователи работают
Остаются записи в списке блокировок от завершённого сеанса
Соединение создаётся и закрывается, число сеансов не растёт
С каждым запуском добавляется новый незакрытый сеанс
Если сеансы продолжают появляться после отключения, ищите источник: регламентное задание, внешнюю службу, скрипт планировщика Windows или другую базу, которая периодически подключается. Помогает журнал регистрации с отбором по пользователю, под которым выполняется COM-подключение.
Частые вопросы
Чем отличается отключение COM-соединения в файловой и клиент-серверной базе?
В файловой базе соединение удерживает процесс, который его открыл, и закрывается освобождением объекта или завершением этого процесса. В клиент-серверном варианте сеанс живёт на сервере 1С, поэтому его дополнительно можно завершить через консоль кластера, не трогая клиентское приложение.
Закроется ли соединение само, если просто завершить обработку?
Не гарантированно. Если объект соединения хранится в переменной, которая остаётся доступной (реквизит формы, глобальный контекст, параметр), сеанс продолжит существовать. Надёжный вариант — явно присвоить переменным Неопределено перед завершением обработки.
Можно ли отключить COM-соединение со стороны базы, к которой подключились?
Да, администратор целевой базы может завершить входящий сеанс через консоль кластера или список активных пользователей. При этом вызывающая сторона получит ошибку при следующем обращении к разорванному соединению.
Почему после завершения сеанса в консоли он появляется снова?
Значит, существует работающий источник подключений: регламентное задание, внешняя программа или скрипт, которые пересоздают соединение по расписанию или в цикле. Найдите источник по пользователю сеанса и журналу регистрации, затем исправьте его код или расписание.
Опасно ли завершать сеанс COM-соединения во время обмена?
Да, принудительный разрыв во время записи данных может оставить транзакцию незавершённой и привести к частично записанным объектам. Перед завершением проверьте в консоли кластера, что у сеанса давно нет активности, а при сомнениях дождитесь окончания операции.
Что использовать вместо COM, чтобы не бороться с зависшими сеансами?
Для регулярных интеграций удобнее HTTP-сервисы и веб-сервисы: каждый вызов выполняется в коротком сеансе, который закрывается автоматически после ответа. Также подойдёт обмен через EnterpriseData или файлы, если взаимодействие не требует мгновенного ответа.
Что важно запомнить
COM-соединение закрывается освобождением всех переменных с объектом соединения; зависшие сеансы снимаются через консоль кластера, а процесс rphost завершают только в крайнем случае. Встраивайте отключение в ветку Исключение и проверяйте результат по списку сеансов.