В процессе интеграции нескольких информационных баз 1С мы часто сталкиваемся с необходимостью прямого обращения к данным через механизм COM-соединения. Одной из самых распространенных проблем при этом является ошибка "Класс не зарегистрирован" или "Не удалось создать объект v83.COMConnector", особенно при работе на 64-разрядных серверных операционных системах. В данной статье мы подробно разберем, как правильно настроить среду для работы COM, настроить права доступа и реализовать программный код для надежного соединения.
Проанализируем ситуацию: платформа 1С поставляется в разных вариантах разрядности. Большинство современных серверов 1С работают в 64-битном режиме, в то время как компонента comcntr.dll (которая и является тем самым v83.COMConnector) требует специфической регистрации в операционной системе для взаимодействия между процессами разной разрядности. Когда 64-битный процесс сервера 1С пытается вызвать 32-битную библиотеку или наоборот без соответствующей настройки COM+, система Windows блокирует это действие, выдавая ошибку о незарегистрированном классе.
Рассмотрим по шагам процесс создания обертки для COM-соединителя, который позволит серверу 1С корректно обращаться к библиотеке:
dcomcnfg).Консоль управления - Службы компонентов - Компьютеры - Мой компьютер - Приложения COM+.Создать - Приложение.1C_COM_Connector.dllhost.exe.Компоненты созданного приложения и добавим новую компоненту. Выберем "Установка новых компонентов" и укажем путь к файлу comcntr.dll. Обычно он находится в папке C:\Program Files\1cv8\номер_платформы\bin\.После выполнения этих действий библиотека станет доступна для вызова из процессов любой разрядности, так как Windows будет использовать промежуточный прокси-процесс.
Теперь разберем, как написать код на языке 1С для инициализации соединения. Нам необходимо создать объект V83.COMConnector и вызвать метод Connect. Посмотрим на пример реализации функции, которая возвращает объект соединения:
Функция УстановитьСоединениеСБазой(ИмяСервера, ИмяБазы, Логин, Пароль) Экспорт
Результат = Новый Структура("Объект, Ошибка", Неопределено, "");
ПараметрыСоединения = "Srvr=""" + ИмяСервера + """;Ref=""" + ИмяБазы + """;Usr=""" + Логин + """;Pwd=""" + Пароль + """;";
Попытка
COMСоединитель = Новый COMОбъект("V83.COMConnector");
Результат.Объект = COMСоединитель.Connect(ПараметрыСоединения);
Исключение
Результат.Ошибка = "Не удалось подключиться: " + ОписаниеОшибки();
КонецПопытки;
Возврат Результат;
КонецФункции
В данном коде мы используем метод Connect, который возвращает так называемое "внешнее соединение". Важно помнить, что при использовании COMConnector в вызываемой базе не запускается визуальный интерфейс, а создается облегченный сеанс, что значительно экономит ресурсы сервера и ускоряет работу.
Проанализируем, как работать с полученным объектом. После успешного вызова Connect нам доступны практически все экспортные методы глобального модуля внешней базы, а также возможность выполнять запросы и обращаться к менеджерам объектов. Разберем пример получения остатков товара из внешней базы:
Процедура ПолучитьДанныеИзВнешнейБазы(Соединение)
// Выполним запрос во внешней базе
Запрос = Соединение.NewObject("Query");
Запрос.Text =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура.Наименование КАК Имя,
| ТоварыНаСкладахОстатки.В НаличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";
Выборка = Запрос.Execute().Select();
Пока Выборка.Next() Цикл
Сообщить("Товар: " + Выборка.Имя + " | Количество: " + Строка(Выборка.Остаток));
КонецЦикла;
КонецПроцедуры
Обратите внимание на использование метода NewObject. Мы не можем использовать стандартный оператор Новый для создания объектов внутри внешней базы, поэтому обращаемся к фабрике объектов через установленное соединение.
При работе с COM-соединением следует учитывать несколько критически важных моментов, которые помогут избежать утечек памяти и блокировок:
Соединение = Неопределено;.XML или JSON.Разберем ситуацию, когда необходимо передать ссылку. Поскольку ссылки одной базы не имеют смысла в другой, мы используем уникальный идентификатор (GUID). Посмотрим, как это реализовать:
// В вызывающей базе
Идентификатор = Строка(СсылкаНаОбъект.УникальныйИдентификатор());
ВнешняяСсылка = Соединение.Справочники.Номенклатура.GetRef(Соединение.NewObject("UUID", Идентификатор));
Если Не ВнешняяСсылка.IsEmpty() Тогда
// Объект найден во внешней базе, можем с ним работать
КонецЕсли;
Таким образом, мы обеспечиваем связь между идентичными объектами в разных информационных системах, используя UUID как надежный мост.
Мы рассмотрели комплексный подход к настройке и использованию v83.COMConnector. Основной успех заключается в правильной административной настройке приложения COM+ в Windows, что снимает большинство проблем с регистрацией библиотеки. Программное взаимодействие требует внимательности к типам данных и управлению памятью, но остается одним из самых быстрых способов обмена информацией между базами 1С в рамках одной локальной сети.