Организация прямого взаимодействия между информационными базами 1С с помощью COM-соединения является распространенным решением для оперативного обмена документами и синхронного получения данных. Однако при выходе за рамки одного сервера или единого домена Active Directory разработчики сталкиваются с рядом сетевых, системных и платформенных сложностей. Разберем по шагам, как устроен COM-обмен между разными доменами, какие ошибки возникают чаще всего и как их правильно устранить.
Проанализируем специфику передачи учетных данных при подключении. Разработчики нередко пытаются передать имя доменного пользователя Windows непосредственно в параметрах Usr и Pwd строки подключения. Это приводит к ошибке, так как параметры Usr и Pwd предназначены исключительно для внутренней аутентификации 1С:Предприятия.
Если для COM-обмена планируется использовать Windows-аутентификацию, необходимо учитывать следующие правила:
Usr и Pwd в строке подключения опускаются.usr1cv8 / ragent).Если доверительных отношений между доменами нет, наиболее надежным решением со стороны 1С является создание выделенного пользователя с аутентификацией 1С:Предприятия (логин и пароль задаются внутри конфигуратора целевой базы). В этом случае строка подключения выглядит стандартно:
СтрокаПодключения = "File=""\\10.0.13.219\ASK-BASE$""; Usr=""ОбменCOM""; Pwd=""SecretPassword123"";";
Для предоставления сетевого доступа к папке файловой базы со стороны ОС можно предварительно инициализировать сетевой сеанс к сетевому ресурсу через системную команду net use с явным указанием доменных учетных данных целевого сервера.
Рассмотрим разницу между объектами подключения. Использование объекта V83.Application инициирует полноценный запуск клиентского приложения 1С:Предприятие с графической оболочкой, расходует отдельную пользовательскую клиентскую лицензию и выполняется значительно медленнее. Для программной интеграции и синхронизации данных следует использовать легковесный внутрипроцессный COM-соединитель V83.COMConnector.
Посмотрим на пример корректной инициализации подключения:
Попытка
COMСоединитель = Новый COMОбъект("V83.COMConnector");
БазаПартнера = COMСоединитель.Connect(СтрокаПодключения);
Сообщить("Подключение успешно установлено к базе: " + БазаПартнера.СтрокаСоединенияИнформационнойБазы());
Исключение
Сообщить("Ошибка при попытке COM-соединения: " + ОписаниеОшибки());
КонецПопытки;
Одной из главных проблем COM-соединений является жесткая привязка к версии зарегистрированной в реестре Windows библиотеки comcntr.dll. Если на компьютере установлено несколько релизов платформы 1С, вызов Новый COMОбъект("V83.COMConnector") использует ту версию, которая была зарегистрирована в системе последней. Если версия COM-коннектора не совпадает с версией сервера или файловой базы, возникает ошибка несовместимости.
Разберем способы решения конфликта версий:
regsvr32 "C:\Program Files\1cv8\8.3.X.XXXX\bin\comcntr.dll"
Для 32-разрядных библиотек на 64-битной ОС регистрация выполняется через C:\Windows\SysWOW64\regsvr32.exe.dcomcnfg. Это позволяет изолировать нужную версию comcntr.dll в отдельном системном процессе dllhost.exe и обращаться к разным версиям или разрядностям платформы независимо.При подключении к файловой базе по сети (через сетевую шару SMB) часто возникает ошибка создания или чтения временного файла 1Cv8tmp.1CD. Этот файл создается динамически при входе пользователей и хранит сеансовые данные и список активных подключений.
Выясним причины и методы устранения этой ошибки:
Set-SmbServerConfiguration -EnableLeasing $false
*.1CD, *.cfl, *.lck, *.tmp в список исключений сканирования в реальном времени.1Cv8.dt) может вызывать сбои внутренней адресации платформы при создании временных файлов сеанса. Каталог файловой базы не должен содержать посторонних архивных файлов.При работе со значениями объектов внешней базы стандартная функция ЗначениеЗаполнено() текущей базы может возвращать некорректный результат или вызывать ошибку типов. Проверку заполненности необходимо выполнять через контекст полученного COM-соединения либо через методы самого объекта:
// Вариант 1: Вызов функции ЗначениеЗаполнено через контекст внешней базы
Если БазаПартнера.ЗначениеЗаполнено(COMДокумент.Контрагент) Тогда
// Обработка заполненного значения
КонецЕсли;
// Вариант 2: Использование метода Пустая() для ссылочных типов
Если Не COMДокумент.Контрагент.Пустая() Тогда
Наименование = COMДокумент.Контрагент.Наименование;
КонецЕсли;
Использование COM-соединения для междоменного и межсерверного обмена обладает архитектурными ограничениями: зависимость от версий платформы, чувствительность к стабильности сетевого канала и необходимость прямого доступа к файловой системе. При развитии инфраструктуры рекомендуется переводить подобные интеграции на HTTP-сервисы или Web-сервисы (SOAP).
Преимущества веб-сервисов перед COM:
1Cv8.1CD.