Это связано с некоторыми особенностями работы функции глобального контекста ПодключитьВнешнююКомпоненту().
Зачастую у программистов возникают проблемы с подключением внешних компонент (например, драйверов торгового оборудования), когда пользователи работают с 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С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.
Ну вот собственно и все. Успехов в работе!
Глубоко ошибаешься. В путних сетках и тут проблемы, потому что в путних сетках и локальных административных прав у юзверя быть не должно. А то они там нарегят/наинсталлируют!
Там и софт по минимуму, все что нужно — в терминале. 🙂
Но, если так необходимо, то, думаю, на локальной машине данная методика также будет работать, т.о. «ложка не существует». 🙂
(2)
А вот и нет! 😉 На фига терминал всякой лабудой грузить? Там только двигун 1С и больше ничего
Очередной баян для новичков в работе с внешними ВК.
Со времен 77 здесь ничего не изменилось 🙂
Но за изложение плюсую.
(4)
Артур, а что могло измениться для ком-объектов? 😉
http://infostart.ru/public/15861/ и не париться
Винде по фиг от кого/для кого этот ком.
И вообще надо юзать
(4) artbear,
Со времен 77 здесь ничего не изменилось 🙂
Ничего не изменилось говорите?
Вы хоть в сути описанной в статье проблемы разобрались?
Разве в 77 внешние компоненты хранились в макетах справочников?
Разве 77 сохраняла их во временном каталоге пользователя и пыталась их потом там зарегистрировать?
И вообще надо юзать
Вот это по моему мнению как раз и есть «париться» — т.е. разобравшись в сути проблемы только наполовину, искать обходные пути для ее решения.
(7)
Ага, наполовину… Суть проблемы элементарна — отсутствие прав.
Ссылка раз и навсегда решает проблему того же regsvr32 БлаБла у любого юзверя выполнением RunAs от имени пользователя с админскими правами.
Ну-ка расскажи в чем ты там ПОЛНОСТЬЮ разобрался?
Это красивое решение —
……
Итак, по шагам:
1. Регистрируем внешнюю компоненту утилитой regsvr32.exe на сервере терминалов в папке C:WINDOWSSYSTEM32 для 32-разрядной ОС или в папке C:WINDOWSSYSWOW64 для 64-разрядной ОС.
Ну в чем профит-то? В том что вы взяли её и зарегистрировали? Явно кто-то в чем-то полностью переразобрался.
Не понял смысл статьи.
Админ и так знает, как зарегистрировать dll-ку, у 1Сника при нормальном распределении обязанностей нет никаких прав на серваке.
Ага, наполовину… Суть проблемы элементарна — отсутствие прав
Вот именно — отсутствие прав это вторая половина проблемы.
А первая и основная половина состоит в том, почему 1С пытается перерегистрировать ВК, и как этого избежать.
Ну в чем профит-то? В том что вы взяли её и зарегистрировали? Явно кто-то в чем-то полностью переразобрался
Не спешите с выводами не разобравшись.
Дело в том, что вы ее хоть сто раз зарегистрируйте, но если вы оставите без изменений типовой код,
1С будет безуспешно пытаться ее перерегистрировать снова и снова.
Не понял смысл статьи.
Админ и так знает, как зарегистрировать dll-ку
Ну что тут сказать? Значит невнимательно читали статью, или никогда не сталкивались с такими проблемами.
Конечно, админ знает, как зарегистрировать dll-ку.
Он ее и регистрирует. Но потом оказывается что у рядовых пользователей она в терминале не подключается.
Вот в чем суть проблемы то!
(12) Не спешите с выводами, по поводу того, что я спешу с выводами не разобравшись. В типовой так сделано, потому, что ребята делали универсально, они не могут сидеть за вашим компьютером и регистрировать от имени администратора компоненту, не зная пароля тем более. А админы прекрасно об этом знают и ручками зарегят или скрипт напишут(run as). А ваша статья просто кэпство, но самое противное — преподносится как доселе неведомое чудо.
(6) А если еще подумать?
В 77 также были случаи неверной регистрации ВК — например, Админ в терминале заходит в одну базу и регистрирует ВК из каталога базы, а пользователь, у которого эта ВК юзается, но в другой базе, не может запустить эту ВК, если у него прав на папку с первой базой 🙁
Поэтому, например, для нормальной работы в 77 и придумано куча решений — тот же вариант с RunAs или загрузка обычных ВК через спец.ВК от Саши Орефкова и т.п.
Я же говорю — по работе с ВК ничего не изменилось!
А описанные проблемы — это проблемы прикладного кода, в частности, кода по работе с торговым оборудованием.
Разработчики этого кода либо не знали о сабжевой проблеме, либо пренебрегли ей 🙁
ЗЫ кстати, в 77 ВК также можно было хранить в макетах, правда, с использованием доп.ВК 🙂
ЗЗЫ а еще обрати внимание — плюс-то я тебе все-таки поставил 🙂
но самое противное — преподносится как доселе неведомое чудо
У вас видимо патологическое отвращение к чужим разработкам.:)
Конечно, это не чудо. Но тем не менее, я когда столкнулся с этой проблемой, нигде в инете не нашел объяснения причин этой проблемы. Везде освещалась только вторая часть проблемы (недостаток прав на реестр) и способы ее обхода. И нигде не говорилось об основной части проблемы — почему 1С пытается перерегистрировать ВК по новому пути.
ЗЗЫ а еще обрати внимание — плюс-то я тебе все-таки поставил 🙂
Согласен, не спорю. Спасибо.:)
А описанные проблемы — это проблемы прикладного кода, в частности, кода по работе с торговым оборудованием.
Разработчики этого кода либо не знали о сабжевой проблеме, либо пренебрегли ей 🙁
Совершенно верно. Но рядовому программеру от этого как бы не легче.
А эта статья конечно не претендует на какую-то особенность и гениальность.
Это просто статья человека который столкнулся с проблемой, и не нашел приемлемого для себя метода ее решения в инете.
Это попытка самостоятельно разобраться в проблеме и поделиться своим решением с другими — быть может сэкономив кому то время на решение аналогичных проблем.
(11)
Потому что не надо использовать (в т.ч. и фирме 1С) дебильную ПодключитьВнешнюю.. с разными там синтаксисами,
а надо использовать ЗагрузитьВнешнююКомпоненту(ПолныйПутьКДЛЛ), а либы лучше всего хранить в КаталогПрограммы(), либо (для файлухи и 7.7) в КаталогИБ()
надо использовать ЗагрузитьВнешнююКомпоненту(ПолныйПутьКДЛЛ)
Здесь есть одно большое НО…
Синтаксис:
ЗагрузитьВнешнююКомпоненту(<ИмяФайла>)
Доступность:
Толстый клиент.
А мне нужно было подключать сканер штрих-кодов в ТОНКОМ клиенте.
А скажи на милость: на фига в ТЕРМИНАЛЕ еще и тонкий клиент?
Терминал сам по себе уже тонким клиентом является
(19) сканер штрих-кода успешно подключается в тонком клиенте, пример реализации можно посмотреть в УПП 1.3, в последних двух релизах
А скажи на милость: на фига в ТЕРМИНАЛЕ еще и тонкий клиент?
Терминал сам по себе уже тонким клиентом является
Ну, тут уж как бы наше руководство так решило для единообразия.
Как пел Высоцкий, «Жираф большой — ему видней».:)
Все работают с 1С в тонком клиенте управляемого приложения.
Чтобы можно было и через терминал подключаться и просто с локальной машины.
сканер штрих-кода успешно подключается в тонком клиенте, пример реализации можно посмотреть в УПП 1.3, в последних двух релизах
Пример реализации я брал из УТ11.
Он то конечно подключается, если у пользователя достаточно прав на запись в ветку реестра.
А вот если у пользователя недостаточно этих прав, тогда и начинаются проблемы которые описаны в этой статье.
(0)Кстати, если ты так уж «полностью разобрался», на фига ты совершаешь в коде лишние телодвижения?
После выполнения regsvr32 весь код укладывается в одну строку:
ОбъектДрайвера = Новый COMОбъект(«AddIn.Scaner45»);
Чтобы не быть голословным — рис.
После выполнения regsvr32 весь код укладывается в одну строку:
ОбъектДрайвера = Новый COMОбъект(«AddIn.Scaner45»);
Ну, раз говоришь что работает, верю.
Хотя мне это кажется странным. По идее не должно было.:)
(25)
Именно, что должно!!! :)))
Это как раз стандартное обращение к зарегенным в реестре интерфейсам COM, Active-X
В 7.7 это было бы так: Lib=СоздатьОбъект(«Miracle.VCL»)
В Дельфи: Lib:=CreateOleObject(‘Miracle.VCL’)
И в любой другой виндовой хрени аналогично 😉
(25) а что такое progid и clsid?;-)
В 7.7 это было бы так: Lib=СоздатьОбъект(«Miracle.VCL»)
Да, но в 7.7 перед этим вызывался метод ЗагрузитьВнешнююКомпоненту(«FormEx.dll»);
Без этого СоздатьОбъект() не работало.
Ладно, начнем ликбез по порядку :))))
1. ЗагрузитьВнешнююКомпоненту от 1С — как раз и производит регистрацию в реестре интерфейса соотвествующей либы, написанной по технологии создания внешних компонент от 1С (ТСВК). Вот именно в этом случае, и возникает трабла с правами на запись в реестр, неважно в каком месте: на терминале или локальном компе
2. СоздатьОбъект — уже и создавала (в аналогии 8.2) Новый COMОбъект по указанному progid
В 8.2, как в обычной виндовой программе, все точно так же.
Если ЛЮБАЯ ВК написана по технологии COM и предварительно зарегена через regsvr32 (т.е. уже есть progid), никаких
Подключить/ЗагрузитьВнешнююКомпоненту уже не надо ни в 7.7, ни в 8.2.
В моем примере выше либа для 7.7 писалась не по ТСВК, она обязательно требовала regsvr32, но при этом совершенно не понимала никаких Подключить/ЗагрузитьВнешнююКомпоненту
Показать
+(29) А FormEx.dll — вообще супер-специфичная либа, там Лёха залез в самое нутро 1С, последние её версии вообще в реестре следов не оставляют, и ЗагрузитьВнешнююКомпоненту(«FormEx.dll») пройдет всегда, у любого юзверя, с любыми правами
УТ 10.3. Платформа 8.2.13.202. У меня при настройке перенаправленого в терминальный сервер торгового оборудования выпадает 1С при тестировании драйвера. Однако если на это не заморачиваться, то Интерфейс Кассира работает и чеки пробиваются. Может кому-то пригодится, т.к. мы очень долго не понимали в чем дело и не пробовали пробить чек из Интерфейса Кассира ))))
Использую вот это
http://infostart.ru/public/14418/
http://infostart.ru/public/16713/
А в совокупности вот с этим
вообще больше проблем при работе в ВК практически не ощущаю. Больше ничего и не нужно. Главное не злоупотреблять использованием ВК 🙂
Использую вот это
В описанном мной случае проблемы возникали когда ВК хранится в макете справочника.
При подключении она сохраняется во временный файл временного каталога пользователя.
Поэтому для использования RegsvrEx нужно знать полный путь к этому временному файлу.
Ну а вообще использование нескольких дополнительных разработок вместо стандартного
типового механизма и маленькой правки кода не кажется мне оптимальным.:)
(33) Смею заметить, ничего против Вашей публикации не имею :). «стандартный типовой механизм» не всегда вставляет, иногда своя реализация кажется более универсальной :).
Спасибо за просвещение, а то у БиТ купили продукт, а они используют свой сервер лицензий, и для этого пытаются регистрировать внешние компоненты, до сих пор приходилось делать запуск под Админом, теперь попробуем переписать чтобы было по человечески.
(24)
«После выполнения regsvr32 весь код укладывается в одну строку:
ОбъектДрайвера = Новый COMОбъект(«AddIn.Scaner45″); »
А страница свойств компоненты появится при таком подходе ?
Артур, а что могло измениться для ком-объектов? 😉
http://infostart.ru/public/15861/ и не париться
Винде по фиг от кого/для кого этот ком.
И вообще надо юзать
Спасибо за статью. Столкнулся с аналогичным случаем при работе с эмулятором фискального регистратора. Конечно же лучше запускать 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
Если все успешно тогда переписываем код в конфигурации в соответствии со статьей.
А с тонким клиентом как подключить?
(39) myr4ik07, Если вы используете тонкий клиент в терминале, то в статье как раз и описано как решить проблемы с подключением.
А если вы используете тонкий клиент просто на удаленной машине, то никаких проблем с подключением быть не должно.