При организации межсерверного взаимодействия баз 1С с помощью внешнего COM-соединения часто возникает техническая проблема. Если на сервере-источнике запроса и на сервере-приемнике установлены разные релизы платформы (например, 8.3.8 и 8.3.10), система выдает исключительную ситуацию вида: «Произошла исключительная ситуация (V83.Connector.1). Несоответствие версий клиента и сервера..., клиентское приложение: Com-соединение».
Разберем подробнее причины возникновения этой ошибки и проанализируем проверенные способы ее устранения, включая как настройку системных компонентов Windows, так и переход на современные протоколы обмена.
Проблема заключается в архитектурных особенностях загрузки библиотек 1С в память процесса. Когда серверный процесс 1С (rphost) инициализирует COM-подключение к удаленной базе, он загружает внешнюю компоненту comcntr.dll. Данная библиотека обращается к ядрам платформы (в частности, core83.dll).
Операционная система не может одновременно загрузить в одно и то же адресное пространство одного процесса две разные версии одинаковых DLL-файлов. Платформа 1С строго требует полного совпадения не только мажорных номеров релизов, но и номера сборки (Build) клиента и сервера. Если вызывающий процесс работает на платформе 8.3.8, а целевая база располагается на сервере 8.3.10, возникает критический конфликт версий.
Рассмотрим классический способ устранения ошибки без изменения архитектуры обмена. Чтобы сервер 1С версии 8.3.8 мог подключиться к базе на платформе 8.3.10, на сервере-источнике должна быть зарегистрирована COM-компонента соответствующей версии целевого сервера.
comcntr.dll нужного релиза в операционной системе с помощью утилиты regsvr32.
Важно учитывать разрядность процесса сервера 1С! Если сервер 64-разрядный, регистрация выполняется 64-битной утилитой из каталога System32:
C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.10.XXXX\bin\comcntr.dll"
Для 32-битной версии сервера используем утилиту из каталога SysWOW64:
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.10.XXXX\bin\comcntr.dll"
V83.COMConnector перезаписывается последней зарегистрированной библиотекой. Чтобы использовать параллельно разные версии компонентов, настроим уникальные программные идентификаторы (ProgID) в реестре Windows или зададим явную привязку к конкретному классу библиотеки (например, создав псевдоним V8310.COMConnector).Проанализируем подход с использованием изолированных системных процессов Служб компонентов Windows (dcomcnfg). Этот метод предотвращает упадок процесса rphost при конфликте библиотек в памяти.
dcomcnfg в строке выполнить).dllhost.exe, а не внутри rphost.comcntr.dll нужного релиза.При таком подходе вызов внешней компоненты выполняется изолированно в среде dllhost.exe, что полностью устраняет проблему пересечения библиотек в одном адресном пространстве процесса rphost.
Рассмотрим наиболее современный и устойчивый к обновлениям подход. Использование технологии COM-соединения уходит в прошлое, привязано исключительно к ОС Windows и вызывает проблемы при обновлении платформ. Использование HTTP-сервисов полностью снимает зависимость от версий 1С.
Посмотрим, как перенести получение выборки документов с COM-запроса на HTTP-сервис:
GET) пропишем логику выполнения запроса с передачей параметров через URL или тело запроса:
Функция ПолучитьДанныеЗапросом(ЗапросHTTP)
Параметры = ЗапросHTTP.ПараметрыЗапроса;
Период = Параметры.Получить("Период");
НомерДоговора = Параметры.Получить("НомерДоговора");
// Выполняем стандартный запрос к БД 1С
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка, Проведение, СуммаДокумента
|ИЗ
| Документ.РеализацияТоваровУслуг
|ГДЕ
| Дата >= &Период И ДоговорКонтрагента.Номер = &НомерДоговора";
Запрос.УстановитьПараметр("Период", Дата(Период));
Запрос.УстановитьПараметр("НомерДоговора", НомерДоговора);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Сериализуем результат в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, РезультатЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");
Возврат Ответ;
КонецФункции
HTTPСоединение:
Соединение = Новый HTTPСоединение("server2.domain.local", 80, "User", "Password");
Запрос = Новый HTTPЗапрос("/base2/hs/GetData/Fetch?Период=20230101&НомерДоговора=123");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ТаблицаДанных = ПрочитатьJSON(ЧтениеJSON);
КонецЕсли;
Переход на HTTP-сервисы гарантирует бесперебойную работу обмена независимо от платформы 1С (Windows/Linux), исключает сбои при обновлении релизов и избавляет от необходимости манипуляций с регистрацией системных DLL в реестре Windows.