Решение проблем с регистрацией внешних компонент в терминале

Зачастую у программистов возникают проблемы с подключением внешних компонент (например, драйверов торгового оборудования), когда пользователи работают с 1С, подключаясь к серверу через терминал.
Это связано с некоторыми особенностями работы функции глобального контекста ПодключитьВнешнююКомпоненту().

Зачастую у программистов возникают проблемы с подключением внешних компонент (например, драйверов торгового оборудования), когда пользователи работают с 1С, подключаясь к серверу через терминал.

При этом пользователи видят, например, картинку представленную в анонсе статьи.

В то время как при работе с локальных компьютеров никаких проблем с подключением внешних компонент нет.

С чем это связано? Это связано с тем, что, когда пользователи работают через сервер терминалов, они имеют меньше прав, чем при работе на локальном компьютере.

В этом легко убедиться, если зайти на сервер терминалов под учетной записью с административными правами.

Причина такой разницы заключается в том, что 1С не может зарегистрировать внешнюю компоненту в реестре, когда пользователь работает в терминале под обычными правами, т.к. у обычного пользователя нет прав на запись в ветку системного реестра HKEY_CLASSES_ROOT.

В публикациях на тему подключения внешних компонент в терминале предлагаются самые разные методы решения этой проблемы.

Например, такие:

1. Запустить первый раз 1С под административными правами.

Этот вариант далеко не всегда срабатывает. Ниже объясню, почему.

2. Дать обычным пользователям терминала права на запись в ветку системного реестра HKEY_CLASSES_ROOT.

Недостаточно «продвинутым» пользователям лучше этого не делать, иначе могут быть проблемы.

3. С помощью различных «примочек» регистрировать ВК от имени пользователя с полными правами.

Тоже не есть хорошо.

 

Так как же все таки лучше выйти из этой ситуации?

Я предлагаю свой вариант решения этой проблемы. По моему мнению — простой и красивый, не предлагавшийся на инфостарте ранее.

Исследуя эту проблему, я задался вопросом — а зачем 1С вообще пытается зарегистрировать ВК по новому пути? Ведь она уже зарегистрирована в системе.

Дело оказалось в том, что в типовых конфигурациях 1С (например «Управление Торговлей») используется такой синтаксис метода глобального контекста ПодключитьВнешнююКомпоненту():

 

ПодключитьВнешнююКомпоненту(«Справочник.ПодключаемоеОборудование.Макет.ДрайверАТОЛСканерШтрихкода», «АТОЛСканер»);

ОбъектДрайвера = Новый («AddIn.АТОЛСканер.Scaner45»);

Как видим, ВК драйвера подключается из макета «ДрайверАТОЛСканерШтрихкода» справочника «ПодключаемоеОборудование».

Что же при этом происходит?

1С сохраняет компоненту во временной папке пользователя, например «C:Documents and SettingsUserLocal SettingsTemp1032v8_4_12.tmp»

 

и пытается зарегистрировать ее в ветке реестра HKEY_CLASSES_ROOT именно по этому пути.

На терминале у обычных пользователей нет прав на изменение этой ветки реестра, поэтому компонента у них не подключается.

Теперь о том, как выйти из этой ситуации.

Метод глобального контекста ПодключитьВнешнююКомпоненту() имеет несколько вариантов синтаксиса. Вот этим мы и воспользуемся.

Итак, по шагам:

1. Регистрируем внешнюю компоненту утилитой regsvr32.exe на сервере терминалов в папке C:WINDOWSSYSTEM32 для 32-разрядной ОС или в папке C:WINDOWSSYSWOW64 для 64-разрядной ОС.

2. Используем один из двух дополнительных вариантов синтаксиса метода ПодключитьВнешнююКомпоненту():

Вариант 1:

 

ПодключитьВнешнююКомпоненту(«C:WINDOWSSysWOW64Scaner1C.dll», «АТОЛСканер», ТипВнешнейКомпоненты.COM);

ОбъектДрайвера = Новый («AddIn.АТОЛСканер.Scaner45»);

Вариант 2:

 

ProgID = «AddIn.Scaner45»;

ПодключитьВнешнююКомпоненту(ProgID);

ОбъектДрайвера = Новый (ProgID);

 

На мой взгляд, вариант № 2 предпочтительнее.

При этом 1С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.

Ну вот собственно и все. Успехов в работе!

40 Comments

  1. Abadonna
    В то время как при работе с локальных компьютеров никаких проблем с подключением внешних компонент нет.

    Глубоко ошибаешься. В путних сетках и тут проблемы, потому что в путних сетках и локальных административных прав у юзверя быть не должно. А то они там нарегят/наинсталлируют!

    Reply
  2. icek@w
    В путних сетках и тут проблемы…

    Там и софт по минимуму, все что нужно — в терминале. 🙂

    Но, если так необходимо, то, думаю, на локальной машине данная методика также будет работать, т.о. «ложка не существует». 🙂

    Reply
  3. Abadonna

    (2)

    Там и софт по минимуму, все что нужно — в терминале. 🙂

    А вот и нет! 😉 На фига терминал всякой лабудой грузить? Там только двигун 1С и больше ничего

    Reply
  4. artbear

    Очередной баян для новичков в работе с внешними ВК.

    Со времен 77 здесь ничего не изменилось 🙂

    Но за изложение плюсую.

    Reply
  5. Abadonna

    (4)

    Со времен 77 здесь ничего не изменилось 🙂

    Артур, а что могло измениться для ком-объектов? 😉

    Винде по фиг от кого/для кого этот ком.

    И вообще надо юзать http://infostart.ru/public/15861/ и не париться

    Reply
  6. Spacer

    (4) artbear,

    artbear пишет:

    Со времен 77 здесь ничего не изменилось 🙂

    Ничего не изменилось говорите?

    Вы хоть в сути описанной в статье проблемы разобрались?

    Разве в 77 внешние компоненты хранились в макетах справочников?

    Разве 77 сохраняла их во временном каталоге пользователя и пыталась их потом там зарегистрировать?

    Reply
  7. Spacer
    Abadonna пишет:

    И вообще надо юзать http://infostart.ru/public/15861/ и не париться

    Вот это по моему мнению как раз и есть «париться» — т.е. разобравшись в сути проблемы только наполовину, искать обходные пути для ее решения.

    Reply
  8. Abadonna

    (7)

    Вот это по моему мнению как раз и есть «париться» — т.е. разобравшись в сути проблемы только наполовину

    Ага, наполовину… Суть проблемы элементарна — отсутствие прав.

    Ссылка раз и навсегда решает проблему того же regsvr32 БлаБла у любого юзверя выполнением RunAs от имени пользователя с админскими правами.

    Ну-ка расскажи в чем ты там ПОЛНОСТЬЮ разобрался?

    Reply
  9. cool.vlad4

    Это красивое решение —

    На терминале у обычных пользователей нет прав на изменение этой ветки реестра, поэтому компонента у них не подключается.

    ……

    Итак, по шагам:

    1. Регистрируем внешнюю компоненту утилитой regsvr32.exe на сервере терминалов в папке C:WINDOWSSYSTEM32 для 32-разрядной ОС или в папке C:WINDOWSSYSWOW64 для 64-разрядной ОС.

    Ну в чем профит-то? В том что вы взяли её и зарегистрировали? Явно кто-то в чем-то полностью переразобрался.

    Reply
  10. Medvedik

    Не понял смысл статьи.

    Админ и так знает, как зарегистрировать dll-ку, у 1Сника при нормальном распределении обязанностей нет никаких прав на серваке.

    Reply
  11. Spacer
    Abadonna пишет:

    Ага, наполовину… Суть проблемы элементарна — отсутствие прав

    Вот именно — отсутствие прав это вторая половина проблемы.

    А первая и основная половина состоит в том, почему 1С пытается перерегистрировать ВК, и как этого избежать.

    Reply
  12. Spacer
    cool.vlad4 пишет:

    Ну в чем профит-то? В том что вы взяли её и зарегистрировали? Явно кто-то в чем-то полностью переразобрался

    Не спешите с выводами не разобравшись.

    Дело в том, что вы ее хоть сто раз зарегистрируйте, но если вы оставите без изменений типовой код,

    1С будет безуспешно пытаться ее перерегистрировать снова и снова.

    Reply
  13. Spacer
    Medvedik пишет:

    Не понял смысл статьи.

    Админ и так знает, как зарегистрировать dll-ку

    Ну что тут сказать? Значит невнимательно читали статью, или никогда не сталкивались с такими проблемами.

    Конечно, админ знает, как зарегистрировать dll-ку.

    Он ее и регистрирует. Но потом оказывается что у рядовых пользователей она в терминале не подключается.

    Вот в чем суть проблемы то!

    Reply
  14. cool.vlad4

    (12) Не спешите с выводами, по поводу того, что я спешу с выводами не разобравшись. В типовой так сделано, потому, что ребята делали универсально, они не могут сидеть за вашим компьютером и регистрировать от имени администратора компоненту, не зная пароля тем более. А админы прекрасно об этом знают и ручками зарегят или скрипт напишут(run as). А ваша статья просто кэпство, но самое противное — преподносится как доселе неведомое чудо.

    Reply
  15. artbear

    (6) А если еще подумать?

    В 77 также были случаи неверной регистрации ВК — например, Админ в терминале заходит в одну базу и регистрирует ВК из каталога базы, а пользователь, у которого эта ВК юзается, но в другой базе, не может запустить эту ВК, если у него прав на папку с первой базой 🙁

    Поэтому, например, для нормальной работы в 77 и придумано куча решений — тот же вариант с RunAs или загрузка обычных ВК через спец.ВК от Саши Орефкова и т.п.

    Я же говорю — по работе с ВК ничего не изменилось!

    А описанные проблемы — это проблемы прикладного кода, в частности, кода по работе с торговым оборудованием.

    Разработчики этого кода либо не знали о сабжевой проблеме, либо пренебрегли ей 🙁

    ЗЫ кстати, в 77 ВК также можно было хранить в макетах, правда, с использованием доп.ВК 🙂

    ЗЗЫ а еще обрати внимание — плюс-то я тебе все-таки поставил 🙂

    Reply
  16. Spacer
    cool.vlad4 пишет:

    но самое противное — преподносится как доселе неведомое чудо

    У вас видимо патологическое отвращение к чужим разработкам.:)

    Конечно, это не чудо. Но тем не менее, я когда столкнулся с этой проблемой, нигде в инете не нашел объяснения причин этой проблемы. Везде освещалась только вторая часть проблемы (недостаток прав на реестр) и способы ее обхода. И нигде не говорилось об основной части проблемы — почему 1С пытается перерегистрировать ВК по новому пути.

    Reply
  17. Spacer
    artbear пишет:

    ЗЗЫ а еще обрати внимание — плюс-то я тебе все-таки поставил 🙂

    Согласен, не спорю. Спасибо.:)

    artbear пишет:

    А описанные проблемы — это проблемы прикладного кода, в частности, кода по работе с торговым оборудованием.

    Разработчики этого кода либо не знали о сабжевой проблеме, либо пренебрегли ей 🙁

    Совершенно верно. Но рядовому программеру от этого как бы не легче.

    А эта статья конечно не претендует на какую-то особенность и гениальность.

    Это просто статья человека который столкнулся с проблемой, и не нашел приемлемого для себя метода ее решения в инете.

    Это попытка самостоятельно разобраться в проблеме и поделиться своим решением с другими — быть может сэкономив кому то время на решение аналогичных проблем.

    Reply
  18. Abadonna

    (11)

    почему 1С пытается перерегистрировать ВК

    Потому что не надо использовать (в т.ч. и фирме 1С) дебильную ПодключитьВнешнюю.. с разными там синтаксисами,

    а надо использовать ЗагрузитьВнешнююКомпоненту(ПолныйПутьКДЛЛ), а либы лучше всего хранить в КаталогПрограммы(), либо (для файлухи и 7.7) в КаталогИБ()

    Reply
  19. Spacer
    Abadonna пишет:

    надо использовать ЗагрузитьВнешнююКомпоненту(ПолныйПутьКДЛЛ)

    Здесь есть одно большое НО…

    Синтаксис:

    ЗагрузитьВнешнююКомпоненту(<ИмяФайла>)

    Доступность:

    Толстый клиент.

    А мне нужно было подключать сканер штрих-кодов в ТОНКОМ клиенте.

    Reply
  20. Abadonna
    А мне нужно было подключать сканер штрих-кодов в ТОНКОМ клиенте.

    А скажи на милость: на фига в ТЕРМИНАЛЕ еще и тонкий клиент?

    Терминал сам по себе уже тонким клиентом является

    Reply
  21. fishca

    (19) сканер штрих-кода успешно подключается в тонком клиенте, пример реализации можно посмотреть в УПП 1.3, в последних двух релизах

    Reply
  22. Spacer
    Abadonna пишет:

    А скажи на милость: на фига в ТЕРМИНАЛЕ еще и тонкий клиент?

    Терминал сам по себе уже тонким клиентом является

    Ну, тут уж как бы наше руководство так решило для единообразия.

    Как пел Высоцкий, «Жираф большой — ему видней».:)

    Все работают с 1С в тонком клиенте управляемого приложения.

    Чтобы можно было и через терминал подключаться и просто с локальной машины.

    Reply
  23. Spacer
    fishca пишет:

    сканер штрих-кода успешно подключается в тонком клиенте, пример реализации можно посмотреть в УПП 1.3, в последних двух релизах

    Пример реализации я брал из УТ11.

    Он то конечно подключается, если у пользователя достаточно прав на запись в ветку реестра.

    А вот если у пользователя недостаточно этих прав, тогда и начинаются проблемы которые описаны в этой статье.

    Reply
  24. Abadonna

    (0)Кстати, если ты так уж «полностью разобрался», на фига ты совершаешь в коде лишние телодвижения?

    ProgID = «AddIn.Scaner45»;
    ПодключитьВнешнююКомпоненту(ProgID);
    ОбъектДрайвера = Новый (ProgID);
    

    После выполнения regsvr32 весь код укладывается в одну строку:

    ОбъектДрайвера = Новый COMОбъект(«AddIn.Scaner45»);

    Чтобы не быть голословным — рис.

    Reply
  25. Spacer
    Abadonna пишет:

    После выполнения regsvr32 весь код укладывается в одну строку:

    ОбъектДрайвера = Новый COMОбъект(«AddIn.Scaner45»);

    Ну, раз говоришь что работает, верю.

    Хотя мне это кажется странным. По идее не должно было.:)

    Reply
  26. Abadonna

    (25)

    Хотя мне это кажется странным. По идее не должно было.:)

    Именно, что должно!!! :)))

    Это как раз стандартное обращение к зарегенным в реестре интерфейсам COM, Active-X

    В 7.7 это было бы так: Lib=СоздатьОбъект(«Miracle.VCL»)

    В Дельфи: Lib:=CreateOleObject(‘Miracle.VCL’)

    И в любой другой виндовой хрени аналогично 😉

    Reply
  27. cool.vlad4

    (25) а что такое progid и clsid?;-)

    Reply
  28. Spacer
    Abadonna пишет:

    В 7.7 это было бы так: Lib=СоздатьОбъект(«Miracle.VCL»)

    Да, но в 7.7 перед этим вызывался метод ЗагрузитьВнешнююКомпоненту(«FormEx.dll»);

    Без этого СоздатьОбъект() не работало.

    Reply
  29. Abadonna
    Да, но в 7.7 перед этим вызывался метод ЗагрузитьВнешнююКомпоненту(«FormEx.dll»);

    Ладно, начнем ликбез по порядку :))))

    1. ЗагрузитьВнешнююКомпоненту от 1С — как раз и производит регистрацию в реестре интерфейса соотвествующей либы, написанной по технологии создания внешних компонент от 1С (ТСВК). Вот именно в этом случае, и возникает трабла с правами на запись в реестр, неважно в каком месте: на терминале или локальном компе

    2. СоздатьОбъект — уже и создавала (в аналогии 8.2) Новый COMОбъект по указанному progid

    В 8.2, как в обычной виндовой программе, все точно так же.

    Если ЛЮБАЯ ВК написана по технологии COM и предварительно зарегена через regsvr32 (т.е. уже есть progid), никаких

    Подключить/ЗагрузитьВнешнююКомпоненту уже не надо ни в 7.7, ни в 8.2.

    В моем примере выше либа для 7.7 писалась не по ТСВК, она обязательно требовала regsvr32, но при этом совершенно не понимала никаких Подключить/ЗагрузитьВнешнююКомпоненту

    Процедура ПриНачалеРаботыСистемы()
    //………………………………………
    ФайлБиблиотеки=КаталогИБ()+»Miracle.Dll»;
    Попытка
    Lib=СоздатьОбъект(«Miracle.VCL»);
    Исключение
    ЗапуститьПриложение(«regsvr32.exe»+Симв(34)+
    
    ФайлБиблиотеки+Симв(34));
    Для А=1 По 500000 Цикл;КонецЦикла;
    Предупреждение(«Была установлена новаябиблиотека»+РазделительСтрок+
    «Программу следует перезагрузить»);
    ЗавершитьРаботуСистемы(0);
    КонецПопытки;
    
    

    Показать

    Reply
  30. Abadonna

    +(29) А FormEx.dll — вообще супер-специфичная либа, там Лёха залез в самое нутро 1С, последние её версии вообще в реестре следов не оставляют, и ЗагрузитьВнешнююКомпоненту(«FormEx.dll») пройдет всегда, у любого юзверя, с любыми правами

    Reply
  31. powerpc

    УТ 10.3. Платформа 8.2.13.202. У меня при настройке перенаправленого в терминальный сервер торгового оборудования выпадает 1С при тестировании драйвера. Однако если на это не заморачиваться, то Интерфейс Кассира работает и чеки пробиваются. Может кому-то пригодится, т.к. мы очень долго не понимали в чем дело и не пробовали пробить чек из Интерфейса Кассира ))))

    Reply
  32. sound

    Использую вот это

    http://infostart.ru/public/14418/

    А в совокупности вот с этим

    http://infostart.ru/public/16713/

    вообще больше проблем при работе в ВК практически не ощущаю. Больше ничего и не нужно. Главное не злоупотреблять использованием ВК 🙂

    Reply
  33. Spacer
    sound пишет:

    Использую вот это

    http://infostart.ru/public/14418/

    В описанном мной случае проблемы возникали когда ВК хранится в макете справочника.

    При подключении она сохраняется во временный файл временного каталога пользователя.

    Поэтому для использования RegsvrEx нужно знать полный путь к этому временному файлу.

    Ну а вообще использование нескольких дополнительных разработок вместо стандартного

    типового механизма и маленькой правки кода не кажется мне оптимальным.:)

    Reply
  34. sound

    (33) Смею заметить, ничего против Вашей публикации не имею :). «стандартный типовой механизм» не всегда вставляет, иногда своя реализация кажется более универсальной :).

    Reply
  35. kiros

    Спасибо за просвещение, а то у БиТ купили продукт, а они используют свой сервер лицензий, и для этого пытаются регистрировать внешние компоненты, до сих пор приходилось делать запуск под Админом, теперь попробуем переписать чтобы было по человечески.

    Reply
  36. bulpi

    (24)

    «После выполнения regsvr32 весь код укладывается в одну строку:

    ОбъектДрайвера = Новый COMОбъект(«AddIn.Scaner45″); »

    А страница свойств компоненты появится при таком подходе ?

    Reply
  37. a_mironov

    Артур, а что могло измениться для ком-объектов? 😉

    Винде по фиг от кого/для кого этот ком.

    И вообще надо юзать http://infostart.ru/public/15861/ и не париться

    Reply
  38. 1C82

    Спасибо за статью. Столкнулся с аналогичным случаем при работе с эмулятором фискального регистратора. Конечно же лучше запускать 1С через тонкий клиент с машины к которой подключено оборудование, но некоторые клиенты настаивают на использовании терминала ( тем более если фискальный регистратор виртуальный — используется эмулятор). Почему-то после обновления УТ11 до 11.1 вдруг 1С стала просить драйвера на эмулятор фискального регистратора, хотя сканнер штрих-кодов продолжает прекрасно работать.

    Добавил бы уточнения к алгоритму решения этой проблемы: ( которые кстати подчерпнул из вашего же комментария только в другом форуме )

    В общих макетах лежат драйвера различного оборудования. Там собственно и хранилась нужная мне dll.

    Щелкаем на этом макете и нажимаем кнопочку «Выгрузить в файл».

    Файлу даем любое имя и расширение zip.

    Открыв архив видим несколько файлов, в том числе нужный мне FPEmulator1C.dll. Распаковываем и копируем его в зависимости от разрядности windows в папку для 32х — C:WindowsSysytem32 , для 64х — C:WindowsSysWOW64.

    Запускаем Пуск/Все программы / Стандартные / Командная строка — только правой кнопкой мыши вибираем «Запуск от имени администратора» . В командной строке переходим в нужную папку (C:WindowsSysytem32 или C:WindowsSysWOW64 ).

    В командной строке — cd C:WindowsSysytem32

    Пробуем регистрировать его с помощью команды regsvr32.exe .

    В командной строке — regsvr32 FPEmulator1C.dll

    Если все успешно тогда переписываем код в конфигурации в соответствии со статьей.

    Reply
  39. jaroslav.h

    А с тонким клиентом как подключить?

    Reply
  40. Spacer

    (39) myr4ik07, Если вы используете тонкий клиент в терминале, то в статье как раз и описано как решить проблемы с подключением.

    А если вы используете тонкий клиент просто на удаленной машине, то никаких проблем с подключением быть не должно.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *