При организации интеграции между информационными базами различных поколений платформы 1С:Предприятие разработчики часто сталкиваются с нестандартным поведением системы. Типичная задача — программно подключиться из конфигурации на платформе 8.2 к файловой базе 8.3 через механизм COMОбъект и прочитать данные.
Рассмотрим стандартный программный код, который обычно используется для такого подключения:
COMПодключение = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "File=""D:\Temp\РесурсыПредприятия"";Usr=""Администратор"";";
COMОбъект = COMПодключение.Connect(СтрокаПодключения);
В процессе выполнения этого сценария на шаге вызова метода Connect() платформа 8.2 может внезапно завершить работу аварийно (падение процесса без генерации программного исключения 1С). При этом конструкция Попытка — Исключение не срабатывает, так как падение происходит на уровне операционной системы и ядра библиотек Windows. Разберем по шагам, почему возникает эта ошибка и как восстановить стабильную работу обмена.
Проанализируем архитектурные особенности работы внутрипроцессного COM-сервера (In-Process COM Server):
V83.COMConnector инстанцируется с помощью библиотеки comcntr.dll. Данная DLL загружает в адресное пространство вызывающего процесса 1cv8.exe зависимые библиотеки платформы 8.3 (например, core83.dll, backbas.dll и другие модули). Если вызывающий процесс 8.2 уже загрузил в память собственные версии библиотек ядра, возникает коллизия символов, адресных пространств и сред выполнения Microsoft Visual C++ Runtime (CRT). В результате процесс получает ошибку нарушения доступа к памяти (Access Violation 0xC0000005) и мгновенно падает.backbas.dll).comcntr.dll в свое адресное пространство и наоборот.Наиболее частой причиной падения является повреждение файлов ядра или конфликт версий после «грязного» обновления. Выполним правильную переустановку платформы:
backbas*.*, core83.dll и comcntr.dll. При необходимости удалим оставшиеся подпапки версий вручную.
regsvr32 "C:\Program Files (x86)\1cv8\8.3.X.XXXX\bin\comcntr.dll"
(где вместо 8.3.X.XXXX укажем номер установленного релиза).Если на одном компьютере критически важно одновременно использовать процессы разных версий 1С, лучшим и самым надежным решением является вынос V83.COMConnector в отдельный изолированный процесс операционной системы (OutOfProcess COM Server через dllhost.exe). В этом случае процесс 8.2 не загружает библиотеки 8.3 в свою память, а взаимодействует с ними через межпроцессный маршалинг.
Разберем настройку приложения COM+ по шагам:
dcomcnfg и нажмем Enter для открытия консоли «Службы компонентов».1C_V83_COM) и обязательно выберем режим Серверное приложение (Server Application).C:\Program Files (x86)\1cv8\8.3.X.XXXX\bin\comcntr.dll.После этой настройки вызовы объекта V83.COMConnector будут перенаправляться в системный процесс-суррогат, что полностью исключит аварийные сбои и падения платформы-источника.
Если настройка COM-коннектора вызывает сложности или ограничения безопасности, проанализируем альтернативные надежные способы обмена между базами 8.2 и 8.3:
COMПодключение = Новый COMОбъект("V83.Application");
СтрокаПодключения = "File=""D:\Temp\РесурсыПредприятия"";Usr=""Администратор"";";
COMПодключение.Connect(СтрокаПодключения);
В отличие от COMConnector, объект V83.Application запускает полноценный отдельный экземпляр 1cv8.exe, поэтому библиотеки платформ физически изолированы друг от друга.
HTTPСоединение, получая данные в формате JSON или XML.