Как настроить COM-соединение в 1С 8.3 и решить проблему разрядности?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе интеграции нескольких информационных баз 1С мы часто сталкиваемся с необходимостью прямого обращения к данным через механизм COM-соединения. Одной из самых распространенных проблем при этом является ошибка "Класс не зарегистрирован" или "Не удалось создать объект v83.COMConnector", особенно при работе на 64-разрядных серверных операционных системах. В данной статье мы подробно разберем, как правильно настроить среду для работы COM, настроить права доступа и реализовать программный код для надежного соединения.

Выясним причину возникновения ошибки

Проанализируем ситуацию: платформа 1С поставляется в разных вариантах разрядности. Большинство современных серверов 1С работают в 64-битном режиме, в то время как компонента comcntr.dll (которая и является тем самым v83.COMConnector) требует специфической регистрации в операционной системе для взаимодействия между процессами разной разрядности. Когда 64-битный процесс сервера 1С пытается вызвать 32-битную библиотеку или наоборот без соответствующей настройки COM+, система Windows блокирует это действие, выдавая ошибку о незарегистрированном классе.

Настройка компоненты через Службу компонентов (DCOM)

Рассмотрим по шагам процесс создания обертки для COM-соединителя, который позволит серверу 1С корректно обращаться к библиотеке:

  1. Откроем оснастку Службы компонентов (в командной строке введем dcomcnfg).
  2. Перейдем в раздел Консоль управления - Службы компонентов - Компьютеры - Мой компьютер - Приложения COM+.
  3. Создадим новое приложение, выбрав в контекстном меню Создать - Приложение.
  4. В мастере установки выберем "Создать новое пустое приложение". Присвоим ему понятное имя, например, 1C_COM_Connector.
  5. Важный этап: установим способ активации как "Серверное приложение". Это позволит запускать компоненту в отдельном процессе dllhost.exe.
  6. В качестве учетной записи для запуска укажем пользователя, под которым работает служба сервера 1С, либо специально созданного системного пользователя с достаточными правами.
  7. После создания приложения зайдем в ветку Компоненты созданного приложения и добавим новую компоненту. Выберем "Установка новых компонентов" и укажем путь к файлу 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-соединением следует учитывать несколько критически важных моментов, которые помогут избежать утечек памяти и блокировок:

Разберем ситуацию, когда необходимо передать ссылку. Поскольку ссылки одной базы не имеют смысла в другой, мы используем уникальный идентификатор (GUID). Посмотрим, как это реализовать:


// В вызывающей базе
Идентификатор = Строка(СсылкаНаОбъект.УникальныйИдентификатор());
ВнешняяСсылка = Соединение.Справочники.Номенклатура.GetRef(Соединение.NewObject("UUID", Идентификатор));

Если Не ВнешняяСсылка.IsEmpty() Тогда
    // Объект найден во внешней базе, можем с ним работать
КонецЕсли;

Таким образом, мы обеспечиваем связь между идентичными объектами в разных информационных системах, используя UUID как надежный мост.

Заключение

Мы рассмотрели комплексный подход к настройке и использованию v83.COMConnector. Основной успех заключается в правильной административной настройке приложения COM+ в Windows, что снимает большинство проблем с регистрацией библиотеки. Программное взаимодействие требует внимательности к типам данных и управлению памятью, но остается одним из самых быстрых способов обмена информацией между базами 1С в рамках одной локальной сети.

← На главную