1С addin

Загрузка внешних компонент 1С: проблемы и решения

В статье описаны известные проблемы с загрузкой внешних компонент для 1С:Предприятие, и приведены способы их решения. Автор статьи: romix | Редакторы: mastervut
Последняя редакция №8 от 26.08.10 | История
URL: http://kb.mista.ru/article.php?id=419

Ключевые слова: внешняя компонента, ошибка, отсутствует, CLSID, загрузка, не загружается, объект, компонента, DLL, реестр

Загрузка внешних компонент в 1С:Предприятие версии 8

ЗагрузитьВнешнююКомпоненту(«E:\Events\Events.dll»); test = Новый(«Addin.Events»); Сообщить(test.CreateGUID());
В отличие от 7.7 необходимо указывать полный путь к DLL (или положить файл DLL в папку BIN платформы 1С:Предприятие). Вместо СоздатьОбъект(«Addin.Имя») используется Новый(«Addin.Имя»), использовать при этом ключевое слово COMОбъект не нужно.

Хранение записей о внешних компонентах в реестре Windows

Зарегистрированная внешняя компонента хранится в реестре следующим образом.
Предположим, что у нас есть внешняя компонента E:\Events\Events.dll.
В 1С мы пишем:
ЗагрузитьВнешнююКомпоненту(«e:\Events\Events.dll»); vk=СоздатьОбъект(«Addin.Events»);
Теперь зайдем в программу regedit.exe (Пуск-Выполнить-Regedit.exe).
Если регистрация прошла успешно, то в реестре мы увидим следующие записи (я сделал поиск по подстроке «AddIn.Events» в редакторе реестра regedit.exe, нажав сочетание клавиш Ctrl-F):

@=»{2E5E6B2C-EFE0-4872-9AB6-DF187B9CE397}» @=»V7 AddIn 2.0″ @=»E:\\Events\\Events.dll» @=»AddIn.Events»
Значение {2E5E6B2C-EFE0-4872-9AB6-DF187B9CE397} является уникальным для каждого OLE-объекта идентификатором (CLSID). Его должен явно задать разработчик в коде внешней компоненты.
Значение ProgID, которое в нашем случае — «AddIn.Events» также задает разработчик внешней компоненты.

Чтобы в реестре появились эти записи, необходимы права доступа

Начиная с Windows 2000, обычный пользователь не имеет прав доступа к указанным выше ветвям реестра. Нужны права или администратора, или привилегированного пользователя Windows. После первой загрузки компонента пропишет себя в реестре, и ее смогут использовать и непривилегированные пользователи Windows.

Где 1С ищет внешнюю компоненту?

Если при загрузке внешней компоненты вы не указываете полный путь, такой как E:\Events\Events.dll или сетевой путь наподобие \\ВашСервер\ПапкаГдеЛежатВК\Events.dll, то 1С ищет внешние компоненты
-относительно папки 1Cv7\BIN (КаталогПрограммы())
-относительно каталога информационной базы (КаталогИБ())

Метод ЗагрузитьВнешнююКомпоненту(), обнаружив ВК по новому пути, обновляет ее регистрацию в реестре

Это означает, например, что на терминальном сервере программист, который вошел в тестовую базу, где лежит ВК, и потом ее стер, оставит у всех пользователей запись в реестре о несуществующей ВК.
Аналогичная проблема — когда ВК по данному пути недоступна тем или иным пользователям.
А поскольку пользователи не имеют права на изменение записей в реестре, то у них перестанет загружаться и внешняя компонента.
В 1С:Предприятие 8.0 убрана возможность загрузки ВК относительно каталога ИБ.
В 7.7 же, чтобы избежать проблем, всегда убирайте ВК из каталога ИБ, и прописывайте полные пути (или складывайте DLL в общую для всех пользователей папку BIN).

Кардинальное решение проблемы — VKLoader

Имеется компонента VKLoader.dll (автор — Александр Орефков), которая позволяет решить проблемы с регистрацией компонент.
http://openconf.1cpp.ru/vk/vkloader/
Цитата:
«vkloader (далее ВК) — внешняя компонента для 1С-Предприятия 7.7, которая может загружаться без ее регистрации в реестре, и загружать другие внешние компоненты без их регистрации. Предназначена для беспроблемной загрузки внешних компонент пользователями, не имеющими прав на запись в HKCR ветку реестра.
Принцип работы основан на перехвате обращения 1С к WinAPI функциям CLSIDFromProgID и CoCreateInstance.
Также ВК решает проблему «зависания» процесса 1С в памяти при закрытии программы при использовании несовсем корректно написанных сторонних внешних компонент».
Пример использования vkloader:
ЗагрузитьВнешнююКомпоненту(«vkloader.dll»); //регистрации не требует Загрузчик = СоздатьОбъект(«ЗагрузчикВК»); Результат = Загрузчик.ЗагрузитьВК(«Events.dll», «Addin.Events=2E5E6B2C-EFE0-4872-9AB6-DF187B9CE397»);
Замечу, что сама vkloader «умеет» загружать себя без прав доступа к реестру.

Еще одно решение: RegsvrEx

Автор — AlexQC.
Регистрирует компоненты (OLE-объекты) в пользовательской ветке реестра.

http://infostart.ru/projects/index.php?id=559
Пример использования:
Попытка Объект=СоздатьОбъект(«cool.object»); Исключение ИмяДЛЛ=КаталогИБ()+»cool.ocx»; КомандаСистемы(КаталогИБ()+»regsvrex.exe /s /c «+ИмяДЛЛ); Попытка Объект=СоздатьОбъект(«cool.object»); Исключение Сообщить(«Ошибка загрузки компоненты: «+ИмяDLL,»!»); КонецПопытки; КонецПопытки;

Самая простая причина неполадок

Очень часто причиной неработоспособности любого электронного прибора является отсутствие вилки в розетке. Аналогичная ситуация возникает с внешними компонентами, поэтому при их загрузке полезно проверять, а есть ли в наличии указанный файл DLL (к сожалению, этого не делает сам движок 1С:Предприятие 7.7).
имяф=»e:\Events\Events.dll»; Если фс.СуществуетФайл(имяф)=0 Тогда Сообщить(«Файл не найден: «+имяф,»!»); КонецЕсли; Если ЗагрузитьВнешнююКомпоненту(имяф)=0 Тогда Сообщить(«Ошибка загрузки внешней компоненты: «+имяф); КонецЕсли; vk=СоздатьОбъект(«Addin.Events»);
Дополнительно:
Для старта внешней компоненты DynamicModuleServer.dll на Windows Server 2003 необходимо добавить исполняемый файл (1cv7s.exe) в исключения из механизма Windows под названием DEP (Data Execution Prevention): Control Panel -> System -> Advanced ->Performance Settings ->Data Execution Prevention
См. также:
Книга знаний: PLUGIN_VKLOADER — загрузка внешних компонент без регистрации в реестре