При обновлении платформы 1С:Предприятие (например, при переходе с версии 8.3.10 на 8.3.12 и выше) разработчики часто сталкиваются с ситуацией, когда стабильно работавший ранее обмен между базами данных внезапно перестает функционировать. При попытке инициализации COM-соединения система начинает выдавать неинформативные ошибки, такие как «Значение не является значением объектного типа (NewObject)» или «Метод объекта не обнаружен (Connect)».
В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы взаимодействия операционной системы Windows с компонентами 1С и рассмотрим два надежных способа восстановления работоспособности обмена.
Давайте проанализируем ситуацию, описанную на форуме. Изначально обмен выполнялся на стороне сервера с использованием стандартного кода инициализации соединения:
Попытка
ОбъектПодключения = "V83.COMConnector";
ТекCOMПодключение = Новый COMObject(ОбъектПодключения);
ТекCOMОбъект = ТекCOMПодключение.Connect(СтрокаПодключения);
Исключение
СтрокаСообщенияОбОшибке = НСтр("ru = 'При попытке соединения с COM-сервером произошла ошибка'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияОбОшибке);
Возврат Неопределено;
КонецПопытки;
После обновления платформы до релиза 8.3.12 переменная ТекCOMПодключение создается успешно, однако попытка вызвать метод Connect приводит к падению системы. Проблема кроется в разрядности (битности) приложений.
При переходе на новую версию платформы системные администраторы часто меняют архитектуру сервера 1С:Предприятие с 32-разрядной (x86) на 64-разрядную (x64). Операционная система Windows устроена так, что 64-битный рабочий процесс сервера 1С (rphost.exe) не может напрямую загрузить в свое адресное пространство 32-битную динамическую библиотеку (comcntr.dll).
Когда мы пытаемся зарегистрировать 32-битную компоненту на 64-битном сервере, операционная система через механизмы переадресации реестра (WoW64) может создать пустой контейнер объекта, но его внутренний интерфейс взаимодействия (IV8COMConnector) не инициализируется. В результате платформа видит сам объект типа COMОбъект, но не находит у него ни одного метода, включая ключевой метод Connect.
---
Если ваш сервер 1С работает под управлением 64-битной службы, наиболее правильным и производительным решением будет использование родной 64-битной библиотеки comcntr.dll. Разберем этот процесс по шагам.
Шаг 1. Проверка установки компоненты.
При установке 64-разрядного сервера 1С:Предприятия нужная нам компонента часто отключается в инсталляторе по умолчанию. Вам необходимо запустить программу установки текущего релиза платформы (например, 8.3.12.XXXX) в режиме изменения состава установленных компонентов и убедиться, что для пункта «COM-соединение» установлен режим установки на локальный жесткий диск.
Шаг 2. Разрегистрация старых версий библиотек.
Чтобы избежать конфликтов в реестре Windows, необходимо корректно удалить сведения о старых версиях коннектора. Откройте командную строку (cmd) от имени Администратора и выполните команды разрегистрации для старых путей (укажите ваши реальные номера релизов платформ):
regsvr32 /u "C:\Program Files (x86)\1cv8\8.3.10.2561\bin\comcntr.dll"
regsvr32 /u "C:\Program Files\1cv8\8.3.10.2561\bin\comcntr.dll"
Шаг 3. Регистрация новой 64-битной библиотеки.
В этой же командной строке зарегистрируйте компоненту из каталога bin новой 64-битной платформы:
regsvr32 "C:\Program Files\1cv8\8.3.12.1790\bin\comcntr.dll"
При успешном выполнении вы должны увидеть системное сообщение: «Успешное выполнение DllRegisterServer в...». После этого обязательно выполните перезапуск службы «Агент сервера 1С:Предприятия».
---
Бывают ситуации, когда на одном физическом сервере должны сосуществовать базы данных разной разрядности или когда прямая регистрация библиотеки x64 не решает проблему из-за жестких ограничений прав доступа учетной записи службы 1С. В этом случае на помощь приходит настройка изолированной среды COM+ (суррогатного процесса dllhost.exe).
Этот способ позволяет настроить мост для взаимодействия 64-битных процессов сервера с 32-битной библиотекой (или наоборот). Рассмотрим настройку подробно:
dcomcnfg и нажмите Enter. Откроется окно «Службы компонентов».V83_COMConnector) и обязательно установите переключатель способа активации в положение «Серверное приложение». Нажмите «Далее».USR1CV8). Это критически важно для предоставления процессу необходимых прав в операционной системе.comcntr.dll нужной вам разрядности (например, из папки 32-битного клиента: C:\Program Files (x86)\1cv8\8.3.12.XXXX\bin\comcntr.dll).V83_COMConnector, нажмите на него правой кнопкой мыши и выберите Свойства.Данный подход полностью решает проблему несовместимости архитектур, так как операционная система берет на себя трансляцию вызовов между процессами через прослойку COM+.
---
Если вы выполнили регистрацию компоненты, но ошибка Метод объекта не обнаружен (Connect) сохраняется, обратите внимание на следующие нюансы:
USR1CV8), должна иметь полные права на чтение и выполнение файлов в каталоге новой платформы C:\Program Files\1cv8\8.3.12.XXXX\bin\. При отсутствии прав процесс сервера просто не сможет прочесть файл comcntr.dll.snccntry, reg_1541 во временных файлах пользователя службы) и запустить службу заново.CLSID. Вы можете открыть редактор реестра regedit, запустить поиск по строке comcntr.dll и убедиться, что все найденные пути ведут к актуальному и физически существующему каталогу платформы.