Подключение внешних компонент в фоновом задании
Однажды, мне потребовалось подключить внешнюю компоненту обмена с кассами UniUNS так, чтобы этот обмен выполнялся в фоновом задании.
И я был неприятно удивлен, узнав, что в серверном контексте внешние компоненты (разработанные именно по технологии AddIn - не путать с COM) не так и просто подключить.
В итоге я нашел прием, который мне тогда помог. И вот сейчас решил поделиться им с міром (чтобы знания не пропали). Может еще кому пригодится?
Прием заключается в следующем.
Сам dll-файл с внешней компонентой нужно положить в папку "%APPDATA%\1C\1Cv8\ExtCompT" того пользователя, под которым запущен 1С-сервер (у меня это "C:\Users\USR1CV8\AppData\Roaming\1C\1cv8\ExtCompT").
А подключение компоненты выполнять вот таким способом:
Попытка // На клиенте подключаем внешнюю компоненту по ее ProgID. // И создаем объект по ProgID. Если ПодключитьВнешнююКомпоненту("AddIn.UniUNSDLL") Тогда Попытка UniUNSDLL = Новый("AddIn.UniUNSDLL"); Исключение Информация = ИнформацияОбОшибке(); ВызватьИсключение " Не удалось создать объект AddIn.UniUNSDLL по причине: " + Символы.ПС + ?(Информация.Причина=Неопределено,Информация.Описание,Информация.Причина.Описание); КонецПопытки; // На сервере (если не удалось подключить компоненту по ProgID) нужно подключать внешнюю компоненту из dll-файла, // который предварительно положить в "C:\Users\USR1CV8\AppData\Roaming\1C\1cv8\ExtCompT\" ("%APPDATA%\1C\1Cv8\ExtCompT\"). // И при создании объекта нужно в ProgID вставить присвоенное при подключении имя компоненты ("UniUNS"). ИначеЕсли ПодключитьВнешнююКомпоненту("UniUNS.dll", "UniUNS") Тогда Попытка UniUNSDLL = Новый("AddIn.UniUNS.UniUNSDLL"); Исключение Информация = ИнформацияОбОшибке(); ВызватьИсключение " Не удалось создать объект AddIn.UniUNS.UniUNSDLL по причине: " + Символы.ПС + ?(Информация.Причина=Неопределено,Информация.Описание,Информация.Причина.Описание); КонецПопытки; Иначе ВызватьИсключение " Не удалось подключить внешнюю компоненту ""AddIn.UniUNSDLL"" (UniUNS.dll)."; КонецЕсли; Исключение Информация = ИнформацияОбОшибке(); ВызватьИсключение "Компонента UniUNS.DLL НЕ загружена по причине: " + Символы.ПС + ?(Информация.Причина=Неопределено,Информация.Описание,Информация.Причина.Описание); КонецПопытки;