При организации взаимодействия между двумя информационными базами 1С:Предприятие 8.3 через механизм COM-соединения разработчики часто сталкиваются с ситуацией, когда серверные части баз работают на разных релизах платформы. В данной статье мы подробно разберем, насколько критично совпадение версий, какие ошибки возникают при несоответствии и как технически реализовать стабильное соединение, если обновить платформу до единого релиза невозможно.
Рассмотрим стандартную ситуацию: из одной клиент-серверной базы (база-инициатор) нам необходимо подключиться к другой серверной базе (база-приемник). Для этого в коде 1С мы создаем объект COMОбъект("V83.ComConnector"). В этот момент операционная система Windows обращается к реестру, находит ветку с идентификатором V83.ComConnector и загружает соответствующую библиотеку comcntr.dll.
Проанализируем основную проблему: в системном реестре Windows под одним именем (ProgID) может быть зарегистрирована только одна версия библиотеки. Обычно это версия того релиза 1С, который был установлен последним. Если на сервере-инициаторе установлена платформа 8.3.20.1500, а база-приемник работает на релизе 8.3.15.1830, стандартный вызов коннектора может привести к ошибке несоответствия версий или ошибке формата потока. Система требует, чтобы версия comcntr.dll на стороне клиента (или сервера, выполняющего код) точно соответствовала версии платформы, работающей на стороне сервера целевой базы.
Это наиболее надежный и профессиональный способ решения задачи. Разберем по шагам, как настроить "обертку" для COM-объекта, которая позволит использовать конкретную версию comcntr.dll независимо от того, что зарегистрировано в реестре системы по умолчанию.
Суть метода заключается в создании приложения в консоли "Службы компонентов" (Component Services). Это позволяет запускать COM-объект в отдельном процессе dllhost.exe, что решает не только проблему версий, но и проблему разрядности (например, когда 64-битный сервер 1С должен вызвать 32-битную компоненту).
1C_ComConnector_8_3_15.comcntr.dll конкретного релиза 1С (например, из папки C:\Program Files\1cv8\8.3.15.1830\bin\).Теперь при обращении к V83.ComConnector система будет использовать изолированную версию компоненты. Если нам нужно поддерживать несколько разных соединений, мы можем создать несколько приложений COM+ с разными именами и обращаться к ним через их CLSID.
Рассмотрим другой подход, который часто применяется в скриптах или внешних обработках. Мы можем программно перерегистрировать нужную нам библиотеку в реестре непосредственно перед созданием COM-объекта. Проанализируем пример кода:
// Путь к нужной версии библиотеки
ПутьКDLL = "C:\Program Files\1cv8\8.3.15.1830\bin\comcntr.dll";
// Регистрация компоненты в системе через regsvr32
КомандаСистемы = "regsvr32 /s """ + ПутьКDLL + """";
ЗапуститьПриложение(КомандаСистемы, , Истина);
// Создание объекта после регистрации
Попытка
Соединитель = Новый COMОбъект("V83.ComConnector");
// Установка соединения...
Исключение
Сообщить("Не удалось создать COM-соединитель: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: для выполнения команды regsvr32 требуются права администратора в операционной системе. Если код выполняется на стороне сервера 1С, учетная запись службы 1С должна обладать соответствующими правами на запись в ветку реестра HKEY_CLASSES_ROOT. Также стоит учитывать, что при параллельной работе нескольких сеансов, требующих разные версии, этот метод может вызвать конфликты, так как регистрация в реестре является глобальной для всей ОС.
Выясним причину, почему иногда советуют использовать V83.Application вместо V83.ComConnector. Объект V83.Application запускает полноценный экземпляр приложения 1С (в невидимом режиме). Это менее требовательно к версии зарегистрированной DLL, так как управление берет на себя исполняемый файл 1cv8.exe.
Однако у этого метода есть существенные недостатки:
Проанализируем ситуацию в долгосрочной перспективе. Многие эксперты рекомендуют полностью отказаться от COM-технологий в пользу современных HTTP-сервисов. Рассмотрим почему:
comcntr.dll подвержена утечкам памяти и может "зависать" в процессах, что требует периодической перезагрузки сервера. HTTP-сервисы работают через веб-серверы (IIS, Apache), которые эффективно управляют пулом соединений.Подводя итог, ответим на вопрос автора: да, совпадение версий (вплоть до билда) крайне желательно для стандартного способа подключения. Если же версии различаются, придерживайтесь следующего алгоритма:
1. Если базы находятся в одной локальной сети и обновление невозможно — используйте настройку через COM+ (Component Services). Это изолирует библиотеку и позволит работать процессам с разной разрядностью.
2. Если вам нужно разовое подключение и у службы 1С есть права администратора — используйте динамическую регистрацию DLL через regsvr32.
3. В новых проектах старайтесь закладывать архитектуру на базе HTTP-сервисов. Это избавит вас от необходимости администрирования реестра Windows и обеспечит легкое масштабирование системы в будущем.
Помните, что при использовании COMОбъект важно всегда закрывать соединение и обнулять переменные, чтобы избежать блокировок сеансов в базе-приемнике. Для этого в конце работы используйте конструкцию:
Соединение = Неопределено;
Это инициирует корректное завершение внешнего соединения и освобождение ресурсов платформы.