Как подключиться к базе 1С 7.7 из 64-битной SQL-базы 1С 8 и исправить ошибку No such interface supported

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

При интеграции устаревших конфигураций на платформе 1С:Предприятие 7.7 с современными системами на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются со специфическими системными ошибками. Типичный сценарий: при попытке подключения из файловой базы 1С 8 соединение устанавливается без проблем, но при переносе аналогичного кода на серверную (SQL) базу 1С 8 возникает критическая ошибка инициализации COM-объекта.

В этой статье мы подробно разберем причины возникновения ошибки 0x80004002: No such interface supported, проанализируем системные ограничения разрядности и рассмотрим несколько надежных способов решения этой проблемы: от настройки служб компонентов Windows (COM+) до конфигурирования прав доступа и кучи рабочего стола (Desktop Heap).

Выясняем причину: почему возникает ошибка 0x80004002?

Давайте проанализируем ситуацию. Исходный код инициализации подключения к 1С 7.7 выглядит стандартно:


Функция ПолучитьСоединение_1С_77(ПроверкаПодключения = Истина, Авто = Ложь) Экспорт
    Попытка
        ПутьКБазе    = Путь_1С_77;
        Пользователь = Логин_1С_77;
        Пароль       = Пароль_1С_77;
        
        База77 = Новый COMОбъект("V77S.Application");
        СтрокаПодключения = "/D""" + СокрЛП(ПутьКБазе) + """ /N"""+СокрЛП(Пользователь) + """ /P""" + СокрЛП(Пароль)+"""";        
        РезультатПодключения = База77.Initialize(База77.RMTrade,СтрокаПодключения, "NO_SPLASH_SHOW");
        
        Если ПроверкаПодключения Тогда
            Возврат "Соединение прошло успешно";
        Иначе
            Возврат База77;
        КонецЕсли;            
    Исключение
        Возврат ОписаниеОшибки();
    КонецПопытки;      
КонецФункции

Когда данный код выполняется на стороне клиента (который, как правило, является 32-разрядным), подключение проходит успешно. Однако при выполнении на сервере (в контексте фонового задания или серверного вызова) система выдает ошибку:

Ошибка при вызове конструктора (COMОбъект): -2147467262(0x80004002): No such interface supported

Причина кроется в конфликте разрядностей. Современные сервера 1С:Предприятие 8 функционируют в 64-битной архитектуре (процесс rphost.exe имеет разрядность x64). Платформа 1С:Предприятие 7.7 является исключительно 32-битным приложением, и ее OLE-сервер V77S.Application (или V77.Application) зарегистрирован в операционной системе как 32-битный COM-объект.

Операционная система Windows по соображениям безопасности и архитектурных ограничений не позволяет 64-битному процессу напрямую загружать 32-битные динамические библиотеки (DLL) или напрямую взаимодействовать с 32-битными COM-интерфейсами без специального посредника (маршаллинга). Именно при попытке сопоставить интерфейсы x64 и x32 Windows возвращает ошибку «Интерфейс не поддерживается».

Рассмотрим по шагам основные и наиболее эффективные методы преодоления этой архитектурной преграды.

Способ 1. Настройка служб компонентов Windows (COM+) — рекомендуемое системное решение

Для того чтобы подружить 64-битный сервер 1С 8 с 32-битным COM-объектом 1С 7.7, лучше всего использовать встроенный механизм операционной системы Windows — Службы компонентов (COM+). Этот инструмент позволяет запустить 32-битный COM-объект внутри специального системного суррогатного процесса dllhost.exe, который выступит в роли моста между x64 и x32.

Выполним пошагово настройку службы компонентов:

  1. Нажмите сочетание клавиш Win + R, введите команду dcomcnfg и нажмите Enter для запуска панели управления службами компонентов.
  2. Перейдите по дереву каталогов: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Щелкните правой кнопкой мыши по разделу Приложения COM+, выберите в контекстном меню Создать -> Приложение.
  4. В открывшемся мастере создания нажмите кнопку Далее, затем выберите вариант Создать новое приложение.
  5. Введите понятное имя для нового приложения, например, 1C77_Bridge. В качестве способа активации обязательно выберите пункт Серверное приложение (это заставит объект запускаться в изолированном процессе dllhost.exe). Нажмите Далее.
  6. На следующем шаге (Удостоверение) выберите учетную запись, под которой будет выполняться это приложение. Рекомендуется указать пользователя, под которым работает служба сервера 1С:Предприятие 8 (по умолчанию это локальный пользователь USR1CV8), либо доменного пользователя с административными правами. Укажите пароль учетной записи.
  7. Завершите работу мастера, нажимая кнопки Далее и Готово.
  8. Теперь откройте ветку созданного приложения 1C77_Bridge, перейдите к папке Компоненты. Щелкните по ней правой кнопкой мыши и выберите Создать -> Компонент.
  9. В мастере импорта компонентов выберите вариант Импорт уже зарегистрированных компонентов.
  10. Установите флажок 32-разрядные компоненты (32-bit). Найдите в списке компоненты с именами V77.Application, V77S.Application или V77M.Application (в зависимости от используемой версии 1С 7.7), выделите их и нажмите Далее, а затем Готово.

После проведения данной настройки 64-битный процесс сервера 1С сможет успешно вызывать Новый COMОбъект("V77S.Application"). Операционная система автоматически создаст 32-битный экземпляр dllhost.exe под учетной записью USR1CV8 и организует надежный обмен данными.

Способ 2. Решение проблемы с зависанием процессов 1С 7.7 (Настройка Desktop Heap)

Даже после успешной настройки COM+ вы можете столкнуться со следующей проблемой: процесс 1С 7.7 (1cv7s.exe) запускается на сервере в неинтерактивном сеансе (под пользователем службы), но периодически «зависает» в памяти в диспетчере задач, блокируя последующие сеансы обмена. Приходится использовать утилиту taskkill или принудительно завершать процессы.

Это происходит из-за ограничений графической кучи Windows (Desktop Heap). При запуске OLE-сервера ядро 1С 7.7 все равно пытается инициализировать свои визуальные интерфейсы, библиотеки отрисовки окон и шрифтов. Для неинтерактивных сеансов (в которых работают службы) лимит графической памяти по умолчанию сильно урезан.

Разберем, как исправить эту проблему через реестр Windows:

  1. Запустите редактор реестра: нажмите Win + R, введите команду regedit и нажмите Enter.
  2. Перейдите к следующему системному разделу:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems
  3. В правой части окна найдите мультистроковый параметр с именем Windows. Дважды щелкните по нему для редактирования.
  4. В открывшейся строке найдите фрагмент, начинающийся со слова SharedSection=. Обычно он выглядит так:
    SharedSection=1024,20480,768
  5. Нас интересует третье число в этом списке (в примере это 768). Оно определяет размер графической кучи для неинтерактивных сессий в килобайтах. Увеличьте это значение до 2048 или 4096 (в зависимости от интенсивности обменов). Строка должна принять вид:
    SharedSection=1024,20480,4096
  6. Нажмите кнопку ОК для сохранения изменений.
  7. Внимание: Для вступления изменений в силу обязательно перезагрузите операционную систему сервера.

Увеличение размера кучи рабочего стола полностью решает проблему «молчаливого» зависания фоновых процессов 1С 7.7 при их инициализации из-под системных учетных записей.

Способ 3. Перенос выполнения логики на сторону клиента (&НаКлиенте)

Проанализируем архитектуру вашего решения. Если обмен данными или загрузка запускаются интерактивно пользователем (например, через обработку «Загрузка данных из 1С 7.7»), то выполнять код на сервере вовсе не обязательно.

Достаточно перенести логику подключения на сторону клиента. Поскольку клиентское приложение 1С:Предприятие 8 (тонкий или толстый клиент) в большинстве случаев запускается как 32-разрядное приложение непосредственно на рабочей станции пользователя, оно без проблем и дополнительных настроек COM+ инициализирует COM-объект 1С 7.7.

Для этого в модуле формы или команды используйте директиву компиляции &НаКлиенте:


&НаКлиенте
Процедура ВыполнитьПодключениеНаКлиенте()
    Попытка
        База77 = Новый COMОбъект("V77S.Application");
        // Выполняем подключение и чтение данных напрямую на ПК пользователя
    Исключение
        Предупреждение("Ошибка подключения: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Этот способ позволяет избежать сложных манипуляций с правами доступа и реестром на промышленном сервере баз данных, если бизнес-логика допускает выполнение обмена на компьютере конечного пользователя.

Способ 4. Архитектурный обходной путь через промежуточную базу 1С 8

Если на боевом сервере категорически запрещено менять настройки COM+ и реестра (например, из-за строгих требований безопасности хостинг-провайдера), можно воспользоваться обходным решением, которое применил автор обсуждения.

Суть метода заключается в создании промежуточной файловой базы 1С 8, которая выступает в роли шлюза:

  1. Основная SQL-база 1С:Управление торговлей 11 через стандартный COM-объект 1С 8 (V83.COMConnector) подключается к промежуточной файловой базе 1С 8.
  2. Поскольку файловое соединение может быть инициировано в нужном контексте окружения, промежуточная база без труда создает экземпляр V77S.Application и вытягивает необходимые данные из 1С 7.7.
  3. Промежуточная база передает полученные данные обратно в основную SQL-базу.

При использовании этого метода важно правильно зарегистрировать пути к базам 1С 7.7 в реестре под учетной записью службы сервера 1С. Для этого под пользователем USR1CV8 (или другим пользователем службы) необходимо запустить импорт файлов реестра .reg с прописанными путями к базам 1С 7.7, а также предоставить данной учетной записи полные права (чтение, запись, изменение) на каталог с базой данных 1С 7.7 и исполняемыми файлами платформы.

Резюме и рекомендации

Мы подробно проанализировали системную ошибку при работе с COM-объектами в гетерогенной среде разрядностей. Подведем итоги:

← На главную