Это связано с некоторыми особенностями работы функции глобального контекста ПодключитьВнешнююКомпоненту()
.
Зачастую у программистов возникают проблемы с подключением внешних компонент (например, драйверов торгового оборудования), когда пользователи работают с 1С, подключаясь к серверу через терминал.
При этом пользователи видят, например, такую картинку:
В то время как при работе с локальных компьютеров никаких проблем с подключением внешних компонент нет.
С чем это связано? Это связано с тем, что, когда пользователи работают через сервер терминалов, они имеют меньше прав, чем при работе на локальном компьютере.
В этом легко убедиться, если зайти на сервер терминалов под учетной записью с административными правами.
Причина такой разницы заключается в том, что 1С не может зарегистрировать внешнюю компоненту в реестре, когда пользователь работает в терминале под обычными правами, т.к. у обычного пользователя нет прав на запись в ветку системного реестра HKEY_CLASSES_ROOT .
В публикациях на тему подключения внешних компонент в терминале предлагаются самые разные методы решения этой проблемы.
Например, такие:
1. Запустить первый раз 1С под административными правами.
Этот вариант далеко не всегда срабатывает. Ниже объясню, почему.
2. Дать обычным пользователям терминала права на запись в ветку системного реестра HKEY_CLASSES_ROOT .
Недостаточно "продвинутым" пользователям лучше этого не делать, иначе могут быть проблемы.
3. С помощью различных "примочек" регистрировать ВК от имени пользователя с полными правами.
Тоже не есть хорошо.
Так как же все таки лучше выйти из этой ситуации?
Я предлагаю свой вариант решения этой проблемы. По моему мнению - простой и красивый.
Исследуя эту проблему, я задался вопросом - а зачем 1С вообще пытается зарегистрировать ВК по новому пути? Ведь она уже зарегистрирована в системе.
Дело оказалось в том, что в типовых конфигурациях 1С (например "Управление Торговлей") используется такой синтаксис метода глобального контекста ПодключитьВнешнююКомпоненту():
ПодключитьВнешнююКомпоненту("Справочник.ПодключаемоеОборудование.Макет.ДрайверАТОЛСканерШтрихкода", "АТОЛСканер");
Как видим, ВК драйвера подключается из макета "ДрайверАТОЛСканерШтрихкода" справочника "ПодключаемоеОборудование".
Что же при этом происходит?
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С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.
Ну вот собственно и все. Успехов в работе!
[необходимо зарегистрироваться для просмотра ссылки]
Вопрос: Внешняя компонента Native Api на C++ под Linux (Ubuntu x64) на 1С 8.3
Пишу ВК, не могу подключить к 1с на ubuntu. Даже экзапл от 1с не подключается. Поэтому вопрос по нему:
1) Пытаюсь подключи ВК из примера VNCOMPS, приведённым в статье
(ссылку можно найти в самом конце: «Копирование»).
Внутри в проекте NativeApi есть makefile. С его помощью я собираю.so библиотеку на Ununtu.
Но при "ПодключитьВнешнююКомпоненту" 1с вылетает.
Аналогично, если собираю при помощи "build.sh" (в корне проекта).
В самом makefile меняю флаг с m32 на m64, т.к. 1с и сама система x64. (с параметром m32 не подцепляется всё равно)
Вот пример вызова ВК из 1С 8.3:
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту
("/home/alexeyubuntux64-20
gb/Документы/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ТипВнешнейКомпоненты.Native);
Есть статейка как раз на эту тему.
Но, насколько я вижу, все эти моменты уж учтены исправили в VNCOMPS примере.
Но по сути дело в параметрах компиляции. Мб 32битная внешняя компонента подцепляется к 32-x битной 1с нормально, но я развернул на Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. И хочу к ней подцепить ВК.
Есть у кого мысли, как решить этот вопрос?)
VNCOMPS-пример должен работать, но походу надо поправить параметры сборки, или сама платформа, на которой я тестирую - некорректна.
Ответ:
Интересно, а на яве можно внешнюю компоненту написать?
Вопрос: Не подключается внешняя компонента (Native)
Скомпилировал пример c ИТС, для 64 и 32 битной системы.
Подключаю так:
РезультатПодключения = ПодключитьВнешнююКомпоненту(ПутьКДЛЛ, "Comp", ТипВнешнейКомпоненты.Native);
На одном ПК подключение проходит, на другом нет. Есть разница в ос. Где подключение проходит, там стоит Win7, где нет Win10. При этом на ПК, где не работает моя компонента, работают типовые компоненты.
Тестировал на разных платформах (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).
Как понять почему не подключается?
Ответ:
vc_redist не забыл?
Вопрос: 1С8 и внешняя компонента с типом Native