Как организовать COM-соединение между базами 1С и передать данные: от первого шага до настройки среды

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

Интеграция различных баз данных 1С — это классическая задача, с которой рано или поздно сталкивается любой разработчик. В данной статье мы подробно разберем, как наладить связь между самописной конфигурацией и типовым решением (например, 1С:ERP 2.4) через технологию COM. Мы пройдем путь от первой строки кода до решения проблем с разрядностью и оптимизацией записи объектов.

Первый шаг: программная инициализация соединения

Для начала работы нам необходимо создать объект-соединитель, который позволит одной базе «увидеть» программную среду другой. Самый простой и эффективный способ сделать это — использовать V83.COMConnector. В отличие от V83.Application, данный метод не запускает полноценное клиентское приложение с графическим интерфейсом, что значительно экономит ресурсы сервера и ускоряет работу.

Рассмотрим базовый пример кода для подключения:


// Создаем объект-соединитель
Соединитель = Новый COMОбъект("V83.COMConnector");

// Формируем строку подключения (для файловой базы)
СтрокаПодключения = "File=""C:\Bases\ERP_Base""; Usr=""Admin""; Pwd=""123"";";

// Для серверной базы строка будет выглядеть иначе:
// СтрокаПодключения = "Srvr=""ServerName""; Ref=""BaseName""; Usr=""Admin""; Pwd=""123"";";

Попытка
    Соединение = Соединитель.Connect(СтрокаПодключения);
    Сообщить("Соединение успешно установлено!");
Исключение
    Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;

После выполнения метода Connect() переменная Соединение становится своего рода «окном» во внешнюю базу. Через нее мы можем обращаться к менеджерам справочников, документов и вызывать экспортные процедуры модулей.

Зависимость от конфигурации и БСП

Часто возникает вопрос: имеет ли значение, на какой платформе или с использованием каких библиотек (например, БСП — Библиотека Стандартных Подсистем) написана база? Проанализируем ситуацию: COM-технология работает на уровне платформы 1С. Это значит, что если в вашей самописной базе нет БСП, это никак не ограничит возможности COM-соединения. Вам будут доступны все объекты метаданных и экспортные методы, помеченные ключевым словом Экспорт в глобальных модулях или модулях менеджеров.

Критически важные технические нюансы: регистрация компоненты и разрядность

Одной из самых частых причин ошибок типа «Класс не зарегистрирован» является проблема с библиотекой comcntr.dll. Разберем по шагам, как обеспечить стабильную работу:

  1. Регистрация библиотеки: Библиотека должна быть зарегистрирована в операционной системе. Это делается через командную строку от имени администратора: regsvr32 "C:\Program Files\1cv8\8.3.X.XXXX\bin\comcntr.dll".
  2. Разрядность (32 vs 64 бита): Это «камень преткновения» для многих. Если ваш сервер 1С работает в 64-битном режиме, а COM-объект вызывается в фоновом задании, то и библиотека comcntr.dll должна быть доступна в 64-битной версии. Важно, чтобы вызывающее приложение и библиотека имели одинаковую разрядность. Если базы находятся на разных серверах, проверьте соответствие версий платформы.
  3. Операционная система: Помните, что COM — это технология Windows. Если ваш сервер 1С работает под управлением Linux, использовать COMConnector не получится. В таком случае стоит рассмотреть переход на HTTP-сервисы.

Передача данных: работа с типами и ссылками

Проанализируем типичную ошибку новичков: попытку передать ссылку на объект напрямую. Важно понимать, что ссылка из внешней базы — это не то же самое, что ссылка во внутренней базе. Это разные адресные пространства.

Правильная схема обмена данными:

Посмотрим на пример создания документа в ERP из внешней базы:


// В базе-источнике получаем строковое представление GUID
Идентификатор = Строка(ДокументОбъект.УникальныйИдентификатор());

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

Если СсылкаВERP.Пустая() Тогда
    НовыйДок = Соединение.Документы.СписаниеНаРасходы.СоздатьДокумент();
    // Заполняем реквизиты, передавая примитивные типы
    НовыйДок.Дата = ТекущаяДата();
    НовыйДок.Комментарий = "Передано из самописной базы через COM";
    
    // Важный момент для ERP: режим загрузки
    НовыйДок.ОбменДанными.Загрузка = Истина;
    
    НовыйДок.Записать();
КонецЕсли;

Оптимизация и лицензирование

Работа через COM требует внимательного отношения к ресурсам. Каждое активное соединение занимает одну сеансовую лицензию 1С. Чтобы избежать дефицита лицензий, мы рекомендуем:

  1. Явно закрывать соединение: После завершения цикла обмена обязательно обнуляйте переменную: Соединение = Неопределено;. Это позволит платформе корректно завершить сеанс во внешней базе.
  2. Использовать режим «Загрузка = Истина»: При записи объектов в ERP (как показано в примере выше) установка Объект.ОбменДанными.Загрузка = Истина отключает тяжелые проверки и подписки на события. Это критично для производительности, так как через COM выполнение кода в разы медленнее, чем внутри базы.

Альтернативы: когда COM становится «тесен»

Несмотря на то что COM-соединение — это проверенный временем инструмент, у него есть современные альтернативы. Если вам необходимо связать ERP с другими системами или вы планируете масштабировать решение, рассмотрите следующие варианты:

Подводя итог, можно сказать: для разовых задач или простых кнопок «Передать в ERP» внутри закрытой Windows-сети COM-соединение остается отличным и быстрым в реализации инструментом. Главное — следить за разрядностью и не забывать освобождать лицензии после работы.

← На главную