Как исправить ошибку «-2147467262(0x80004002): Интерфейс не поддерживается» при COM-подключении из 1С 8 к 1С 7.7?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При организации интеграции между современными версиями 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 это происходит по ряду взаимосвязанных причин:

  1. Недостаток прав DCOM у пользователя службы: процесс rphost.exe выполняется от имени отдельного системного пользователя (например, usr1cv8), у которого отсутствуют права на запуск и активацию COM-компонентов 7.7.
  2. Несовпадение разрядности платформ: платформа 1С 7.7 является исключительно 32-битным приложением (x86). Если сервер 1С 8 функционирует в 64-разрядном режиме (x64), он не может напрямую загрузить 32-битные библиотеки без промежуточного суррогата.
  3. Отсутствие корректной регистрации компонентов: при переносе папки BIN копированием в системном реестре Windows отсутствуют необходимые классы и интерфейсы OLE.
  4. Неподходящий ProgID: универсальный идентификатор V77.Application не всегда корректно сопоставляется с установленным типом лицензии платформы 7.7.

Способ 1. Настройка прав доступа в DCOMCNFG

Разберем базовое решение, предложенное в обсуждении. Если служба сервера 1С работает под ограниченной учетной записью, необходимо явно предоставить ей права на запуск и доступ к объектам 1С 7.7 через системную оснастку.

  1. Откроем оснастку управления компонентами одним из способов:
    1. Нажмем комбинацию клавиш Win + R, введем команду dcomcnfg и нажмем клавишу Enter;
    2. Либо перейдем по пути: Панель управления \ Система и безопасность \ Инструменты Windows \ Службы компонентов.
  2. В дереве консоли развернем ветку: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. Найдем в списке компонентов объекты: V77.GeneralPropPage, V77.SalaryPropPage, а также при наличии сам класс 1CV7 Application (или V77.Application).
  4. Откроем свойства каждого компонента по правому клику мыши и перейдем на закладку Безопасность.
  5. В группах «Права на запуск и активацию» и «Права доступа» переключим переключатели в положение «Настроить», нажмем кнопку «Изменить» и добавим учетную запись, от имени которой стартует служба сервера 1С (например, .\usr1cv8). Предоставим ей полные права на локальный запуск, локальную активацию и локальный доступ.
  6. Перейдем на закладку Удостоверение и убедимся, что приложение запускается с правами «Интерактивный пользователь» или «Указанный пользователь» (с корректно введенным паролем), чтобы избежать ограничений фоновой сессии.

Способ 2. Корректная регистрация COM-сервера 1С 7.7

Если DCOM-компоненты отсутствуют в списке или регистрация повреждена, выполним принудительную перерегистрацию исполняемых файлов платформы 7.7. Разберем порядок действий:

  1. Запустим командную строку cmd.exe обязательно от имени Администратора.
  2. Перейдем в каталог исполняемых файлов 1С 7.7 (папка BIN) и выполним команду регистрации ключа COM-сервера: 1cv7.exe /regserver Для комплексной SQL-версии платформы используем соответствующий исполняемый файл: 1cv7s.exe /regserver
  3. Если используется 64-битная операционная система Windows Server, зарегистрируем интерфейсные библиотеки вручную через 32-разрядный загрузчик. Для этого выполним команду: C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1Cv77\BIN\frame.dll"

Способ 3. Преодоление несовместимости x64 и x86 через COM+

Когда рабочий процесс сервера 1С 8 (rphost.exe) имеет 64-разрядную архитектуру, прямая инициализация 32-битного COM-сервера невозможна и вызывает системную ошибку интерфейса. Рассмотрим, как изолировать 1С 7.7 в отдельном 32-битном суррогатном процессе dllhost.exe:

  1. Откроем оснастку dcomcnfg и перейдем в Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  2. Нажмем правой кнопкой мыши на ветку «Приложения COM+» и выберем пункт Создать -> Приложение.
  3. В мастере нажмем «Далее», выберем «Установить новое приложение» и зададим имя, например, 1Cv77_Surrogate.
  4. На шаге «Режим активации» обязательно выберем Серверное приложение (Server Application). Это заставит объект выполняться в отдельном процессе dllhost.exe.
  5. На шаге «Удостоверение» укажем пользователя с правами локального администратора, у которого также есть права на каталог с базой 1С 7.7.
  6. После создания приложения раскроем его, нажмем правой кнопкой на папку Компоненты -> Создать -> Компонент.
  7. Выберем «Импорт уже зарегистрированных компонентов» и отметим из списка классы, относящиеся к 1С 7.7.

Способ 4. Уточнение ProgID и контекст выполнения

Иногда ошибка вызвана тем, что общий идентификатор V77.Application не может автоматически инициализировать конкретную конфигурацию. Попробуем явно указать ProgID под тип вашей лицензии 7.7:

Также проанализируем архитектуру вызова. Если серверная настройка DCOM затруднена политиками безопасности, наиболее простым и надежным выходом будет перенос точки интеграции на клиентскую сторону:


&НаКлиенте
Процедура ВыполнитьПодключение()
    // На 32-битном клиенте 1С создание объекта происходит штатно
    Попытка
        База = Новый COMОбъект("V77.Application");
        СтрокаПодключения = "/D""" + Объект.ПутьКБазе + """ /N""" + Объект.Логин + """ /P""" + Объект.Пароль + """";
        Если База.Initialize(База.RMAccount, СтрокаПодключения, "NO_SPLASH_SHOW") Тогда
            // Извлекаем необходимые данные и отправляем их на сервер структурами или массивами
            МассивДанных = ПолучитьДанныеИз77(База);
            ЗаписатьДанныеНаСервере(МассивДанных);
        КонецЕсли;
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Исполнение кода на стороне 32-разрядного клиента минует ограничения неинтерактивной службы Windows (Session 0) и решает проблему несовпадения разрядностей без сложного конфигурирования серверов COM+.

← На главную