Ситуация, когда при минимальной сетевой задержке (пинг 6 мс) процесс авторизации и создания COM-объекта занимает от 5 до 7 минут, является критической для работы любых интеграций. Мы привыкли, что 1С должна работать быстро, но технологии COM и DCOM накладывают свои ограничения, особенно в современных сетевых инфраструктурах — есть универсальный перенос данных через COM и HTTP. Давайте подробно разберем, почему это происходит, и проанализируем шаги по устранению этой "дикой" задержки.
Прежде всего, разберем ситуацию с тем, какой именно объект создается в коде. В обсуждении упоминается запуск "толстого клиента", что часто сигнализирует об использовании V83.Application. Рассмотрим подробнее разницу между ними:
Рекомендация: Если ваша задача не требует интерактивного взаимодействия с пользователем или специфических функций толстого клиента, всегда используйте V83.COMConnector. Пример инициализации выглядит так:
Соединитель = Новый COMОбъект("V83.COMConnector");
ПараметрыСвязи = "Srvr='ServerName';Ref='BaseName';Usr='Login';Pwd='Password';";
Попытка
Соединение = Соединитель.Connect(ПараметрыСвязи);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Выясним причину задержек на уровне сетевых протоколов. Даже если вы прописали сервер в файле hosts, операционная система Windows может вести себя непредсказуемо. Разберем по шагам:
Проблема IPv6: Современные версии Windows по умолчанию приоритезируют протокол IPv6. Если в вашей локальной сети IPv6 настроен не полностью или блокируется брандмауэром, COM-соединение будет пытаться установиться через него, ждать тайм-аута (который может составлять десятки секунд на каждый запрос) и только потом "откатываться" на IPv4.
Решение: Попробуем полностью отключить IPv6 в свойствах сетевого адаптера на сервере 1С и на сервере-клиенте. Также в реестре Windows рекомендуется установить приоритет IPv4 над IPv6. Подобные тонкие настройки ОС часто встречаются в справке по решениям различных задач администрирования Windows и 1C.
Малоизвестная, но очень частая причина тормозов при инициализации COM — это попытка системы проверить цифровые подписи библиотек 1С (DLL). Когда вы создаете COMОбъект, Windows обращается к спискам отзыва сертификатов (CRL) через интернет. Если у сервера нет прямого выхода в сеть, он будет ждать ответа от серверов Microsoft или центров сертификации до истечения системного тайм-аута.
Рассмотрим, как это отключить:
Это позволит системе мгновенно загружать библиотеки 1С без ожидания ответа из интернета.
Проанализируем ситуацию с портами. Технология COM по сети работает через RPC (Remote Procedure Call). Процесс начинается на порту 135, после чего сервер и клиент договариваются о переходе на динамический порт в диапазоне 49152–65535.
Если между серверами стоит брандмауэр или антивирус с функцией инспекции трафика, каждый такой переход может сопровождаться задержками или блокировками — это решается через универсальная подсистема обмена данными с поддержкой COM. Проанализируем настройки в консоли dcomcnfg:
dcomcnfg (Службы компонентов).TCP/IP должен стоять на первом месте.Автор темы упоминал запуск толстого клиента под учеткой службы для прогрева кэша. Это верный ход, но кэш COM-соединения отличается от кэша обычного пользователя. При использовании COM задействуются временные папки профиля службы (обычно C:\Windows\ServiceProfiles\LocalService\AppData\Local\1C). Посмотрим, есть ли у службы сервера полные права на чтение и запись в эти каталоги. Иногда нехватка прав заставляет систему при каждом подключении заново пересоздавать служебные структуры данных, что и вызывает тормоза.
В современных реалиях 1С (начиная с платформы 8.3.10 и выше) технология COM официально считается устаревающей, особенно в контексте перехода на Linux. Чтобы реализовать интеграцию между 1С без боли и страданий, стоит рассмотреть преимущества HTTP-сервисов:
Если ваши задержки не удается победить настройками сети, самым правильным архитектурным решением будет создание простого HTTP-сервиса в базе-источнике и обращение к нему через HTTPСоединение. Для этого можно использовать общий модуль для быстрой организации HTTP сервиса или внедрить универсальный модуль с процедурами для разработки API.
Пример простейшего вызова сервиса:
Соединение = Новый HTTPСоединение("server_name", 80, "login", "password");
Запрос = Новый HTTPЗапрос("/BaseName/hs/v1/get_data");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обрабатываем данные
КонецЕсли;
Мы выяснили, что задержка в 5 минут — это не норма. Для исправления ситуации необходимо последовательно проверить:
COMConnector вместо Application.В долгосрочной перспективе рекомендуем отказаться от COM в пользу HTTP-сервисов, что избавит систему от зависимости от специфических настроек операционной системы Windows — для этого есть организация обмена данными через веб-сервисы.