При реализации межбазового обмена данными через COM-соединение разработчики иногда сталкиваются со следующей проблемой: программа полностью «зависает» на строке инициализации объекта Новый COMObject("V83.COMConnector"). При этом никаких сообщений об ошибках не выводится, а поток выполнения прекращается на неопределенное время. В данной статье разберем причины такого поведения, варианты восстановления работы COMConnector, а также обходное решение через V83.Application.
Выясним, почему процесс 1С замирает ещё до вызова метода соединения Connect:
comcntr.dll (или наоборот), система блокирует поток создания COM-объекта без выдачи исключения.USR1CV8), могут отсутствовать права на запуск и инициализацию COM-компонентов.HKEY_CLASSES_ROOT\CLSID может указывать на несуществующий или устаревший путь к comcntr.dll.1cv8.exe или rphost.exe.Рассмотрим вариант быстрого решения проблемы без правки системного реестра и настроек DCOM — использование OLE-автоматизации через V83.Application. При таком подходе запускается отдельное приложение 1С.
Важно учитывать ключевое отличие: метод Connect у V83.Application возвращает логическое значение (Истина или Ложь). Все создаваемые объекты целевой базы (например, запросы) должны создаваться непосредственно через сам объект приложения cntr, а не через результат соединения.
Проанализируем пример корректного кода для работы с V83.Application:
cntr = Новый COMObject("V83.Application");
connection = cntr.Connect("Srvr=""srv_1c83"";Ref=""Specification"";Usr=""ВнешнееСоединение"";Pwd=""ExternalConnection"";");
Если connection Тогда
// Создаем объект Запрос через основной объект cntr, а не через connection
СпецификацияЗапрос = cntr.NewObject("Query");
СпецификацияЗапрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура";
Результат = СпецификацияЗапрос.Выполнить();
КонецЕсли;
Обратите внимание: Попытка вызвать connection.NewObject("Query") приведет к ошибке «Значение не является значением объектного типа (NewObject)», так как переменная connection содержит значение типа Булево.
Если для вашей задачи критично использовать именно V83.COMConnector (так как он работает быстрее и не требует запуска полноценного клиента), выполним перерегистрацию библиотеки нужной разрядности:
regsvr32 /u "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
regsvr32 "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
Примечание: Если запуск осуществляется из 32-разрядного клиента, используйте путь к папке Program Files (x86).
При работе на 64-разрядном сервере 1С для предотвращения падений и зависаний рекомендуется вынести comcntr.dll в отдельный изолированный процесс dllhost.exe:
comexp.msc).comcntr.dll из каталога нужной версии 1С.Разберем современные механизмы интеграции, которые не зависят от COM-технологий и разрядности ОС: