При сопровождении баз данных на платформе 1С:Предприятие 7.7 разработчики и системные администраторы нередко сталкиваются с ситуацией, когда сторонняя внешняя компонента (например, mod.dll для подсистемы МОД — Модуль Обмена Данными) успешно регистрируется в операционной системе через regsvr32, метод ЗагрузитьВнешнююКомпоненту() отрабатывает без ошибок и возвращает 1, однако следующая за ним строка инициализации падает с критической ошибкой:
{Обработка.ОбменДанными.Форма.Модуль(289)}: Неудачная попытка создания объекта (AddIn.MOD)
Разберем детально, почему возникает подобное поведение платформы, как локализовать источник проблемы и какие шаги необходимо предпринять для восстановления корректной работы компонентов обмена.
Чтобы понять причину сбоя, проанализируем последовательность действий платформы при работе со сторонними библиотеками. В типовом сценарии вызов компоненты выглядит следующим образом:
Файл = "d:\base\MOD.dll";
Рез = ЗагрузитьВнешнююКомпоненту(Файл);
Если Рез <> 1 Тогда
Сообщить("Ошибка загрузки компоненты " + Файл + " - дальнейшая работа невозможна!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
ОбъектМОД = СоздатьОбъект("AddIn.MOD");
Функция ЗагрузитьВнешнююКомпоненту() отвечает за физическую загрузку динамической библиотеки в адресное пространство процесса 1cv7s.exe (или 1cv7.exe) и регистрацию интерфейсов компоненты во внутренней таблице диспетчера 1С. Метод СоздатьОбъект() с префиксом AddIn. обращается к фабрике классов загруженной библиотеки для создания экземпляра объекта и получения интерфейсов IInitDone и ILanguageExtender.
Если первая команда возвращает единицу, а вторая выдает ошибку, это свидетельствует об одной из следующих системных коллизий:
AddIn.dll, V7RaM.dll и MOD.dll) имеют в своем составе одинаковые внутренние CLSID. При попытке инициализации диспетчер обращается к фабрике классов ранее загруженной библиотеки, которая не знает ProgID AddIn.MOD.BIN), а затем в каталоге информационной базы. Если в системе зарегистрирована одна версия DLL (например, из каталога базы), а в BIN лежит другая сборка или дубль, вызовы инициализации могут быть заблокированы.%WinDir%\SysWOW64\regsvr32.exe. Кроме того, при работе под непривилегированными учетными записями срабатывает механизм VirtualStore, создающий дубли записей в ветке HKEY_CURRENT_USER\Software\Classes, перекрывающие общие системные настройки.Если в пустой или тестовой информационной базе тестовый запуск проходит успешно, а в рабочей конфигурации падает, значит, в процессе запуска рабочей базы в глобальном модуле (процедура ПриНачалеРаботыСистемы) уже была загружена конфликтная внешняя компонента.
Выполним проверку и выясним, какие именно компоненты подключаются при старте системы. Обратите особое внимание на наличие библиотек с типовыми именами (например, AddIn.dll). Если в конфигурации подключена AddIn.dll, выгрузка или отключение этой компоненты перед загрузкой MOD.dll восстанавливает создание объекта AddIn.MOD.
Для гарантированного устранения конфликта применим следующие варианты организации кода:
ЗагрузитьВнешнююКомпоненту("MOD.dll") в самое начало процедуры ПриНачалеРаботыСистемы — до инициализации всех остальных сторонних библиотек.V77.Application), где подключается только нужная библиотека.Разберем по шагам правильную процедуру перерегистрации библиотеки MOD.dll, исключающую влияние дубликатов и системных перенаправлений:
MOD.dll по всем локальным и сетевым дискам. Удалим все найденные дубликаты из каталогов информационных баз, системных папок и временных директорий.MOD.dll в каталог исполняемых файлов платформы (по умолчанию: C:\Program Files (x86)\1Cv77\BIN\).
%WinDir%\SysWOW64\regsvr32.exe /u "C:\Program Files (x86)\1Cv77\BIN\MOD.dll"
regedit и выполним поиск по ключам AddIn.MOD, AddIn.MOD.1 и имени файла MOD.dll. Очистим найденные записи в разделах:
HKEY_CLASSES_ROOTHKEY_LOCAL_MACHINE\SOFTWARE\ClassesHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ClassesHKEY_CURRENT_USER\Software\ClassesHKEY_CURRENT_USER\Software\Classes\VirtualStoreBIN:
%WinDir%\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1Cv77\BIN\MOD.dll"
Проанализируем параметры безопасности операционной системы, которые могут препятствовать созданию COM-объекта:
BIN и самого файла библиотеки.1cv7s.exe в список исключений DEP.После устранения конфликтующих загрузок DLL в коде конфигурации и приведения регистрации к единому файлу в каталоге BIN инстанцирование объекта СоздатьОбъект("AddIn.MOD") будет выполняться стабильно во всех сеансах пользователей.