При организации интеграции между современными версиями 1С:Предприятия 8 и устаревшей платформой 1С:Предприятие 7.7 разработчики часто сталкиваются с ошибками инициализации COM-соединения. Особенно остро проблема проявляется при выполнении серверного кода в управляемых формах.
Рассмотрим типовой пример вызова, который приводит к ошибке:
&НаСервере
Функция Подключиться1С77()
Ошибки = 0;
МонопольныйРежимOLE = "";
ЗапускБезЗаставки = 1;
База = Новый COMОбъект("V77.Application");
СтрокаПодключения = "/D""" + СокрЛП(Объект.ПутьКБазе) + """ /N""" + СокрЛП(Объект.Логин) + """ /P""" + СокрЛП(Объект.Пароль) + """";
РезультатПодключения = База.Initialize(База.RMAccount, СтрокаПодключения, ?(ЗапускБезЗаставки = 1, "NO_SPLASH_SHOW", ""));
КонецФункции
В момент выполнения строки создания объекта Новый COMОбъект("V77.Application") система аварийно завершает вызов с сообщением: -2147467262(0x80004002): Интерфейс не поддерживается (E_NOINTERFACE). Проанализируем ключевые причины возникновения этого сбоя и пошагово разберем методы его решения.
Код ошибки 0x80004002 означает, что запрошенный интерфейс OLE Automation не может быть получен клиентским процессом. В контексте взаимодействия 1С:Предприятия 8 и 7.7 это происходит по ряду взаимосвязанных причин:
rphost.exe выполняется от имени отдельного системного пользователя (например, usr1cv8), у которого отсутствуют права на запуск и активацию COM-компонентов 7.7.BIN копированием в системном реестре Windows отсутствуют необходимые классы и интерфейсы OLE.V77.Application не всегда корректно сопоставляется с установленным типом лицензии платформы 7.7.Разберем базовое решение, предложенное в обсуждении. Если служба сервера 1С работает под ограниченной учетной записью, необходимо явно предоставить ей права на запуск и доступ к объектам 1С 7.7 через системную оснастку.
Win + R, введем команду dcomcnfg и нажмем клавишу Enter;V77.GeneralPropPage, V77.SalaryPropPage, а также при наличии сам класс 1CV7 Application (или V77.Application)..\usr1cv8). Предоставим ей полные права на локальный запуск, локальную активацию и локальный доступ.Если DCOM-компоненты отсутствуют в списке или регистрация повреждена, выполним принудительную перерегистрацию исполняемых файлов платформы 7.7. Разберем порядок действий:
cmd.exe обязательно от имени Администратора.BIN) и выполним команду регистрации ключа COM-сервера:
1cv7.exe /regserver
Для комплексной SQL-версии платформы используем соответствующий исполняемый файл:
1cv7s.exe /regserver
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1Cv77\BIN\frame.dll"
Когда рабочий процесс сервера 1С 8 (rphost.exe) имеет 64-разрядную архитектуру, прямая инициализация 32-битного COM-сервера невозможна и вызывает системную ошибку интерфейса. Рассмотрим, как изолировать 1С 7.7 в отдельном 32-битном суррогатном процессе dllhost.exe:
dcomcnfg и перейдем в Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.1Cv77_Surrogate.dllhost.exe.Иногда ошибка вызвана тем, что общий идентификатор V77.Application не может автоматически инициализировать конкретную конфигурацию. Попробуем явно указать ProgID под тип вашей лицензии 7.7:
V77S.Application — SQL-версия платформы;V77M.Application — сетевая (многопользовательская) версия;V77L.Application — локальная версия;V1CEnterprise.Application — независимый системный идентификатор.Также проанализируем архитектуру вызова. Если серверная настройка DCOM затруднена политиками безопасности, наиболее простым и надежным выходом будет перенос точки интеграции на клиентскую сторону:
&НаКлиенте
Процедура ВыполнитьПодключение()
// На 32-битном клиенте 1С создание объекта происходит штатно
Попытка
База = Новый COMОбъект("V77.Application");
СтрокаПодключения = "/D""" + Объект.ПутьКБазе + """ /N""" + Объект.Логин + """ /P""" + Объект.Пароль + """";
Если База.Initialize(База.RMAccount, СтрокаПодключения, "NO_SPLASH_SHOW") Тогда
// Извлекаем необходимые данные и отправляем их на сервер структурами или массивами
МассивДанных = ПолучитьДанныеИз77(База);
ЗаписатьДанныеНаСервере(МассивДанных);
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Исполнение кода на стороне 32-разрядного клиента минует ограничения неинтерактивной службы Windows (Session 0) и решает проблему несовпадения разрядностей без сложного конфигурирования серверов COM+.