Решаване на проблеми с регистриране на външни компоненти в терминала. Инсталиране на външни компоненти и разширения на платформата Свързване на външни компоненти 1s 8.3
Често програмистите имат проблеми със свързването на външни компоненти (например драйвери за търговско оборудване), когато потребителите работят с 1C, свързвайки се към сървъра чрез терминал.
Това се дължи на някои особености на глобалната контекстна функция ConnectExternalComponent().
В този случай потребителите виждат например снимката, представена в анонса на статията.
Докато при работа от локални компютри няма проблеми със свързването на външни компоненти.
С какво е свързано това? Това е така, защото когато потребителите работят през терминален сървър, те имат по-малко права, отколкото когато работят на локален компютър.
Можете лесно да проверите това, ако влезете в терминалния сървър с акаунт с администраторски права.
Причината за тази разлика е, че 1C не може да регистрира външен компонент в регистъра, когато потребителят работи в терминала с нормални права, т.к. обикновен потребител няма разрешение да пише в клона на системния регистър HKEY_CLASSES_ROOT.
Публикациите по темата за свързване на външни компоненти в терминала предлагат различни методи за решаване на този проблем.
Например тези:
1. Стартирайте 1C за първи път с административни права.
Тази опция не винаги работи. По-долу ще обясня защо.
2. Дайте разрешение на обикновените потребители на терминали да пишат в клона на системния регистър HKEY_CLASSES_ROOT.
Недостатъчно напредналите потребители не трябва да правят това, в противен случай може да има проблеми.
3. Използвайки различни джаджи, регистрирайте VK от името на потребител с пълни права.
И това не е добре.
И така, какъв е най-добрият начин да излезете от тази ситуация?
Предлагам моето решение на този проблем. По мое мнение е прост и красив, не е предлаган преди на Lancer.
Докато проучвах този проблем, си зададох въпроса: защо 1C дори се опитва да регистрира VK по нов път? В крайна сметка тя вече е регистрирана в системата.
Оказа се, че в типичните конфигурации на 1C (например „Управление на търговията“) се използва следният синтаксис на метода на глобалния контекст ConnectExternalComponent():
ConnectExternalComponent("Directory.ConnectedEquipment.Layout.DriverATOLBarcodeScanner", "ATOLScanner");
Както можете да видите, драйверът VC е свързан от оформлението "ATOLBarcode Scanner Driver" на директорията "Connected Equipment".
Какво се случва тогава?
1C запазва компонента във временната папка на потребителя, например "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"
и се опитва да го регистрира в ключа на системния регистър HKEY_CLASSES_ROOT по този път.
На терминала обикновените потребители нямат права да променят този клон на регистъра, така че компонентът не се свързва с тях.
Сега нека поговорим как да се измъкнем от тази ситуация.
Метод на глобалния контекст ConnectExternalComponent() има няколко опции за синтаксис. Това ще използваме.
И така, стъпка по стъпка:
1. Регистрирайте външния компонент с помощта на помощната програма regsvr32.exe на терминалния сървър в папката C:\WINDOWS\SYSTEM32 за 32-битова ОС или в папката C:\WINDOWS\SYSWOW64 за 64-битова ОС.
2. Използвайте една от двете допълнителни опции за синтаксис за метода ConnectExternalComponent():
Опция 1:
ConnectExternalComponent("C:\WINDOWS\SysWOW64\Scaner1C.dll", "ATOLScanner", ExternalComponentType.COM);
DriverObject = New("AddIn.ATOLScanner.Scaner45");
Вариант 2:
ProgID = "AddIn.Scaner45";
ConnectExternalComponent(ProgID);
DriverObject = Нов (ProgID);
Според мен вариант номер 2 е за предпочитане.
В същото време 1C не се опитва да пререгистрира VK, използвайки нов път в регистъра и по този начин всички проблеми са решени.
Е, това е всичко. Успех в работата!
/
Разработка на потребителски интерфейс
Инсталиране на външни компоненти и разширения на платформата
1.1. Инсталирането на външни компоненти и разширения на платформата трябва да бъде интерактивно. Потребителят трябва сам да вземе решение относно инсталирането. Диалоговият прозорец за инсталиране трябва да показва за какво е необходим компонентът (разширението) и какво няма да работи, ако не бъде инсталиран.
Например, неправилно е да се използват конструкции като
Ако не свържете външния компонент (...), тогава инсталирайте външния компонент (...)Правилно е да зададете въпрос на потребителя изрично:
За да продължите да работите, трябва да инсталирате външен компонент. Външен компонент ще ви позволи да работите с отчитане. За да инсталирате компонента, щракнете върху „Инсталиране“. След като инсталацията приключи, щракнете върху Продължи.
- Потребителят използва командата „Изпращане на отчет“.
- Тази конфигурация изисква инсталиране на външен компонент.
- Конфигурацията проверява дали компонентът е инсталиран.
- Ако компонентът не е инсталиран, показва на потребителя информация, че за изпращане на отчет компонентът трябва да бъде инсталиран и бутон, който предизвиква инсталирането на компонента.
- Потребителят натиска бутона, инсталацията се извършва.
- След инсталирането, потребителят кликва върху бутона „Продължете да изпращате отчет“.
- Програмата продължава да изпраща отчета.
Този сценарий ще гарантира, че компонентите (разширенията) се инсталират без проблеми във всички поддържани браузъри, включително браузъра FireFox.
2. Приложното решение трябва да предоставя инструменти за потребителя за инсталиране на външни компоненти и разширения по всяко време на работа. По този начин те могат да бъдат инсталирани не само по време на решаването на дадена задача, но и под формата на отделно действие (от някакъв административен режим).
Когато се използва в конфигурация Стандартни подсистемни библиотекиза да инсталирате разширение за работа с файлове, използвайте общата команда InstallExtensionWorking With Files, който се препоръчва да се постави във формуляра за лични настройки на потребителя (вижте общия формуляр _DemoMySettingsв демо конфигурация). В същата форма се препоръчва да поставите команди за инсталиране на външни компоненти, които потребителят може да се нуждае от работата си. |
Това се дължи на някои особености на функцията за глобален контекст ConnectExternalComponent().
Често програмистите имат проблеми със свързването на външни компоненти (например драйвери за търговско оборудване), когато потребителите работят с 1C, свързвайки се към сървъра чрез терминал.
В този случай потребителите виждат например тази снимка:
Докато при работа от локални компютри няма проблеми със свързването на външни компоненти.
С какво е свързано това? Това е така, защото когато потребителите работят през терминален сървър, те имат по-малко права, отколкото когато работят на локален компютър.
Можете лесно да проверите това, ако влезете в терминалния сървър с акаунт с администраторски права.
Причината за тази разлика е, че 1C не може да регистрира външен компонент в регистъра, когато потребителят работи в терминала с нормални права, т.к. обикновен потребител няма разрешение да пише в клона на системния регистър HKEY_CLASSES_ROOT.
Публикациите по темата за свързване на външни компоненти в терминала предлагат различни методи за решаване на този проблем.
Например тези:
1. Стартирайте 1C за първи път с административни права.
Тази опция не винаги работи. По-долу ще обясня защо.
2. Дайте разрешение на обикновените потребители на терминали да пишат в клона на системния регистър HKEY_CLASSES_ROOT.
Недостатъчно напредналите потребители не трябва да правят това, в противен случай може да има проблеми.
3. Използвайки различни джаджи, регистрирайте VK от името на потребител с пълни права.
И това не е добре.
И така, какъв е най-добрият начин да излезете от тази ситуация?
Предлагам моето решение на този проблем. Според мен - просто и красиво.
Докато проучвах този проблем, си зададох въпроса: защо 1C дори се опитва да регистрира VK по нов път? В крайна сметка тя вече е регистрирана в системата.
Оказа се, че в типичните конфигурации на 1C (например „Управление на търговията“) се използва следният синтаксис за метода на глобалния контекст Connect External Component():
ConnectExternalComponent("Directory.ConnectedEquipment.Layout.DriverATOLBarcodeScanner", "ATOLScanner");
Както можете да видите, драйверът VC е свързан от оформлението "ATOLBarcode Scanner Driver" на директорията "Connected Equipment".
Какво се случва тогава?
1C запазва компонента във временната папка на потребителя, например "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"
и се опитва да го регистрира в клона на регистъра HKEY_CLASSES_ROOTточно по този път.
На терминала обикновените потребители нямат права да променят този клон на регистъра, така че компонентът не се свързва с тях.
Сега нека поговорим как да се измъкнем от тази ситуация.
Глобалният контекстен метод ConnectExternalComponent() има няколко опции за синтаксис. Това ще използваме.
И така, стъпка по стъпка:
1. Регистрирайте външния компонент с помощта на помощната програма regsvr32.exe на терминалния сървър в папката C:\WINDOWS\SYSTEM32 за 32-битова ОС или в папката C:\WINDOWS\SYSWOW64 за 64-битова ОС.
2. Използвайте една от двете допълнителни опции за синтаксис за метода ConnectExternalComponent():
Опция 1:
ConnectExternalComponent("C:\WINDOWS\SysWOW64\Scaner1C.dll", "ATOLScanner", ExternalComponentType.COM);
DriverObject = New("AddIn.ATOLScanner.Scaner45");
Вариант 2:
ProgID = "AddIn.Scaner45";
ConnectExternalComponent(ProgID);
DriverObject = Нов (ProgID);
Според мен вариант номер 2 е за предпочитане.
В същото време 1C не се опитва да пререгистрира VK, използвайки нов път в регистъра и по този начин всички проблеми са решени.
Е, това е всичко. Успех в работата!
[трябва да се регистрирате, за да видите връзката]
Въпрос: Инсталиране на външен компонент
Моля, кажете ми как да инсталирам външен компонент. При изпълнение на следния код се извежда грешка. В оформлението намерете NameDecl.dll
Опит за SetExternalComponent("GeneralLayout.Layout"); Изключение EndTry;
Грешка: Неуспешно инсталиране на външен компонент!
Отговор: ()
ConnectExternalComponent("GeneralLayout.Layout", "NameDecl", ExternalComponentType.Native) връща FALSE.
New("AddIn.NameDecl.CNameDecl", Undefined) = (()): Тип недефиниран (AddIn.NameDecl.NameDecl)
Въпрос: Свързване на външен компонент в 1s 8.3.6 и Win8
Трябва да свържете външния компонент vk_rs232.dll към самонаписаната конфигурация. Изглежда, че е регистриран чрез regsvr32.exe. „Изглежда“, защото получих съобщение, че „компонентът е регистриран, но има нещо нередно със защитната стена“. Разчитайки на първата половина на съобщението, пиша кода в 1C
AfterConnecting = Ново описание на предупреждението ("AfterConnectingVK", ThisForm); StartInstallingExternalComponents(,"C:\Controller\vk_rs232.dll"); StartConnectingExternalComponents(AfterConnecting,"C:\Controller\vk_rs232.dll","DLL_Scales");
и получавам грешката, че
„Инсталирането на външен компонент е неуспешно! Компонент за клиентското приложение, което използвате, може да липсва!“
И сега не разбирам:
1. Може би компонентът не е регистриран в системния регистър - как мога да го проверя там?
2. Може би неговата „версия“ не работи под Win8, въпреки че го имам 32-битов.
3. Може би самият 1C е твърде нов, т.е. Съответно не може да работи с тази dll?
4. Е, тривиално е - пиша нещо грешно.
Отговор:И всичко това ме доведе до следващия проблем. VneshComp е инсталиран, сега трябва да го свържете. И ето ги и двата варианта
ConnectExternalComponent("C:\Controller\vk_rs232.dll","Libra")
ConnectExternalComponent("GeneralLayout.Layout","Libra")
раздайте НЕВЯР!!!
Въпрос: Външен компонент.dll
Добър ден на всички
Въпрос.
Dll компонент, който работи чудесно в 1C 7.7
1s 8.1 изобщо не иска да стартира...
Опитах да го поставя в C:\Program Files\1cv81\bin\cache1c.dll
Опитах да се регистрирам с помощта на regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll"
Регистрира се без проблеми.
Когато искам да го осъществя, получавам съобщение за грешка:
Грешка при зареждане на външен компонент! cache1c.dll
Процедура ButtonExecutePress(Button) Опит за зареждане на външен компонент( "C:\Програмни файлове\1cv81\bin\cache1c.dll"); Доклад за изключение ( „Грешка при зареждане на външен компонент!“+ "cache1c.dll" ); EndAttempt; Опит // Вземете компонентния обект. // m = Нов ("cache1c.GTMcmd"); m = Нов COMObject("cache1c.GTMcmd"); Доклад за изключение(); EndAttempt; Край на процедурата
Отговор:Банално е до невъзможност...
Трябва да правите пауза между разговорите (милисекунди)...
Процедура ButtonExecutePress(Button) Опит // Получаване на компонентен обект. m = Нов COMObject("cache1c.GTMcmd"); Доклад за изключение ( „Неуспешно създаване на обект на външен компонент“); EndAttempt; m.RemoteHost = "192.168.1.101" ; m.RemotePort = 6330; m.Connect(); m.Pause(100); ...... и т.н
За 1c 7.7 - това не е необходимо, оказва се, че обработката е по-бърза.
Въпрос: Външен компонент Native Api в C++ за Linux (Ubuntu x64) на 1C 8.3
Пиша на VK, но не мога да се свържа с 1c на ubuntu. Дори изпълнимият файл от 1c не се свързва. Така че въпрос за това:
1) Опитвам се да свържа VK от примера VNCOMPS, даден в статията
(връзката може да бъде намерена в самия край: „Копиране“).
В проекта NativeApi има makefile. С негова помощ изграждам .so библиотека на Ununtu.
Но когато „Свързване на външен компонент“ 1c се срива.
По същия начин, ако изграждам с помощта на "build.sh" (в корена на проекта).
В самия makefile сменям флага от m32 на m64, т.к 1c и самата x64 система. (с параметър m32 така или иначе не се свързва)
Ето пример за извикване на VK от 1C 8.3:
Връзката е извършена = ConnectExternalComponent("/home/alexeyubuntux64-20 gb/Documents/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ExternalComponentType.Native); Има статия само по тази тема.
Но доколкото виждам, всички тези точки вече са взети предвид и коригирани в примера на VNCOMPS.
Но по същество това е въпрос на параметри на компилация. MB 32-битов външен компонент се свързва към 32-битов 1c нормално, но аз го внедрих на Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. И искам да се свържа с нея във VK.
Някой има ли идеи как да се реши този проблем?)
Примерът за VNCOMPS трябва да работи, но параметрите на компилация трябва да бъдат коригирани или самата платформа, на която тествам, е неправилна.
Отговор:Чудя се, възможно ли е да напиша външен компонент в Java?
Въпрос: Работа с външен компонент с 1C сървър...
Добър ден,
Има външен компонент, написан на C++, чиято задача е да получи информация от външна база данни и да върне резултата от заявката под формата на таблица със стойности в 1C.
За генериране на таблица със стойности в текущия момент се използва интерфейсът IDispatch* pBackConnection, получен като параметър във функцията Init(). След това просто използвам 1C функции, за да създам таблица със стойности, да я попълня и да я върна към втория параметър в CallAsFunc(...).
Проблемите започнаха с прехода към 1C тънки клиенти. От страната на сървъра външният компонент не се стартира наистина. Можете да го стартирате от страна на клиента, но всичко изглежда като патерици и изпада от общата логика „клиент-сървър“ в 1C. Например, клиентът не разбира какво е таблица със стойности, проблеми с „глобални“ променливи, сесии и т.н.
NativeAPI е още по-ограничен в това отношение.
Танцуването с тамбурина доведе до факта, че успях да стартирам външен компонент под 1C сървъра, НО работата продължава, докато не се направи опит за извикване на Invoke на pBackConnection. 64-битовата версия на сървъра 8.2 се опитва да направи нещо, докато не изтече времето, 32-битовата версия (VK естествено също е 32-битова) просто пада веднага.
Предполагам, че сървърът 1C не поддържа този режим на работа.
Съответно възникват въпроси: това временно ли е или логиката на 1C се свежда до отмяна на тази схема на работа? Ако е невъзможно да се създадат вътрешни 1C структури (таблица със стойности) по този начин, има ли по принцип описание какво представлява таблица със стойности на ниво система, за да се опитаме да я създадем в C++, го попълнете и след това просто го плъзнете в 1C като параметър за връщане? Иска ми се поне да се ориентирам в коя посока да копая.
Благодаря ти.
Отговор:
Пишеш едно, а имаш предвид друго.
В средата на 1C декларирането на променливи, които ще бъдат видими в различни сесии, сега не е невъзможно, а преди не е имало такава възможност. Друга сесия е физически различен процес.
Сесията е сесия, свързваща се с база данни, т.е. потребителска сесия. Или влагате нещо свое в тази концепция?
В рамките на една сесия беше възможно и сега е възможно да се декларират променливи в модула на сесията, които ще живеят и ще бъдат видими в сесията от различни места... всъщност има 4 от тях.
- Сесиен модул;
- Модул за редовно приложение;
- Модул за управлявано приложение;
- Модул за външна връзка.
Е, разбира се, трябва да запомните контекста. Контекстът на сървъра не е директно достъпен от страна на клиента и обратно.
Всъщност архитектурата на 1C предвижда обменът на данни да става по следния начин:
- чрез параметри/връщане на процедури/функции;
- чрез т.нар. параметри на сесията (не могат да бъдат обекти, но реално видими в палитрата).
Таблица във формуляра... свързана ли е с някаква обектна таблица (обработка, например)? или не. Ако отговорът е да, значи е достъпен на сървъра (&OnServer) и редактирайте там....
И все пак, да, таблицата със стойности не е налична в UV от страна на клиента. Е, това реши 1C.
Хайде! Работи с Excel, работи с FSO и куп други неща, но не работи тук. Хванете грешката и анализирайте....
опит
...
вашите действия
...
Изключение
str = ErrorDescription();
EndAttempt;
При съвременните хардуерни възможности това изобщо не е аргумент.
Чисто твое лично мнение. Няма нищо общо с реалността. Не по никакъв начин. Повтарям още веднъж, 1C работи чудесно с COM. Както с in-proc, така и с out-proc.
Моля, предоставете кода, който използвате за изтегляне и се свържете с VK.
Между другото, VK... в твоя случай COM ли е или Native API?
Ако COM, тогава го регистрирате като... чрез regsvr32... как тогава "разрешавате" проблема с битовата дълбочина?
Въпрос: 1C8 и външен компонент с тип Native