При организации интеграции между современными версиями 1С:Предприятия 8.3 и устаревшими базами 1С:Предприятия 7.7 разработчики часто сталкиваются с ошибками при инициализации OLE/COM-соединения. Попробуем разобрать типовую ситуацию, когда при выполнении кода создания COM-объекта возникают системные сбои:
V7 = Новый COMОбъект("V77.Application");
В процессе работы могут появляться две распространенные ошибки:
Проанализируем причины возникновения данных сбоев и разберем по шагам все способы их устранения.
Выясним причину первой ошибки: код 0x800401F3 означает, что операционная система Windows не находит в системном реестре зарегистрированного COM-сервера с указанным ProgID (например, V77.Application). Зачастую это происходит, когда каталог с установленной платформой 1С 7.7 был просто скопирован с другого компьютера без прохождения процедуры установки и регистрации в реестре, либо если регистрировались посторонние библиотеки (такие как comcntr.dll, относящаяся к 1С 8, или внешняя компонента v7plus.dll, не являющаяся OLE-сервером платформы 7.7).
Рассмотрим причину второй ошибки: код 0x80004002 указывает на то, что вызывающий процесс не может получить доступ к COM-интерфейсу. Платформа 1С 7.7 существует исключительно в 32-разрядном исполнении (x86). Если код выполняется в контексте 64-битного клиента или 64-битной службы сервера 1С:Предприятия 8.3 (rphost.exe), 64-битный процесс не может напрямую загрузить 32-битную DLL или связаться с 32-битным COM-сервером без специального механизма маршалинга. Кроме того, служба сервера 1С работает в изолированной неинтерактивной нулевой сессии Windows (Session 0), где по умолчанию заблокирован запуск приложений с графическим интерфейсом.
Для устранения ошибки 0x800401F3 необходимо зарегистрировать исполняемый файл 1С 7.7 в реестре Windows. Разберем, как это сделать правильно:
C:\Program Files (x86)\1Cv77\BIN).
1cv7.exe /regserver
Если используется SQL-версия платформы, выполним:
1cv7s.exe /regserver
// Для сетевой версии:
V7 = Новый COMОбъект("V77M.Application");
// Для SQL-версии:
V7 = Новый COMОбъект("V77S.Application");
// Для локальной версии:
V7 = Новый COMОбъект("V77L.Application");
// Универсальный идентификатор:
V7 = Новый COMОбъект("V1CEnterprise.Application");
Чтобы подружить 64-битный процесс 1С 8.3 с 32-битным сервером 1С 7.7 и избежать ошибки 0x80004002, настроим системный суррогатный процесс dllhost.exe в службах компонентов Windows:
mmc comexp.msc /32
1C77_Surrogate) и выберем режим Серверное приложение (Server Application).1cv7.exe или 1cv7s.exe).USR1CV8).Поскольку V77.Application инициализирует элементы пользовательского интерфейса, служба сервера 1С (Session 0) может аварийно завершать вызов, если отсутствуют специальные каталоги системного профиля. Создадим их вручную:
C:\Windows\System32\config\systemprofile\Desktop
C:\Windows\SysWOW64\config\systemprofile\Desktop
Desktop предоставим полные права доступа (Full Control) сервисному пользователю сервера 1С (например, USR1CV8) и группе SYSTEM (Система).Если настройка COM-соединения на стороне 64-битного сервера вызывает сложности со стабильностью, рассмотрим альтернативные варианты интеграции:
&НаКлиенте и запустим 32-битный тонкий или толстый клиент 1С:Предприятия 8.3. В 32-битном клиенте обращение к V77.Application работает без настройки суррогатных процессов.COMОбъект("ADODB.Connection") или механизма платформы ВнешниеИсточникиДанных./M для выгрузки данных в файлы формата XML, JSON или DBF с последующей загрузкой на стороне 1С 8.3.