Как настроить COM-подключение к базе 1С при несовпадении версий платформы без переустановки клиентов?

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

Проанализируем распространенную ситуацию: в организации функционирует клиент-серверная база на определенном релизе платформы (например, «Управление торговлей 10.3» с парком в десятки рабочих станций), а файловая база («Бухгалтерия предприятия 3.0») на компьютере отдельного пользователя была обновлена до более свежей версии платформы 1С. При попытке настроить прямое программное взаимодействие через V83.COMConnector возникает ошибка несовпадения версий библиотеки comcntr.dll. Переустанавливать платформу на всем парке машин ради одной интеграции нецелесообразно. Рассмотрим подробнее, почему возникает эта коллизия и как обойти проблему с помощью системных средств Windows и альтернативных подходов.

Причины возникновения ошибки несовпадения версий comcntr.dll

Выясним причину такого поведения операционной системы и платформы. При регистрации библиотеки comcntr.dll с помощью системной утилиты regsvr32 в реестре Windows перезаписывается стандартный программный идентификатор ProgID V83.COMConnector. Он начинает указывать на ту версию платформы, библиотека которой регистрировалась последней. Платформа 1С не умеет в рамках стандартного вызова автоматически определять требуемую версию DLL для удаляющейся или подключаемой базы данных.

Кроме того, при классическом создании COM-соединения библиотека загружается как внутрипроцессный сервер (In-process COM) непосредственно в адресное пространство процесса, инициировавшего вызов. Если соединение выполняется на стороне 64-разрядного сервера 1С, а вызывается 32-битная библиотека (или наоборот), операция прерывается из-за несовместимости архитектур. Также важно помнить: прямое обращение к файловой информационной базе через COM фактически открывает базу локально на той машине, где исполняется программный код. Если на ней установлена платформа, не соответствующая структуре таблиц базы данных, возникнут ошибки доступа и блокировки.

Решение 1. Изоляция нужной версии через приложение COM+ (Службы компонентов)

Разберем основной и самый надежный способ совместного использования нескольких версий библиотек на одной машине — создание выделенного серверного приложения COM+ в оснастке «Службы компонентов» Windows.

Разберем по шагам порядок настройки:

  1. Установим на компьютере, где выполняется код подключения, обе версии платформы «1С:Предприятие» — текущую серверную и требуемую для подключаемой базы.
  2. Откроем оснастку Службы компонентов (выполнив команду dcomcnfg в окне «Выполнить»).
  3. Перейдем по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  4. Создадим новое приложение: нажмем правой кнопкой мыши на ветку Приложения COM+, выберем Создать -> Приложение. В мастере установки выберем «Установить новое приложение», зададим понятное имя (например, 1C_V83_CustomVersion).
  5. На шаге выбора способа активации обязательно выберем Серверное приложение (Server application). Это критически важная настройка: библиотека запустится в отдельном процессе-суррогате dllhost.exe, что предотвратит падение вызывающего процесса и снимет конфликт разрядностей (32 и 64 бит).
  6. На шаге «Удостоверение» (Identity) укажем учетную запись конкретного пользователя Windows с правами администратора или выделим специального системного пользователя. По умолчанию там установлен «Интерактивный пользователь», из-за чего вызовы из регламентных заданий или службы сервера 1С будут аварийно завершаться. У выбранной учетной записи должны быть полные сетевые права на каталог с файловой базой.
  7. В созданном приложении развернем ветку Компоненты, нажмем Создать -> Компонент, выберем «Установка новых компонентов» и укажем путь к comcntr.dll из каталога bin нужного релиза платформы.
  8. В свойствах добавленного компонента перейдем на вкладку параметров и переопределим или зафиксируем уникальный ProgID, чтобы вызывать конкретно эту сборку в коде 1С.

Посмотрим на пример вызова компонента в коде, если для него зарегистрирован отдельный идентификатор:


// Создание COM-объекта с использованием уникального ProgID приложения COM+
Попытка
    КомСоединитель = Новый COMОбъект("V83.COMConnector.Custom");
    УстановитьПодключение(КомСоединитель);
Исключение
    ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурнала.Ошибка, , , ОписаниеОшибки());
    ВызватьИсключение;
КонецПопытки;

Решение 2. Создание COM-объекта на удаленном компьютере

Проанализируем ситуацию, когда настройка COM+ на центральном сервере нежелательна, но целевая платформа уже развернута на клиентском компьютере (например, на ноутбуке бухгалтера). Конструктор объекта COMОбъект платформы 1С поддерживает второй параметр — сетевое имя удаленного компьютера (DCOM):


ИмяКомпьютера = "NOTEBOOK-BUH";
Попытка
    // Инициализация объекта на удаленной машине, где зарегистрирована нужная DLL
    КомСоединитель = Новый COMОбъект("V83.ComConnector", ИмяКомпьютера);
    СтрокаПодключения = "File=""C:\Bases\Accounting""; Usr=""Admin""; Pwd=""Secret"";";
    Соединение = КомСоединитель.Connect(СтрокаПодключения);
Исключение
    Сообщить("Не удалось инициировать COM-соединение: " + ОписаниеОшибки());
КонецПопытки;

Для корректной работы этого механизма служба DCOM на целевом компьютере должна быть настроена: пользователь, под которым инициируется подключение (например, служба USR1CV8 сервера 1С), обязан иметь права на удаленный запуск и активацию компонентов в оснастке dcomcnfg.

Решение 3. Использование OLE Automation (объект Application)

Если требуется временное решение без тонких манипуляций со службами компонентов COM+, можно использовать запуск полноценного приложения вместо урезанного соединителя. Разберем нюансы:


Попытка
    // Запуск через Automation Server
    Приложение = Новый COMОбъект("V83.Application");
    Приложение.Connect("File=""C:\Bases\Accounting""; Usr=""Admin""; Pwd=""Secret"";");
    
    // Выполнение требуемых операций
    Результат = Приложение.Справочники.Номенклатура.НайтиПоКоду("00000001");
Исключение
    Сообщить("Ошибка соединения через Application: " + ОписаниеОшибки());
КонецПопытки;

Обратим внимание на ограничения данного метода: V83.Application запускает полноценное клиентское приложение с графической подсистемой. Это требует существенно больше оперативной памяти, расходует отдельную клиентскую лицензию и работает медленнее, чем легковесный COMConnector. Однако в критических ситуациях это позволяет быстро восстановить обмен без перерегистрации библиотек.

Современные альтернативы прямому COM-соединению

Технология COM-соединений является устаревающей платформенной зависимостью, жестко привязанной к ОС Windows и разрядностям процессов. В современной архитектуре 1С рекомендуется переводить интеграции на стабильные протоколы:

  1. Публикация OData (REST): Файловая база публикуется на веб-сервере (IIS или Apache). База-источник отправляет HTTP-запросы (GET, POST), взаимодействуя со стандартным интерфейсом без конфликтов версий платформы.
  2. HTTP-сервисы: Разработка легковесных API внутри конфигурации, где данные передаются в формате JSON. Запросы выполняются встроенными средствами платформы через объект HTTPСоединение.
  3. Штатный обмен EnterpriseData: Настройка регулярного файлового обмена через сетевую папку или FTP с помощью планов обмена.
  4. Пакетный запуск 1cv8.exe: Запуск фонового процесса с ключами /Execute и /F, что гарантирует старт именно нужного исполняемого файла платформы без конфликта системных библиотек.
← На главную