Проанализируем распространенную ситуацию: в организации функционирует клиент-серверная база на определенном релизе платформы (например, «Управление торговлей 10.3» с парком в десятки рабочих станций), а файловая база («Бухгалтерия предприятия 3.0») на компьютере отдельного пользователя была обновлена до более свежей версии платформы 1С. При попытке настроить прямое программное взаимодействие через V83.COMConnector возникает ошибка несовпадения версий библиотеки comcntr.dll. Переустанавливать платформу на всем парке машин ради одной интеграции нецелесообразно. Рассмотрим подробнее, почему возникает эта коллизия и как обойти проблему с помощью системных средств Windows и альтернативных подходов.
Выясним причину такого поведения операционной системы и платформы. При регистрации библиотеки comcntr.dll с помощью системной утилиты regsvr32 в реестре Windows перезаписывается стандартный программный идентификатор ProgID V83.COMConnector. Он начинает указывать на ту версию платформы, библиотека которой регистрировалась последней. Платформа 1С не умеет в рамках стандартного вызова автоматически определять требуемую версию DLL для удаляющейся или подключаемой базы данных.
Кроме того, при классическом создании COM-соединения библиотека загружается как внутрипроцессный сервер (In-process COM) непосредственно в адресное пространство процесса, инициировавшего вызов. Если соединение выполняется на стороне 64-разрядного сервера 1С, а вызывается 32-битная библиотека (или наоборот), операция прерывается из-за несовместимости архитектур. Также важно помнить: прямое обращение к файловой информационной базе через COM фактически открывает базу локально на той машине, где исполняется программный код. Если на ней установлена платформа, не соответствующая структуре таблиц базы данных, возникнут ошибки доступа и блокировки.
Разберем основной и самый надежный способ совместного использования нескольких версий библиотек на одной машине — создание выделенного серверного приложения COM+ в оснастке «Службы компонентов» Windows.
Разберем по шагам порядок настройки:
dcomcnfg в окне «Выполнить»).1C_V83_CustomVersion).dllhost.exe, что предотвратит падение вызывающего процесса и снимет конфликт разрядностей (32 и 64 бит).comcntr.dll из каталога bin нужного релиза платформы.Посмотрим на пример вызова компонента в коде, если для него зарегистрирован отдельный идентификатор:
// Создание COM-объекта с использованием уникального ProgID приложения COM+
Попытка
КомСоединитель = Новый COMОбъект("V83.COMConnector.Custom");
УстановитьПодключение(КомСоединитель);
Исключение
ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурнала.Ошибка, , , ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
Проанализируем ситуацию, когда настройка COM+ на центральном сервере нежелательна, но целевая платформа уже развернута на клиентском компьютере (например, на ноутбуке бухгалтера). Конструктор объекта COMОбъект платформы 1С поддерживает второй параметр — сетевое имя удаленного компьютера (DCOM):
ИмяКомпьютера = "NOTEBOOK-BUH";
Попытка
// Инициализация объекта на удаленной машине, где зарегистрирована нужная DLL
КомСоединитель = Новый COMОбъект("V83.ComConnector", ИмяКомпьютера);
СтрокаПодключения = "File=""C:\Bases\Accounting""; Usr=""Admin""; Pwd=""Secret"";";
Соединение = КомСоединитель.Connect(СтрокаПодключения);
Исключение
Сообщить("Не удалось инициировать COM-соединение: " + ОписаниеОшибки());
КонецПопытки;
Для корректной работы этого механизма служба DCOM на целевом компьютере должна быть настроена: пользователь, под которым инициируется подключение (например, служба USR1CV8 сервера 1С), обязан иметь права на удаленный запуск и активацию компонентов в оснастке dcomcnfg.
Если требуется временное решение без тонких манипуляций со службами компонентов COM+, можно использовать запуск полноценного приложения вместо урезанного соединителя. Разберем нюансы:
Попытка
// Запуск через Automation Server
Приложение = Новый COMОбъект("V83.Application");
Приложение.Connect("File=""C:\Bases\Accounting""; Usr=""Admin""; Pwd=""Secret"";");
// Выполнение требуемых операций
Результат = Приложение.Справочники.Номенклатура.НайтиПоКоду("00000001");
Исключение
Сообщить("Ошибка соединения через Application: " + ОписаниеОшибки());
КонецПопытки;
Обратим внимание на ограничения данного метода: V83.Application запускает полноценное клиентское приложение с графической подсистемой. Это требует существенно больше оперативной памяти, расходует отдельную клиентскую лицензию и работает медленнее, чем легковесный COMConnector. Однако в критических ситуациях это позволяет быстро восстановить обмен без перерегистрации библиотек.
Технология COM-соединений является устаревающей платформенной зависимостью, жестко привязанной к ОС Windows и разрядностям процессов. В современной архитектуре 1С рекомендуется переводить интеграции на стабильные протоколы:
HTTPСоединение./Execute и /F, что гарантирует старт именно нужного исполняемого файла платформы без конфликта системных библиотек.