gifts2017

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

Опубликовал Владимир Насыров (Spacer) в раздел Программирование - Внешние компоненты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

 

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

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

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

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

1С сохраняет компоненту во временной папке пользователя, например "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

 

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

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

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

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

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

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

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

Вариант 1:

 

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

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

Вариант 2:

 

ProgID = "AddIn.Scaner45";

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

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

 

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Аркадий Кучер (Abadonna) 23.09.11 00:57
В то время как при работе с локальных компьютеров никаких проблем с подключением внешних компонент нет.

Глубоко ошибаешься. В путних сетках и тут проблемы, потому что в путних сетках и локальных административных прав у юзверя быть не должно. А то они там нарегят/наинсталлируют!
2. icek2w (icek@w) 23.09.11 10:32
В путних сетках и тут проблемы...

Там и софт по минимуму, все что нужно - в терминале. :)
Но, если так необходимо, то, думаю, на локальной машине данная методика также будет работать, т.о. "ложка не существует". :)
3. Аркадий Кучер (Abadonna) 23.09.11 10:55
(2)
Там и софт по минимуму, все что нужно - в терминале. :)

А вот и нет! ;) На фига терминал всякой лабудой грузить? Там только двигун 1С и больше ничего
4. Артур Аюханов (artbear) 23.09.11 12:01
Очередной баян для новичков в работе с внешними ВК.
Со времен 77 здесь ничего не изменилось :)
Но за изложение плюсую.
5. Аркадий Кучер (Abadonna) 23.09.11 12:19
(4)
Со времен 77 здесь ничего не изменилось :)

Артур, а что могло измениться для ком-объектов? ;)
Винде по фиг от кого/для кого этот ком.
И вообще надо юзать http://infostart.ru/public/15861/ и не париться
6. Владимир Насыров (Spacer) 23.09.11 12:48
(4) artbear,
artbear пишет:
Со времен 77 здесь ничего не изменилось :)

Ничего не изменилось говорите?
Вы хоть в сути описанной в статье проблемы разобрались?
Разве в 77 внешние компоненты хранились в макетах справочников?
Разве 77 сохраняла их во временном каталоге пользователя и пыталась их потом там зарегистрировать?
7. Владимир Насыров (Spacer) 23.09.11 12:48
Abadonna пишет:
И вообще надо юзать http://infostart.ru/public/15861/ и не париться

Вот это по моему мнению как раз и есть "париться" - т.е. разобравшись в сути проблемы только наполовину, искать обходные пути для ее решения.
8. Аркадий Кучер (Abadonna) 23.09.11 14:02
(7)
Вот это по моему мнению как раз и есть "париться" - т.е. разобравшись в сути проблемы только наполовину

Ага, наполовину... Суть проблемы элементарна - отсутствие прав.
Ссылка раз и навсегда решает проблему того же regsvr32 БлаБла у любого юзверя выполнением RunAs от имени пользователя с админскими правами.
Ну-ка расскажи в чем ты там ПОЛНОСТЬЮ разобрался?
9. Ийон Тихий (cool.vlad4) 23.09.11 14:15
Это красивое решение -
На терминале у обычных пользователей нет прав на изменение этой ветки реестра, поэтому компонента у них не подключается.
......
Итак, по шагам:
1. Регистрируем внешнюю компоненту утилитой regsvr32.exe на сервере терминалов в папке C:\WINDOWS\SYSTEM32 для 32-разрядной ОС или в папке C:\WINDOWS\SYSWOW64 для 64-разрядной ОС.

Ну в чем профит-то? В том что вы взяли её и зарегистрировали? Явно кто-то в чем-то полностью переразобрался.
10. Вячеслав (Medvedik) 23.09.11 14:20
Не понял смысл статьи.
Админ и так знает, как зарегистрировать dll-ку, у 1Сника при нормальном распределении обязанностей нет никаких прав на серваке.
11. Владимир Насыров (Spacer) 23.09.11 14:59
Abadonna пишет:
Ага, наполовину... Суть проблемы элементарна - отсутствие прав

Вот именно - отсутствие прав это вторая половина проблемы.
А первая и основная половина состоит в том, почему 1С пытается перерегистрировать ВК, и как этого избежать.
12. Владимир Насыров (Spacer) 23.09.11 15:02
cool.vlad4 пишет:
Ну в чем профит-то? В том что вы взяли её и зарегистрировали? Явно кто-то в чем-то полностью переразобрался

Не спешите с выводами не разобравшись.
Дело в том, что вы ее хоть сто раз зарегистрируйте, но если вы оставите без изменений типовой код,
1С будет безуспешно пытаться ее перерегистрировать снова и снова.
13. Владимир Насыров (Spacer) 23.09.11 15:06
Medvedik пишет:
Не понял смысл статьи.
Админ и так знает, как зарегистрировать dll-ку

Ну что тут сказать? Значит невнимательно читали статью, или никогда не сталкивались с такими проблемами.
Конечно, админ знает, как зарегистрировать dll-ку.
Он ее и регистрирует. Но потом оказывается что у рядовых пользователей она в терминале не подключается.
Вот в чем суть проблемы то!
14. Ийон Тихий (cool.vlad4) 23.09.11 15:07
(12) Не спешите с выводами, по поводу того, что я спешу с выводами не разобравшись. В типовой так сделано, потому, что ребята делали универсально, они не могут сидеть за вашим компьютером и регистрировать от имени администратора компоненту, не зная пароля тем более. А админы прекрасно об этом знают и ручками зарегят или скрипт напишут(run as). А ваша статья просто кэпство, но самое противное - преподносится как доселе неведомое чудо.
15. Артур Аюханов (artbear) 23.09.11 15:08
(6) А если еще подумать?
В 77 также были случаи неверной регистрации ВК - например, Админ в терминале заходит в одну базу и регистрирует ВК из каталога базы, а пользователь, у которого эта ВК юзается, но в другой базе, не может запустить эту ВК, если у него прав на папку с первой базой :(
Поэтому, например, для нормальной работы в 77 и придумано куча решений - тот же вариант с RunAs или загрузка обычных ВК через спец.ВК от Саши Орефкова и т.п.
Я же говорю - по работе с ВК ничего не изменилось!
А описанные проблемы - это проблемы прикладного кода, в частности, кода по работе с торговым оборудованием.
Разработчики этого кода либо не знали о сабжевой проблеме, либо пренебрегли ей :(
ЗЫ кстати, в 77 ВК также можно было хранить в макетах, правда, с использованием доп.ВК :)
ЗЗЫ а еще обрати внимание - плюс-то я тебе все-таки поставил :)
16. Владимир Насыров (Spacer) 23.09.11 15:17
cool.vlad4 пишет:
но самое противное - преподносится как доселе неведомое чудо

У вас видимо патологическое отвращение к чужим разработкам.:)
Конечно, это не чудо. Но тем не менее, я когда столкнулся с этой проблемой, нигде в инете не нашел объяснения причин этой проблемы. Везде освещалась только вторая часть проблемы (недостаток прав на реестр) и способы ее обхода. И нигде не говорилось об основной части проблемы - почему 1С пытается перерегистрировать ВК по новому пути.
17. Владимир Насыров (Spacer) 23.09.11 15:24
artbear пишет:
ЗЗЫ а еще обрати внимание - плюс-то я тебе все-таки поставил :)

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

artbear пишет:
А описанные проблемы - это проблемы прикладного кода, в частности, кода по работе с торговым оборудованием.
Разработчики этого кода либо не знали о сабжевой проблеме, либо пренебрегли ей :(


Совершенно верно. Но рядовому программеру от этого как бы не легче.
А эта статья конечно не претендует на какую-то особенность и гениальность.
Это просто статья человека который столкнулся с проблемой, и не нашел приемлемого для себя метода ее решения в инете.
Это попытка самостоятельно разобраться в проблеме и поделиться своим решением с другими - быть может сэкономив кому то время на решение аналогичных проблем.
18. Аркадий Кучер (Abadonna) 23.09.11 16:10
(11)
почему 1С пытается перерегистрировать ВК

Потому что не надо использовать (в т.ч. и фирме 1С) дебильную ПодключитьВнешнюю.. с разными там синтаксисами,
а надо использовать ЗагрузитьВнешнююКомпоненту(ПолныйПутьКДЛЛ), а либы лучше всего хранить в КаталогПрограммы(), либо (для файлухи и 7.7) в КаталогИБ()
19. Владимир Насыров (Spacer) 23.09.11 16:30
Abadonna пишет:
надо использовать ЗагрузитьВнешнююКомпоненту(ПолныйПутьКДЛЛ)

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

Синтаксис:

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

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

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

А мне нужно было подключать сканер штрих-кодов в ТОНКОМ клиенте.
avatar_xranitel; JohnySC; +2 Ответить 1
20. Аркадий Кучер (Abadonna) 23.09.11 16:32
А мне нужно было подключать сканер штрих-кодов в ТОНКОМ клиенте.

А скажи на милость: на фига в ТЕРМИНАЛЕ еще и тонкий клиент?
Терминал сам по себе уже тонким клиентом является
21. Сергей Рудаков (fishca) 23.09.11 16:33
(19) сканер штрих-кода успешно подключается в тонком клиенте, пример реализации можно посмотреть в УПП 1.3, в последних двух релизах
22. Владимир Насыров (Spacer) 23.09.11 16:40
Abadonna пишет:
А скажи на милость: на фига в ТЕРМИНАЛЕ еще и тонкий клиент?
Терминал сам по себе уже тонким клиентом является

Ну, тут уж как бы наше руководство так решило для единообразия.
Как пел Высоцкий, "Жираф большой - ему видней".:)
Все работают с 1С в тонком клиенте управляемого приложения.
Чтобы можно было и через терминал подключаться и просто с локальной машины.
23. Владимир Насыров (Spacer) 23.09.11 16:50
fishca пишет:
сканер штрих-кода успешно подключается в тонком клиенте, пример реализации можно посмотреть в УПП 1.3, в последних двух релизах

Пример реализации я брал из УТ11.
Он то конечно подключается, если у пользователя достаточно прав на запись в ветку реестра.
А вот если у пользователя недостаточно этих прав, тогда и начинаются проблемы которые описаны в этой статье.
24. Аркадий Кучер (Abadonna) 24.09.11 02:20
(0)Кстати, если ты так уж "полностью разобрался", на фига ты совершаешь в коде лишние телодвижения?
ProgID = "AddIn.Scaner45";
ПодключитьВнешнююКомпоненту(ProgID);
ОбъектДрайвера = Новый (ProgID);
...Показать Скрыть


После выполнения regsvr32 весь код укладывается в одну строку:
ОбъектДрайвера = Новый COMОбъект("AddIn.Scaner45");
Чтобы не быть голословным - рис.
Прикрепленные файлы:
25. Владимир Насыров (Spacer) 24.09.11 02:45
Abadonna пишет:
После выполнения regsvr32 весь код укладывается в одну строку:
ОбъектДрайвера = Новый COMОбъект("AddIn.Scaner45");


Ну, раз говоришь что работает, верю.
Хотя мне это кажется странным. По идее не должно было.:)
26. Аркадий Кучер (Abadonna) 24.09.11 02:49
(25)
Хотя мне это кажется странным. По идее не должно было.:)

Именно, что должно!!! :)))
Это как раз стандартное обращение к зарегенным в реестре интерфейсам COM, Active-X
В 7.7 это было бы так: Lib=СоздатьОбъект("Miracle.VCL")
В Дельфи: Lib:=CreateOleObject('Miracle.VCL')
И в любой другой виндовой хрени аналогично ;)
27. Ийон Тихий (cool.vlad4) 24.09.11 02:53
28. Владимир Насыров (Spacer) 24.09.11 03:09
Abadonna пишет:
В 7.7 это было бы так: Lib=СоздатьОбъект("Miracle.VCL")

Да, но в 7.7 перед этим вызывался метод ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Без этого СоздатьОбъект() не работало.
29. Аркадий Кучер (Abadonna) 24.09.11 03:19
Да, но в 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);
   КонецПопытки;

...Показать Скрыть
30. Аркадий Кучер (Abadonna) 24.09.11 03:37
+(29) А FormEx.dll - вообще супер-специфичная либа, там Лёха залез в самое нутро 1С, последние её версии вообще в реестре следов не оставляют, и ЗагрузитьВнешнююКомпоненту("FormEx.dll") пройдет всегда, у любого юзверя, с любыми правами
31. Олег Крапивный (powerpc) 27.09.11 09:02
УТ 10.3. Платформа 8.2.13.202. У меня при настройке перенаправленого в терминальный сервер торгового оборудования выпадает 1С при тестировании драйвера. Однако если на это не заморачиваться, то Интерфейс Кассира работает и чеки пробиваются. Может кому-то пригодится, т.к. мы очень долго не понимали в чем дело и не пробовали пробить чек из Интерфейса Кассира ))))
32. sound sound (sound) 27.09.11 10:49
Использую вот это
http://infostart.ru/public/14418/
А в совокупности вот с этим
http://infostart.ru/public/16713/
вообще больше проблем при работе в ВК практически не ощущаю. Больше ничего и не нужно. Главное не злоупотреблять использованием ВК :)
33. Владимир Насыров (Spacer) 27.09.11 12:32
sound пишет:
Использую вот это
http://infostart.ru/public/14418/

В описанном мной случае проблемы возникали когда ВК хранится в макете справочника.
При подключении она сохраняется во временный файл временного каталога пользователя.
Поэтому для использования RegsvrEx нужно знать полный путь к этому временному файлу.
Ну а вообще использование нескольких дополнительных разработок вместо стандартного
типового механизма и маленькой правки кода не кажется мне оптимальным.:)
34. sound sound (sound) 27.09.11 12:37
(33) Смею заметить, ничего против Вашей публикации не имею :). "стандартный типовой механизм" не всегда вставляет, иногда своя реализация кажется более универсальной :).
35. Кирилл (kiros) 28.09.11 10:19
Спасибо за просвещение, а то у БиТ купили продукт, а они используют свой сервер лицензий, и для этого пытаются регистрировать внешние компоненты, до сих пор приходилось делать запуск под Админом, теперь попробуем переписать чтобы было по человечески.
36. bulpi bulpi (bulpi) 28.09.11 14:26
(24)
"После выполнения regsvr32 весь код укладывается в одну строку:
ОбъектДрайвера = Новый COMОбъект("AddIn.Scaner45"); "

А страница свойств компоненты появится при таком подходе ?
37. Алексей Миронов (a_mironov) 11.12.11 04:19
Артур, а что могло измениться для ком-объектов? ;)
Винде по фиг от кого/для кого этот ком.
И вообще надо юзать http://infostart.ru/public/15861/ и не париться
38. Сергей (1C82) 19.06.13 22:50
Спасибо за статью. Столкнулся с аналогичным случаем при работе с эмулятором фискального регистратора. Конечно же лучше запускать 1С через тонкий клиент с машины к которой подключено оборудование, но некоторые клиенты настаивают на использовании терминала ( тем более если фискальный регистратор виртуальный - используется эмулятор). Почему-то после обновления УТ11 до 11.1 вдруг 1С стала просить драйвера на эмулятор фискального регистратора, хотя сканнер штрих-кодов продолжает прекрасно работать.
Добавил бы уточнения к алгоритму решения этой проблемы: ( которые кстати подчерпнул из вашего же комментария только в другом форуме )
В общих макетах лежат драйвера различного оборудования. Там собственно и хранилась нужная мне dll.
Щелкаем на этом макете и нажимаем кнопочку "Выгрузить в файл".
Файлу даем любое имя и расширение zip.
Открыв архив видим несколько файлов, в том числе нужный мне FPEmulator1C.dll. Распаковываем и копируем его в зависимости от разрядности windows в папку для 32х - C:\Windows\Sysytem32 , для 64х - C:\Windows\SysWOW64.
Запускаем Пуск/Все программы / Стандартные / Командная строка - только правой кнопкой мыши вибираем "Запуск от имени администратора" . В командной строке переходим в нужную папку (C:\Windows\Sysytem32 или C:\Windows\SysWOW64 ).
В командной строке - cd C:\Windows\Sysytem32
Пробуем регистрировать его с помощью команды regsvr32.exe .
В командной строке - regsvr32 FPEmulator1C.dll
Если все успешно тогда переписываем код в конфигурации в соответствии со статьей.
39. Ярослав Володимирович (myr4ik07) 06.06.16 16:17
А с тонким клиентом как подключить?
40. Владимир Насыров (Spacer) 06.06.16 21:00
(39) myr4ik07, Если вы используете тонкий клиент в терминале, то в статье как раз и описано как решить проблемы с подключением.
А если вы используете тонкий клиент просто на удаленной машине, то никаких проблем с подключением быть не должно.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа