При организации интеграции между различными информационными базами 1С с помощью COM-соединения разработчики нередко сталкиваются с внезапным аварийным закрытием программы (APPCRASH). При этом в журнале событий Windows или в окне ошибки фиксируется сбой модуля backbas.dll с кодом исключения c0000005 (Access Violation — нарушение прав доступа при обращении к памяти).
Проанализируем ситуацию, выясним точную причину возникновения данной ошибки и рассмотрим подробнее пошаговые методы её устранения.
Посмотрим на ключевые строки отчета об ошибке:
Имя приложения: 1cv8.exe (версия 8.2.19.130)
Имя модуля с ошибкой: backbas.dll (версия 8.3.9.1818)
Код исключения: c0000005
Главная причина кроется в конфликте версий библиотек в рамках одного процесса. Запущенный клиент платформы 1С:Предприятие 8.2 пытается инициализировать COM-соединитель, но в реестре операционной системы в качестве обработчика COM зарегистрирована библиотека comcntr.dll от платформы 8.3. В результате процесс 1cv8.exe версии 8.2 загружает в свое адресное пространство ядро backbas.dll версии 8.3. Разные поколения платформ не могут сосуществовать в памяти одного 32-битного процесса из-за несовместимости структур данных, что моментально приводит к аварийному завершению работы приложения.
Разберем основные варианты решения этой проблемы.
Если на рабочем месте или сервере не требуется одновременная работа с внешними вызовами обеих платформ, достаточно перерегистрировать COM-соединитель целевой версии в операционной системе.
cmd.exe) от имени администратора.
regsvr32 /u "C:\Program Files (x86)\1cv8\8.3.9.1818\bin\comcntr.dll"
regsvr32 "C:\Program Files (x86)\1cv82\8.2.19.130\bin\comcntr.dll"
regsvr32 "C:\Program Files (x86)\1cv8\8.3.9.1818\bin\comcntr.dll"
Обратите внимание: если используется 64-разрядная версия Windows, а платформа 1С 32-разрядная, вызов утилиты регистрации должен производиться через 32-битный интерпретатор C:\Windows\SysWOW64\regsvr32.exe.
Если на одном компьютере необходимо обеспечить одновременную работу баз на платформе 8.2 и 8.3, либо при несовпадении разрядностей приложений (32 и 64 бита), наилучшим решением является вынос COM-соединителя в отдельный системный процесс dllhost.exe.
Win + R, введем dcomcnfg и нажмем Enter).1C_V83_COMConnector) и укажем способ активации Серверное приложение.comcntr.dll нужной версии платформы (например, из папки bin релиза 8.3).Благодаря этому шагу библиотеки платформы 8.3 будут загружаться в изолированном адресном пространстве процесса dllhost.exe, и конфликт с backbas.dll в основном процессе клиента 8.2 будет полностью исключен.
Убедимся, что в программном коде 1С инициализируется именно тот ProgID, который соответствует целевой информационной базе:
Для подключения к базе на платформе 8.2:
Попытка
COMКоннектор = Новый COMОбъект("V82.COMConnector");
ПараметрыПодключения = "Srvr=""ServerName"";Ref=""Base82"";Usr=""Admin"";Pwd=""Password"";";
Соединение = COMКоннектор.Connect(ПараметрыПодключения);
Исключение
Сообщить("Ошибка подключения к базе 8.2: " + ОписаниеОшибки());
КонецПопытки;
Для подключения к базе на платформе 8.3:
Попытка
COMКоннектор = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = "Srvr=""ServerName"";Ref=""Base83"";Usr=""Admin"";Pwd=""Password"";";
Соединение = COMКоннектор.Connect(ПараметрыПодключения);
Исключение
Сообщить("Ошибка подключения к базе 8.3: " + ОписаниеОшибки());
КонецПопытки;
Если специфика инфраструктуры не позволяет стабильно поддерживать COM-соединения, рассмотрим альтернативные методы интеграции:
V82.Application или V83.Application. В отличие от коннектора, сервер автоматизации запускает полноценный изолированный процесс 1cv8.exe, что предотвращает конфликт DLL. Однако данный способ требует больше системных ресурсов и расходует дополнительную клиентскую лицензию.