При организации интеграции между различными информационными базами 1С программисты часто используют механизм COM-соединения. Однако при взаимодействии серверов на разных версиях платформ (например, при обращении из базы на платформе 8.3 к базе на платформе 8.2) возникает серьезная системная проблема. Метод Connect() может выполняться крайне медленно — от нескольких десятков секунд до нескольких минут, а сам рабочий процесс сервера 1С (rphost.exe) в этот момент полностью зависает, блокируя работу всех остальных пользователей системы.
В этой статье мы подробно разберем причины возникновения данной проблемы и рассмотрим пошаговые инструкции по ее устранению как на уровне настроек операционной системы и кластера 1С, так и на уровне архитектуры обмена данными.
Прежде чем переходить к настройкам, проанализируем внутренний механизм инициализации COM-соединения. Когда в программном коде выполняется следующая строка:
База82 = V8COM.Connect(СтрокаСоединения);
Происходят следующие ресурсоемкие процессы:
rphost.exe. Если в рамках этого процесса работают другие пользователи, весь процесс блокируется на время разбора метаданных. Пользователи видят это как глухое зависание программы.%TEMP%) пользователя Windows, под которым запущена служба сервера 1С (обычно это USR1CV8). Если у службы нет полных прав на запись в эту папку или кэш поврежден, платформа при каждом новом вызове выполняет компиляцию заново, что увеличивает время подключения до 2–3 минут.---
Самый надежный способ предотвратить зависание сервера 1С — это запустить COM-соединение в изолированном процессе операционной системы Windows (dllhost.exe) вместо адресного пространства процесса rphost.exe. Для этого настроим выделенное приложение COM+.
Рассмотрим этот процесс по шагам:
comexp.msc и нажмите Enter).V83_COM_Connector.dllhost.exe.comcntr.dll, который находится в каталоге установленной платформы 1С (например, C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll).V83_COM_Connector, перейдите на вкладку «Безопасность», снимите флаг «Принудительная проверка доступа для приложений» и установите уровень ограничений в значение «Неограниченный».После проведения этих настроек время разбора метаданных может по-прежнему занимать ресурсы, но зависание уйдет в изолированный процесс dllhost.exe, и основные пользователи базы 1С перестанут замечать задержки в работе системы.
---
Если нет возможности оперативно настроить COM+ на сервере, можно воспользоваться внутренними механизмами платформы 1С для снижения влияния блокировок на пользователей.
Выполним следующие действия в консоли администрирования кластера 1С:
1 (или настройте жесткие лимиты по объему памяти на один процесс).Важно: Данный параметр заставляет кластер создавать новые рабочие процессы rphost.exe при превышении лимита подключений. Это предотвратит ситуацию, когда один зависший сеанс COM-соединения блокирует работу десятков других пользователей, распределяя их по разным процессам. Минус данного способа — повышенное потребление оперативной памяти сервером приложений.
---
Одной из частых причин долгого выполнения метода Connect() является постоянный пересчет кэша метаданных. Чтобы ускорить этот процесс, необходимо один раз «прогреть» кэш под той учетной записью, под которой крутится служба сервера 1С.
Выполним процедуру кэширования по шагам:
USR1CV8 или локальная система SYSTEM).AppData\Local\1C\1Cv8....C:\Users\ИмяПользователяСлужбы\AppData\Local\Temp. Убедитесь, что у учетной записи службы 1С есть полные права (Full Control) на создание и запись файлов в этой директории. Очистите эту папку от накопившихся миллионов старых временных файлов, так как перегруженная папка Temp сильно замедляет файловые операции операционной системы.---
Если базы расположены на разных физических серверах, долгий коннект может быть связан с задержками разрешения сетевых имен (DNS). По умолчанию ОС Windows сначала пытается разрешить имя сервера через протокол IPv6, и только после истечения таймаута (до 20-40 секунд) переходит к IPv4.
Проанализируем эту ситуацию:
СтрокаСоединения = "Srvr=""192.168.1.100:1741"";Ref=""BASE_test_82"";";
---
Использование COM-соединения в современных реалиях разработки 1С считается устаревшим подходом (legacy). COM-технология жестко привязана к операционной системе Windows (что делает невозможным перенос серверов на Linux), имеет склонность к неконтролируемым утечкам памяти и часто вызывает проблемы с правами доступа.
Рекомендуется рассмотреть переход на использование HTTP-сервисов. На стороне базы 8.2 создается простой HTTP-сервис, а база 8.3 обращается к нему через объект HTTPСоединение.
Рассмотрим пример того, как лаконично выглядит отправка запроса из базы-инициатора:
// Пример выполнения интеграции через HTTP-запрос
Соединение = Новый HTTPСоединение("server-name", , "Пользователь1С", "Пароль1С");
Запрос = Новый HTTPЗапрос("/Base82/hs/v1/exchange/upload");
Запрос.УстановитьТелоИзСтроки(ДанныеДляПереноса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обрабатываем успешный ответ от базы 8.2
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
Данный подход обладает неоспоримыми преимуществами: подключение происходит за миллисекунды, отсутствуют блокировки рабочих процессов 1С, нет зависимости от разрядности библиотек платформы (x32/x64) и операционной системы сервера.