При организации интеграции между базами 1С разработчики нередко сталкиваются с ситуацией, когда COM-соединение успешно инициируется, однако любые последующие попытки вызвать методы платформы или обратиться к метаданным завершаются ошибками «Метод объекта не обнаружен» или «Поле объекта не обнаружено». Разберем по шагам, почему возникает такое поведение, как правильно обращаться к объектам и какие скрытые системные факторы приводят к аварийному завершению сеанса.
Рассмотрим фрагмент кода, который чаще всего вызывает путаницу у разработчиков:
СоединениеСБД = Новый COMОбъект("V83.Application");
Параметры = "Srvr=""" + ИмяСервера + """;Ref=""" + БазаДанных + """;Usr=""" + Пользователь + """;Pwd=""" + Пароль + """;";
Попытка
База1С = СоединениеСБД.Connect(Параметры);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Проанализируем принципиальное различие между объектами V83.Application и V83.COMConnector:
V83.COMConnector вызов метода Connect() возвращает COM-объект внешнего соединения, через который в дальнейшем выполняется вся работа с базой данных (запросы, выборки, вызовы функций).V83.Application метод Connect() возвращает значение булева типа — Истина в случае успешной авторизации или Ложь при неудаче. Сам контекст приложения остается внутри исходной переменной СоединениеСБД.Если разработчик пытается вызвать метод создания объекта через переменную База1С, система закономерно сообщает, что у типа Булево метод не обнаружен. Однако если обращение идет к переменной СоединениеСБД, а ошибка сохраняется, причина кроется глубже.
Объект V83.Application инициирует полноценный запуск клиентского приложения платформы (процесс 1cv8.exe). Это влечет за собой строгие системные требования:
V83.Application обязательно требуется свободная пользовательская лицензия. Если все лицензии заняты, клиентский процесс не может продолжить работу. Часто 1С успевает отработать метод подключения, но почти мгновенно закрывает процесс из-за ошибки лицензирования, в результате чего последующие обращения к объекту натыкаются на пустой или разрушенный COM-контекст.ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы. Если в конфигурации присутствуют модальные окна, запросы подтверждения легальности обновлений или открытие стартовых форм, OLE-сервер блокируется в ожидании реакции пользователя либо аварийно прерывает выполнение.Для устранения этой проблемы проверим наличие свободных клиентских лицензий на сервере и убедимся, что учетная запись, под которой производится подключение, не запускает блокирующие экранные формы.
Выясним причину, почему для фонового обмена данными настоятельно рекомендуется переходить на V83.COMConnector:
V83.Application запускает тяжелый процесс 1cv8.exe с графической подсистемой, потребляет сотни мегабайт оперативной памяти и расходует полноценную клиентскую лицензию.V83.COMConnector использует легковесную библиотеку comcntr.dll, работает в контексте внешнего соединения, потребляет минимум ресурсов и значительно быстрее выполняет инициализацию.Посмотрим на корректный пример использования внешнего соединения:
ПараметрыПодключения = "Srvr=""" + ИмяСервера + """;Ref=""" + БазаДанных + """;Usr=""" + Пользователь + """;Pwd=""" + Пароль + """;";
Попытка
Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect(ПараметрыПодключения);
// Создание объектов выполняется через результат метода Connect
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Номенклатура";
Результат = Запрос.Выполнить();
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;
Если при попытке переключиться на V83.COMConnector возникает ошибка несовпадения версий компоненты и core83.dll, это свидетельствует о конфликте установленных релизов платформы в реестре операционной системы. Разберем шаги по устранению этой ошибки:
comcntr.dll той версии платформы, которая является рабочей для целевой базы:
regsvr32 "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
C:\Program Files (x86)\1cv8\8.3.XX.XXXX\bin\comcntr.dll.dllhost.exe.Таким образом, при нестабильной работе V83.Application в первую очередь необходимо убедиться в доступности свободных лицензий, исключить модальные окна при старте базы, а для программного обмена данными перевести интеграцию на V83.COMConnector.