Установка внешней компоненты. Решение проблем с регистрацией внешних компонент в терминале 1с установка внешней компоненты не выполнена
Зачастую у программистов возникают проблемы с подключением внешних компонент (например, драйверов торгового оборудования), когда пользователи работают с 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С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.
Ну вот собственно и все. Успехов в работе!
/
Разработка пользовательских интерфейсов
Установка внешних компонент и расширений платформы
1.1. Установка внешних компонент и расширений платформы должна быть интерактивной. Пользователь должен самостоятельно принять решение об установке. В диалоге установки должно быть указано, для чего нужна компонента (расширение) и что не будет работать, если ее не устанавливать.
Например, неправильно использовать конструкции вида
Если Не ПодключитьВнешнююКомпоненту(…) Тогда УстановитьВнешнююКомпоненту(…)Правильно задавать пользователю вопрос в явном виде:
Для продолжения работы требуется установить внешнюю компоненту. Внешняя компонента позволит работать с отчетностью. Для установки компоненты нажмите "Установить". После завершения установки нажмите "Продолжить".
- Пользователь воспользовался командой «Отправить отчет»
- Для этого конфигурации необходимо, чтобы была установлена какая-либо внешняя компонента.
- Конфигурация проверяет, установлена ли компонента.
- Если компонента не установлена, отображает пользователю информацию о том, что для отправки отчета нужно установить компоненту и кнопку , вызывающую установку компоненты.
- Пользователь нажимает на кнопку, выполняется установка.
- После установки пользователь нажимает на кнопку «Продолжить отправку отчета»
- Программа продолжает отправлять отчет.
Такой сценарий позволит обеспечить, чтобы компоненты (расширения) устанавливались без проблем на всех поддерживаемых браузерах, в том числе, в браузере FireFox .
2. В прикладном решении должны быть предоставлены инструменты для установки пользователем внешних компонент и расширений в любой момент работы. Таким образом, их можно установить не только в ходе решения какой-то задачи, но и в виде отдельного действия (из некоторого административного режима).
При использовании в конфигурации Библиотеки стандартных подсистем для установки расширения для работы с файлами предназначена общая команда УстановитьРасширениеРаботыСФайлами , которую рекомендуется размещать в форме персональных настроек пользователя (см. общую форму _ДемоМоиНастройки в демонстрационной конфигурации). В этой же форме рекомендуется размещать команды по установке внешних компонент, которые могут потребоваться пользователю при его работе. |
Это связано с некоторыми особенностями работы функции глобального контекста ПодключитьВнешнююКомпоненту()
.
Зачастую у программистов возникают проблемы с подключением внешних компонент (например, драйверов торгового оборудования), когда пользователи работают с 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С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.
Ну вот собственно и все. Успехов в работе!
[необходимо зарегистрироваться для просмотра ссылки]
Вопрос: Установка внешней компоненты
Подскажите плз как установить внешнюю компоненту. При исполнении следующего кода выдается ошибка. В макете находить NameDecl.dll
Попытка
УстановитьВнешнююКомпоненту("ОбщийМакет.Макет");
Исключение
КонецПопытки
;
Ошибка: Установка внешней компоненты не выполнена!
Ответ:
()
ПодключитьВнешнююКомпоненту("ОбщийМакет.Макет", "NameDecl", ТипВнешнейКомпоненты.Native) выдает ЛОЖЬ
,
Новый("AddIn.NameDecl.CNameDecl", Неопределено) = {()}: Тип не определен (AddIn.NameDecl.NameDecl)
Вопрос: Подключение внешней компоненты в 1с 8.3.6 и Win8
К самописной конфигурации надо подключить ВнешКомпоненту vk_rs232.dll. Вроде зарегистрировала через regsvr32.exe. "Вроде" потому, что получила сообщение что "компонента зарегистрирована, но чего-то там с брандмауэром". Понадеявшись на первую половину сообщения, пишу код в 1с
ПослеПодключения = Новый ОписаниеОповещения("ПослеПодключенияВК",ЭтаФорма); НачатьУстановкуВнешнейКомпоненты(,"C:\Controller\vk_rs232.dll"); НачатьПодключениеВнешнейКомпоненты(ПослеПодключения,"C:\Controller\vk_rs232.dll","ДЛЛ_Весы");
и получаю ошибку, что
"Установка внешней компоненты не выполнена! Возможно отсутствует компонента для используемого клиентского приложения!".
И теперь я не пойму:
1. Может все же компонента не зарегистрировалась в реестре - как ее там проверить?
2. Может ее "версия" не работает под Win8, хотя она у меня 32-бит.
3. Может сама 1с слишком новая, т.е. соответственно не может работать с этой dll-кой?
4. Ну и банальное - я пишу что-то не то.
Ответ:
И все это привело меня в следующей проблеме. ВнешКомп Установлена, теперь ее надо Подключить. И тут оба варианта
ПодключитьВнешнююКомпоненту("C:\Controller\vk_rs232.dll","Весы")
ПодключитьВнешнююКомпоненту("ОбщийМакет.Макет","Весы")
выдают ЛОЖЬ!!!
Вопрос: Внешняя компонента.dll
Всем Доброго дня.
Такой вопрос.
Компонента dll , которая прекрасно работает в 1С 7.7
в 1с 8.1 не хочет вообще загрузиться...
Пробовал и вставить ее в C:\Program Files\1cv81\bin\cache1c.dll
Пробовал регистрировать средствами regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll"
Регистрируется без проблем.
Когда хочу к ней обратится, получаю сообщение об ошибке:
Ошибка загрузки внешней компоненты! cache1c.dll
Процедура КнопкаВыполнитьНажатие(Кнопка)
Попытка
ЗагрузитьВнешнююКомпоненту("C:\Program Files\1cv81\bin\cache1c.dll"
);
Исключение
Сообщить("Ошибка загрузки внешней компоненты!"
+ " cache1c.dll"
);
КонецПопытки;
Попытка
// Получить объект компоненты.
// m = Новый ("cache1c.GTMcmd"
);
m = Новый COMОбъект("cache1c.GTMcmd"
);
Исключение
Сообщить();
КонецПопытки;
КонецПроцедуры
Ответ:
Банально до невозможности...
Нужно выдержать паузы между вызовами (миллисекунды)...
Процедура КнопкаВыполнитьНажатие(Кнопка)
Попытка
// Получить объект компоненты.
m = Новый COMОбъект("cache1c.GTMcmd"
);
Исключение
Сообщить("Не удалось создать объект внешней компоненты"
);
КонецПопытки;
m.RemoteHost = "192.168.1.101"
;
m.RemotePort = 6330;
m.Подключить();
m.Пауза(100);
......
итд
Для 1с 7.7 - это не нужно, получается, что шустрее обращение.
Вопрос: Внешняя компонента 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-пример должен работать, но походу надо поправить параметры сборки, или сама платформа, на которой я тестирую - некорректна.
Ответ:
Интересно, а на яве можно внешнюю компоненту написать?
Вопрос: Работа внешней компоненты с сервером 1С...
Добрый день,
Имеется внешняя компонента, написанная на С++, задача которой получение информации из внешней базы данных и возврат результата запроса в виде Таблицы значений в 1С.
Для формирования таблицы значений на текуший момент используется интерфейс IDispatch* pBackConnection, получаемый в качестве параметра в функции Init(). Далее я просто, используя функции 1С формирую таблицу значений, заполняю ее и возвращаю ее во второй параметр в CallAsFunc(...).
Проблемы начались с переходом на тонких клиентов 1С. На стороне сервера внешняя компонента толком не запускается. Можно запустить на стороне клиента, но это все выглядит как костыли и выпадает из общей логики "клиент-сервер" в 1С. Например клиент не понимает, что такое таблица значений, проблемы с "глобальными" переменными, сеансами и т.п.
NativeAPI еще более урезан в этом плане.
Танцы с бубном привели к тому, что я смог запустить внешнюю компоненту под сервером 1С, НО работа происходит до того момента, пока не производится попытка вызвать Invoke у pBackConnection. 64-битная версия сервера 8.2 что-то пытается делать, пока не отваливается по таймауту, 32-битная (ВК естественно тоже 32 битная) просто сразу отваливается.
Предполагаю, что сервер 1С не обслуживает этот режим работы.
Соответственно возникают вопросы, это временно или логика 1С сводится к отмене этой схемы работы? Если создать внутренние структуры 1С (таблицу значений) таким способом нельзя, есть ли в принципе описание, что из себя представляет таблица значений на системном уровне, чтобы попытаться создать ее на С++ , заполнить, а затем просто подсунуть 1С в качестве возвратного параметра? Хотелось бы хотя бы получить направление, в какую сторону копать.
Спасибо.
Ответ:
Вы пишите одно, и имеете в виду другое.
В среде 1С, объявление переменных, которые будут видны в разных сеансах не невозможна сейчас, и не было такой возможности ранее. Другой сеанс, это физически другой процесс.
Сеанс, это сеанс подключения к базе данных, т.е. сеанс работы пользователя. Или вы что-то своё вкладываете а это понятие?
В рамках одного сеанса можно было, и можно сейчас, объявить переменные в модуле сеанса, которые будут жить и будут видны в рамках сеанса из разных мест... вообще-то, их 4-ре штуки.
- Модуль сеанса;
- Модуль обычного приложения;
- Модуль управляемого приложения;
- Модуль внешнего соединения.
Ну и естественно, нужно помнить про контекст. Серверный контекст напрямую не доступен на стороне клиента и наоборот.
Вообще то, архитектурой 1С предусмотрено, что обмен данными будет идти:
- по средствам параметров/возвратов процедур/функций;
- по средствам так называемых параметров сеансов (не могут быть объектами, ну собственно видно в палитре).
Таблица на форме... а она связана с какой-либо таблицей объекта (обработки, например) ? или нет. Если да, то она доступна и на сервере (&НаСервере) там и редактируйте....
И таки да, ТаблицаЗначений не доступна в УФ на стороне клиента. Ну уж так решила 1С.
Да ладно! Вот с Excel работает, с FSO работает и кучей всего остального, а тут тут не работает. Отлавливайте ошибку и анализируйте....
Попытка
...
ваши действия
...
Исключение
стр = ОписаниеОшибки();
КонецПопытки;
При современных аппаратных возможностях, это вообще не аргумент.
Сугубо Ваше лично мнение. Ничего общего с реальностью не имеет. Ни в каком виде. Повторю ещё раз, 1С прекрасно работает с COM. Как с in-proc, так и с out-proc.
Приведите, код, которым вы загружаете и обращаетесь в ВК.
Кстати, ВК... в Вашем случае, это COM или Native API ?
Если COM, то вы регистрируете её как... через regsvr32... как тогда "разруливаете" вопрос разрядности?
Вопрос: 1С8 и внешняя компонента с типом Native