При программном взаимодействии приложений на .NET с платформой 1С через COM-интерфейс разработчики часто сталкиваются со сбоем на этапе вызова метода ConnectAgent. В Visual Studio такое исключение обычно сопровождается сообщением: "В результате вызова компонента COM возвращена ошибка в формате HRESULT E_FAIL" (числовой код ошибки -2147467259 или в шестнадцатеричном виде 0x80004005).
Рассмотрев типичный пример подключения C#-кода к серверу 1С, проанализируем основные причины этой неисправности и шаги по её устранению.
Рассмотрим стандартный фрагмент кода C#, в котором создается объект V83.COMConnector и выполняется попытка подключения к агенту сервера 1С:
V83.COMConnector ComConnector = new V83.COMConnector();
V83.IServerAgentConnection Agent = ComConnector.ConnectAgent("192.168.0.105");
Попытки передавать адрес в различных форматах (с указанием портов 1540, 1541 или протокола tcp://) не дают результата, если проблема кроется в несоответствии компонентов окружения или настроек операционной системы.
Как показывает практика, наиболее частой причиной ошибки HRESULT E_FAIL является несоответствие версии библиотеки comcntr.dll, зарегистрированной в реестре Windows, и версии платформы, запущенной на сервере 1С.
Важно учитывать, что платформа 1С крайне чувствительна к релизу компоненты. Ошибка возникает не только при разнице между главными версиями (например, 8.2 и 8.3), но и при минимальном расхождении сборки (например, когда на сервере 1С установлен релиз 8.3.22.1923, а в системе зарегистрирована библиотечная компонента версии 8.3.22.1709).
Для решения проблемы выполним следующие шаги:
comcntr.dll соответствующего релиза в операционной системе.Второе узкое место — это разрядность исполняемого C#-процесса и ветка реестра Windows, в которой зарегистрирован COM-объект. Под операционной системой x64 32-битные и 64-битные компоненты регистрируются в разных разделах системного реестра.
Разберем порядок перерегистрации библиотеки comcntr.dll в зависимости от целевой архитектуры проекта:
1. Для 32-битного C#-приложения (x86):
Запустим командную строку от имени Администратора и выполним регистрацию через утилиту из каталога SysWOW64:
C:\Windows\SysWOW64\regsvr32.exe /u "C:\Program Files (x86)\1cv8\8.3.X.X\bin\comcntr.dll"
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.X.X\bin\comcntr.dll"
2. Для 64-битного C#-приложения (x64):
Используем утилиту регистрации из папки System32:
C:\Windows\System32\regsvr32.exe /u "C:\Program Files\1cv8\8.3.X.X\bin\comcntr.dll"
C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.X.X\bin\comcntr.dll"
В настройках проекта Visual Studio (в свойствах Platform target) рекомендуется строго задать архитектуру x86 или x64, отключив флаг Prefer 32-bit, чтобы разрядность процесса четко совпадала с зарегистрированной компонентой.
Если версии совпадают и разрядность настроена верно, но ошибка HRESULT E_FAIL сохраняется, проанализируем следующие варианты:
dcomcnfg («Службы компонентов»).1540 используется агентом сервера по умолчанию, порт 1541 — менеджером кластера, а диапазон 1560–1591 — рабочими процессами.При работе с V83.COMConnector в .NET сборщик мусора (Garbage Collector) не управляет COM-ссылками автоматически. Чтобы избежать зависания неиспользуемых сеансов на сервере 1С и утечек памяти, обязательно освобождаем ресурсы в блоке finally:
if (Agent != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(Agent);
}
if (ComConnector != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ComConnector);
}
Таким образом, для успешного устранения ошибки HRESULT E_FAIL первоочередной задачей является приведение к абсолютному совпадению версий библиотеки comcntr.dll и сервера 1С, а также корректная регистрация компоненты с учетом разрядности C#-приложения.