Администрирование · 9 мин
Как закрыть COM-соединение в 1С
Как правильно закрыть COM-соединение в 1С: обнуление объекта, завершение сеансов, работа с V83.COMConnector, контроль зависших процессов и типичные ошибки.
COM-соединение в 1С создаётся через объект V83.COMConnector (или V82.COMConnector для старых платформ) и открывает полноценный сеанс с информационной базой. Пока соединение живо, оно удерживает сеанс на сервере 1С или в файловой базе, потребляет память рабочего процесса и может блокировать фоновые механизмы, например обновление конфигурации или регламентные задания.
Главная проблема состоит в том, что у COM-объекта соединения в 1С нет явного метода «Закрыть()» или «Disconnect()». Разработчики, привыкшие к ADO или веб-сервисам, часто ищут такой метод и не находят его. Закрытие происходит косвенно — через освобождение ссылки на объект, а фактическое завершение сеанса зависит от настроек сервера и платформы.
Ниже разобраны рабочие способы закрытия соединения из кода, принудительное завершение зависших сеансов, отличия файлового и клиент-серверного режимов, а также типичные ошибки, из-за которых сеансы «висят» часами.
Как устроено COM-соединение и почему его нельзя «закрыть» напрямую
При вызове Connector.Connect(СтрокаПодключения) платформа создаёт COM-объект, который внутри себя открывает сеанс с базой. В клиент-серверном варианте сеанс регистрируется в кластере серверов 1С и виден в консоли администрирования. В файловом варианте создаётся отдельный процесс (например, 1cv8.exe или фоновый процесс COM-соединения), который держит файлы базы открытыми.
COM-технология управляет временем жизни объекта через подсчёт ссылок. Пока переменная в коде 1С ссылается на объект соединения, сеанс жив. Как только последняя ссылка исчезает, платформа освобождает COM-объект, и сеанс завершается — но не всегда мгновенно. На сервере сеанс может продолжать числиться активным до истечения тайм-аута, заданного в свойствах кластера.
Закрытие соединения из кода 1С
Стандартный приём — обнулить переменную, в которой хранится соединение. Это снимает ссылку с COM-объекта, и платформа инициирует его освобождение:
// Открываем соединение
Connector = Новый COMОбъект("V83.COMConnector");
Соединение = Connector.Connect("Srvr=""Server1"";Ref=""Trade"";Usr=""Admin"";Pwd=""123"";");
// ... обмен данными ...
// Закрываем соединение
Соединение = Неопределено;
Connector = Неопределено;
Важно обнулить обе переменные: и само соединение, и коннектор. Если обнулить только Соединение, а Connector оставить, обычно сеанс всё равно завершится, но явное освобождение всех ссылок — надёжная практика, особенно в длительных циклах обмена.
Если соединение открывается внутри процедуры или функции и хранится в локальной переменной, оно освобождается автоматически при выходе из процедуры. Проблемы возникают, когда ссылку сохраняют в реквизит формы, переменную модуля или параметр сеанса — тогда объект живёт, пока жив владелец переменной.
Почему сеанс не закрывается после обнуления переменной
Даже после корректного освобождения ссылки сеанс в консоли кластера может отображаться ещё несколько минут. Это нормальное поведение: сервер завершает неактивные сеансы по тайм-ауту. Проверить и при необходимости сократить задержку можно в свойствах кластера — параметры «Интервал перезапуска» и настройки времени жизни сеансов в рабочих процессах.
Другая частая причина — где-то в коде осталась вторая ссылка на объект соединения: в реквизите формы, в структуре, переданной в другой модуль, в кэше общего модуля. Пока жива хотя бы одна ссылка, сеанс не закроется. Для поиска таких мест помогает поиск по имени переменной соединения по всей конфигурации.
Как проверить, что соединение закрыто
Сеанс с типом COM-соединения исчезает в течение нескольких минут
Сеанс висит десятки минут и не завершается
Число сеансов возвращается к исходному уровню
Каждый обмен добавляет новый сеанс, старые не закрываются
Потребление стабилизируется после обмена
Память растёт с каждым подключением
Типичные ошибки при работе с COM-соединениями
Отдельно стоит упомянуть утечки при обменах по расписанию. Если регламентное задание каждый час создаёт соединение и из-за ошибки не освобождает его, за сутки накапливаются десятки зависших сеансов. Симптом — рост потребления памяти рабочим процессом и жалобы пользователей на замедление. Лечится переносом обнуления переменных в блок Исключение и в код после КонецПопытки.
Альтернативы и профилактика
Если COM-соединения регулярно создают проблемы, рассмотрите замену механизма обмена. HTTP-сервисы и веб-сервисы не держат постоянный сеанс: соединение открывается на время одного запроса и закрывается автоматически. Для типовых обменов между конфигурациями часто подходят планы обмена и формат EnterpriseData, где сеансовая проблематика отсутствует вовсе.
Способы интеграции вместо постоянного COM
Подходят для точечных запросов; сеанс живёт только во время вызова. Ограничение — нужно разрабатывать и публиковать сервис
Классический вариант для внешних систем; тоже без постоянных сеансов. Требует публикации на веб-сервере
Подходят для регулярной синхронизации типовых конфигураций; не требуют ручного управления соединениями
Остаётся рабочим вариантом для разовых выгрузок, если переменные обнуляются и ошибки обрабатываются
Если отказаться от COM нельзя, внедрите простую дисциплину: соединение создаётся в одном месте, используется, обнуляется там же; весь код обмена оборачивается в Попытка...Исключение...КонецПопытки с гарантированным освобождением переменных; раз в неделю администратор просматривает список сеансов на предмет «долгожителей».
Что важно запомнить
COM-соединение в 1С закрывается не методом, а освобождением всех ссылок на объект: присвойте переменным Неопределено и обрабатывайте исключения. Зависшие сеансы удаляются через консоль кластера или rac, а регулярные утечки — сигнал перейти на HTTP-сервисы или планы обмена.
Частые вопросы
Есть ли у COM-соединения в 1С метод Close() или Закрыть()?
Нет. У объекта, возвращаемого методом Connect, нет метода явного закрытия. Соединение завершается, когда исчезают все ссылки на него — обычно после присваивания переменной значения Неопределено или выхода из процедуры, где объявлена локальная переменная.
Почему после обнуления переменной сеанс ещё виден в консоли кластера?
Сервер завершает неактивные сеансы с задержкой, которая определяется настройками кластера и рабочих процессов. Если сеанс исчезает в течение нескольких минут — это штатное поведение, вмешательство не требуется.
Как найти зависшие COM-сеансы на сервере?
Откройте консоль администрирования серверов 1С, разверните кластер и перейдите в раздел «Сеансы». COM-соединения обычно отображаются с соответствующим типом приложения. Отсортируйте по времени начала — сеансы, живущие аномально долго, и есть кандидаты на разбор.
Опасно ли удалять сеанс COM-соединения через консоль кластера?
Если через соединение в этот момент идёт запись данных, принудительное удаление прервёт транзакцию, что может привести к незавершённым операциям в базе. Перед удалением убедитесь, что обмен завершён или действительно завис, а не выполняется.
Чем заменить COM-соединение, чтобы не управлять сеансами вручную?
Для разовых запросов удобны HTTP-сервисы и веб-сервисы — сеанс живёт только на время вызова. Для регулярной синхронизации между типовыми конфигурациями подходят планы обмена и формат EnterpriseData, где соединениями управляет сам механизм обмена.
Соединение открывается в цикле на каждую итерацию — это плохо?
Да. Создание COM-соединения — ресурсоёмкая операция, а незакрытые экземпляры накапливаются в сеансах. Правильный подход — открыть одно соединение до цикла, использовать его для всех итераций и обнулить после завершения.