При интеграции устаревших конфигураций на платформе 1С:Предприятие 7.7 с современными системами на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются со специфическими системными ошибками. Типичный сценарий: при попытке подключения из файловой базы 1С 8 соединение устанавливается без проблем, но при переносе аналогичного кода на серверную (SQL) базу 1С 8 возникает критическая ошибка инициализации COM-объекта.
В этой статье мы подробно разберем причины возникновения ошибки 0x80004002: No such interface supported, проанализируем системные ограничения разрядности и рассмотрим несколько надежных способов решения этой проблемы: от настройки служб компонентов Windows (COM+) до конфигурирования прав доступа и кучи рабочего стола (Desktop Heap).
Давайте проанализируем ситуацию. Исходный код инициализации подключения к 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 возвращает ошибку «Интерфейс не поддерживается».
Рассмотрим по шагам основные и наиболее эффективные методы преодоления этой архитектурной преграды.
Для того чтобы подружить 64-битный сервер 1С 8 с 32-битным COM-объектом 1С 7.7, лучше всего использовать встроенный механизм операционной системы Windows — Службы компонентов (COM+). Этот инструмент позволяет запустить 32-битный COM-объект внутри специального системного суррогатного процесса dllhost.exe, который выступит в роли моста между x64 и x32.
Выполним пошагово настройку службы компонентов:
dcomcnfg и нажмите Enter для запуска панели управления службами компонентов.Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.Приложения COM+, выберите в контекстном меню Создать -> Приложение.Далее, затем выберите вариант Создать новое приложение.dllhost.exe). Нажмите Далее.USR1CV8), либо доменного пользователя с административными правами. Укажите пароль учетной записи.Далее и Готово.1C77_Bridge, перейдите к папке Компоненты. Щелкните по ней правой кнопкой мыши и выберите Создать -> Компонент.V77.Application, V77S.Application или V77M.Application (в зависимости от используемой версии 1С 7.7), выделите их и нажмите Далее, а затем Готово.После проведения данной настройки 64-битный процесс сервера 1С сможет успешно вызывать Новый COMОбъект("V77S.Application"). Операционная система автоматически создаст 32-битный экземпляр dllhost.exe под учетной записью USR1CV8 и организует надежный обмен данными.
Даже после успешной настройки COM+ вы можете столкнуться со следующей проблемой: процесс 1С 7.7 (1cv7s.exe) запускается на сервере в неинтерактивном сеансе (под пользователем службы), но периодически «зависает» в памяти в диспетчере задач, блокируя последующие сеансы обмена. Приходится использовать утилиту taskkill или принудительно завершать процессы.
Это происходит из-за ограничений графической кучи Windows (Desktop Heap). При запуске OLE-сервера ядро 1С 7.7 все равно пытается инициализировать свои визуальные интерфейсы, библиотеки отрисовки окон и шрифтов. Для неинтерактивных сеансов (в которых работают службы) лимит графической памяти по умолчанию сильно урезан.
Разберем, как исправить эту проблему через реестр Windows:
regedit и нажмите Enter.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystemsWindows. Дважды щелкните по нему для редактирования.SharedSection=. Обычно он выглядит так:
SharedSection=1024,20480,768768). Оно определяет размер графической кучи для неинтерактивных сессий в килобайтах. Увеличьте это значение до 2048 или 4096 (в зависимости от интенсивности обменов). Строка должна принять вид:
SharedSection=1024,20480,4096ОК для сохранения изменений.Увеличение размера кучи рабочего стола полностью решает проблему «молчаливого» зависания фоновых процессов 1С 7.7 при их инициализации из-под системных учетных записей.
Проанализируем архитектуру вашего решения. Если обмен данными или загрузка запускаются интерактивно пользователем (например, через обработку «Загрузка данных из 1С 7.7»), то выполнять код на сервере вовсе не обязательно.
Достаточно перенести логику подключения на сторону клиента. Поскольку клиентское приложение 1С:Предприятие 8 (тонкий или толстый клиент) в большинстве случаев запускается как 32-разрядное приложение непосредственно на рабочей станции пользователя, оно без проблем и дополнительных настроек COM+ инициализирует COM-объект 1С 7.7.
Для этого в модуле формы или команды используйте директиву компиляции &НаКлиенте:
&НаКлиенте
Процедура ВыполнитьПодключениеНаКлиенте()
Попытка
База77 = Новый COMОбъект("V77S.Application");
// Выполняем подключение и чтение данных напрямую на ПК пользователя
Исключение
Предупреждение("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот способ позволяет избежать сложных манипуляций с правами доступа и реестром на промышленном сервере баз данных, если бизнес-логика допускает выполнение обмена на компьютере конечного пользователя.
Если на боевом сервере категорически запрещено менять настройки COM+ и реестра (например, из-за строгих требований безопасности хостинг-провайдера), можно воспользоваться обходным решением, которое применил автор обсуждения.
Суть метода заключается в создании промежуточной файловой базы 1С 8, которая выступает в роли шлюза:
V83.COMConnector) подключается к промежуточной файловой базе 1С 8.V77S.Application и вытягивает необходимые данные из 1С 7.7.При использовании этого метода важно правильно зарегистрировать пути к базам 1С 7.7 в реестре под учетной записью службы сервера 1С. Для этого под пользователем USR1CV8 (или другим пользователем службы) необходимо запустить импорт файлов реестра .reg с прописанными путями к базам 1С 7.7, а также предоставить данной учетной записи полные права (чтение, запись, изменение) на каталог с базой данных 1С 7.7 и исполняемыми файлами платформы.
Мы подробно проанализировали системную ошибку при работе с COM-объектами в гетерогенной среде разрядностей. Подведем итоги:
0x80004002 — попытка 64-битного серверного процесса 1С 8 вызвать 32-битный OLE-сервер 1С 7.7.