Интеграция различных информационных баз 1С — это классическая задача для любого разработчика. Одним из исторически популярных, но капризных инструментов для этого является COM-соединение (OLE). На практике программисты часто сталкиваются с неочевидным поведением системы, зависанием процессов или системными ошибками Windows вроде «Класс не зарегистрирован». В этой статье мы подробно разберем все тонкости настройки COM-подключения, исправим частые ошибки в коде и рассмотрим, как правильно зарегистрировать необходимые библиотеки в операционной системе.
Начнем анализ с первой ключевой проблемы, с которой часто сталкиваются разработчики при использовании объекта V83.Application. При попытке выполнить метод Connect() система возвращает логическое значение (Истина или Ложь), а не ссылку на саму базу данных.
Рассмотрим эту разницу подробнее. Объект V83.Application предназначен для полноценного запуска клиентского приложения 1С. Когда мы пишем код подключения, результатом работы метода является булево значение успешности авторизации:
// ОШИБКА: Base1С получит значение Истина, а не объект базы!
Base1С = V82COMConnector.Connect("File=""C:\DB"";Usr=""Администратор"";");
// Данный вызов вызовет ошибку "Значение не является значением объектного типа"
СсылкаНаОбъект = Base1С.Справочники.Номенклатура.НайтиПоКоду("00000010000");
Если мы используем V83.Application, все дальнейшие обращения к метаданным внешней базы нужно делать не через переменную результата подключения, а через первоначальный COM-объект, который мы создали через конструктор Новый COMОбъект. Посмотрим на пример правильной реализации:
&НаСервере
Процедура ПодключитьсяЧерезApplication()
V83App = Новый COMОбъект("V83.Application");
Попытка
ПодключениеУспешно = V83App.Connect("File=""C:\Base1C"";Usr=""User"";Pwd=""Pass"";");
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Если ПодключениеУспешно Тогда
// Обращаемся напрямую к объекту приложения V83App, а не к результату Connect!
// Внимание: обязательно используем множественное число "Справочники"
СсылкаНоменклатура = V83App.Справочники.Номенклатура.НайтиПоКоду("00000010000");
Если ЗначениеЗаполнено(СсылкаНоменклатура) Тогда
Сообщить("Успешно найдено: " + СсылкаНоменклатура.Наименование);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный нюанс: при использовании V83.Application на компьютере физически запускается полноценный сеанс 1С со всем его интерфейсом. Это расходует большое количество оперативной памяти, работает медленно и требует обязательного вызова метода V83App.Quit() в конце работы, иначе процесс 1cv8.exe навсегда зависнет в диспетчере задач.
Для оптимизации работы, ускорения обмена данными и исключения визуального открытия окон программы следует использовать легковесный объект V83.COMConnector. Он не запускает графический интерфейс платформы, а работает в фоновом режиме, напрямую обращаясь к серверной или файловой СУБД внешней базы.
Разберем по шагам, как правильно написать код для подключения через V83.COMConnector. Обратите внимание, что в отличие от Application, метод Connect() здесь возвращает именно объектную ссылку на внешнюю информационную базу:
&НаСервере
Процедура ВыполнитьПодключениечерезCOMConnector()
// Создаем экземпляр COM-коннектора
Connector = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "File=""C:\Base1C"";Usr=""Администратор"";Pwd=""Пароль"";";
Попытка
// Метод Connect возвращает саму внешнюю базу, а не логическое Истина!
ВнешняяБаза = Connector.Connect(СтрокаПодключения);
Исключение
Сообщить("Ошибка соединения с информационной базой: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Теперь мы можем работать напрямую с объектом ВнешняяБаза
СсылкаНаНоменклатуру = ВнешняяБаза.Справочники.Номенклатура.НайтиПоКоду("00000010000");
Если ВнешняяБаза.ЗначениеЗаполнено(СсылкаНаНоменклатуру) Тогда
Сообщить("Элемент найден во внешней базе успешно!");
Иначе
Сообщить("Номенклатура с таким кодом отсутствует.");
КонецЕсли;
// Очищаем соединение, чтобы освободить память на сервере
ВнешняяБаза = Неопределено;
Connector = Неопределено;
КонецПроцедуры
Обратите внимание на конструкцию ВнешняяБаза.ЗначениеЗаполнено(...). Метод ЗначениеЗаполнено() является методом локальной платформы. Чтобы проверить заполненность ссылки, полученной из другой базы, мы должны вызывать этот метод через контекст внешнего соединения.
Часто при попытке создать объект Новый COMОбъект("V83.COMConnector") программисты сталкиваются с системным сбоем: «Класс не зарегистрирован. Ошибка -2147221164(0x80040154)». Это означает, что операционная система Windows не знает, к какой динамической библиотеке обратиться при вызове этого программного идентификатора.
Для исправления этой ошибки разберем два основных шага.
Библиотека comcntr.dll поставляется вместе с платформой 1С:Предприятие и лежит в папке установленной версии. Чтобы зарегистрировать её в реестре Windows, выполним следующие действия:
DllRegisterServer завершится ошибкой.regsvr32 "C:\Program Files\1cv8\8.3.15.1830\bin\comcntr.dll"
Если вы зарегистрировали библиотеку, но при запуске кода &НаСервере ошибка «Класс не зарегистрирован» повторяется, мы имеем дело с несовпадением разрядности процессов.
Проанализируем ситуацию: серверная служба 1С (процесс rphost.exe) на современных серверах практически всегда является 64-разрядной. Если на сервере установлена 32-разрядная платформа 1С, то библиотека comcntr.dll будет 32-битной. Процесс rphost.exe физически не может загрузить 32-битную DLL напрямую в свое адресное пространство. Также возможна и обратная ситуация.
Решить эту проблему можно с помощью настройки обертки COM+ в Windows, которая запустит библиотеку в изолированном системном процессе dllhost.exe:
dcomcnfg и нажмите Enter. Откроется оснастка «Службы компонентов».V83_COMConnector. В параметрах способа активации обязательно укажите «Серверное приложение» (это заставит Windows запускать dll в отдельном хост-процессе).USR1CV8) или администратора сети.comcntr.dll нужной вам версии платформы 1С.После проведения данных настроек вызовы V83.COMConnector на сервере начнут перенаправляться через системный мост Windows, и проблема разрядности будет полностью решена.
Несмотря на то, что COM-соединения остаются рабочим инструментом, в современной практике разработки они считаются устаревшими. COM жестко привязан к операционной системе Windows (не работает на Linux-серверах), крайне чувствителен к несовпадению версий платформы 1С у баз-партнеров и сильно нагружает оперативную память сервера.
Если вы проектируете интеграцию сегодня, рекомендуем рассмотреть более надежные веб-технологии:
HTTPСоединение. Это работает мгновенно, кроссплатформенно и безопасно.