Publikimet e reja të "1C: Trade Management": përditësim pa zhvillim. Kontabiliteti operativ bëhet i rregulluar


Kjo është për shkak të disa veçorive të funksionit të kontekstit global ConnectExternalComponent().

Shpesh programuesit kanë probleme me lidhjen e komponentëve të jashtëm (për shembull, drejtuesit për pajisjet komerciale) kur përdoruesit punojnë me 1C, duke u lidhur me serverin përmes një terminali.

Në këtë rast, përdoruesit shohin, për shembull, këtë foto:

Ndërsa kur punoni nga kompjuterët lokalë nuk ka probleme me lidhjen e komponentëve të jashtëm.

Me çfarë lidhet kjo? Kjo ndodh sepse kur përdoruesit punojnë përmes një serveri terminal, ata kanë më pak të drejta sesa kur punojnë në një kompjuter lokal.

Mund ta verifikoni lehtësisht këtë nëse hyni në serverin e terminalit nën një llogari me të drejta administrative.

Arsyeja për këtë ndryshim është se 1C nuk mund të regjistrojë një komponent të jashtëm në regjistër kur përdoruesi është duke punuar në terminal me të drejta normale, sepse një përdorues i rregullt nuk ka leje për të shkruar në degën e regjistrit të sistemit HKEY_CLASSES_ROOT.

Publikimet mbi temën e lidhjes së komponentëve të jashtëm në terminal ofrojnë një sërë metodash për zgjidhjen e këtij problemi.

Për shembull, këto:

1. Nisni 1C për herë të parë nën të drejtat administrative.

Ky opsion nuk funksionon gjithmonë. Unë do të shpjegoj pse më poshtë.

2. Jepni përdoruesve të zakonshëm të terminalit leje për të shkruar në degën e regjistrit të sistemit HKEY_CLASSES_ROOT.

Përdoruesit jo mjaftueshëm të avancuar nuk duhet ta bëjnë këtë, përndryshe mund të ketë probleme.

3. Duke përdorur pajisje të ndryshme, regjistroni VK në emër të një përdoruesi me të drejta të plota.

Nuk është as mirë.

Pra, cila është mënyra më e mirë për të dalë nga kjo situatë?

Unë ofroj zgjidhjen time për këtë problem. Sipas mendimit tim - e thjeshtë dhe e bukur.

Ndërsa studioja këtë problem, i bëra vetes pyetjen: pse 1C madje po përpiqet të regjistrojë VK duke përdorur një shteg të ri? Në fund të fundit, ajo tashmë është e regjistruar në sistem.

Çështja doli të ishte se në konfigurimet tipike 1C (për shembull, "Menaxhimi i Tregtisë") sintaksa e mëposhtme përdoret për metodën e kontekstit global Lidhni komponentin e jashtëm ():

ConnectExternalComponent("Directory.ConnectedEquipment.Layout.DriverATOLScanner Barcode", "ATOLScanner");

Siç mund ta shihni, shoferi VC është i lidhur nga faqosja "ATOLBarcode Scanner Driver" në direktorinë "Connected Equipment".

Çfarë ndodh atëherë?

1C ruan komponentin në dosjen e përkohshme të përdoruesit, për shembull "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

dhe tenton ta regjistrojë në degën e regjistrit HKEY_CLASSES_ROOT pikërisht në këtë rrugë.

Në terminal, përdoruesit e zakonshëm nuk kanë të drejtë të ndryshojnë këtë degë të regjistrit, kështu që komponenti nuk lidhet me ta.

Tani le të flasim se si të dalim nga kjo situatë.

Metoda e kontekstit global ConnectExternalComponent() ka disa opsione sintakse. Kjo është ajo që ne do të përdorim.

Pra, hap pas hapi:

1. Regjistroni komponentin e jashtëm duke përdorur mjetin regsvr32.exe në serverin terminal në dosjen C:\WINDOWS\SYSTEM32 për një OS 32-bit ose në dosjen C:\WINDOWS\SYSWOW64 për një OS 64-bit.

2. Përdorni një nga dy opsionet shtesë të sintaksës për metodën ConnectExternalComponent():

Opsioni 1:

ConnectExternalComponent("C:\WINDOWS\SysWOW64\Scaner1C.dll", "ATOLScanner", ExternalComponentType.COM);

DriverObject = I ri ("AddIn.ATOLScanner.Scaner45");

Opsioni 2:

ProgID = "AddIn.Scaner45";

ConnectExternalComponent (ProgID);

DriverObject = New(ProgID);

Sipas mendimit tim, opsioni numër 2 është i preferueshëm.

Në të njëjtën kohë, 1C nuk përpiqet të ri-regjistrojë VK duke përdorur një shteg të ri në regjistër dhe kështu të gjitha problemet zgjidhen.

Epo, kjo është e gjitha. Suksese ne pune!

[Duhet të regjistroheni për të parë lidhjen]

Pyetje: Komponenti i jashtëm Native Api në C++ për Linux (Ubuntu x64) në 1C 8.3


Unë po shkruaj në VK, por nuk mund të lidhem me 1c në ubuntu. Edhe exe 1s nuk lidhet. Pra, një pyetje në lidhje me të:

1) Po përpiqem të lidh VK nga shembulli VNCOMPS i dhënë në artikull

(lidhja mund të gjendet në fund: "Kopjimi").
Ekziston një skedar i krijuar brenda projektit NativeApi. Me ndihmën e saj po ndërtoj një bibliotekë .so në Ununtu.
Por kur "Connect External Component" 1c prishet.
Po kështu, nëse ndërtoj duke përdorur "build.sh" (në rrënjën e projektit).

Në vetë makefile e ndryshoj flamurin nga m32 në m64, sepse 1c dhe vetë sistemi x64. (me parametrin m32 nuk lidhet gjithsesi)
Këtu është një shembull i thirrjes së VK nga 1C 8.3:
Lidhja u krye = ConnectExternal Component("/home/alexeyubuntux64-20 gb/Documents/VNCOMP83/shembull/NativeAPI/AddInNative.so", "AddInNative", ExternalComponentType.Native); Ekziston një artikull vetëm për këtë temë.
Por, me sa shoh, të gjitha këto pika tashmë janë marrë parasysh dhe korrigjuar në shembullin VNCOMPS.

Por në thelb është një çështje e parametrave të përpilimit. Një komponent i jashtëm MB 32-bit lidhet normalisht me një 1c 32-bit, por unë e vendosa atë në Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. Dhe unë dua të lidhem me të në VK.

A ka dikush ndonjë ide se si ta zgjidhim këtë problem?)
Shembulli VNCOMPS duhet të funksionojë, por parametrat e ndërtimit duhet të rregullohen, ose vetë platforma në të cilën po testoj është e pasaktë.

Përgjigje: Pyes veten, a është e mundur të shkruhet një komponent i jashtëm në Java?

Pyetje: Komponenti i jashtëm (Native) nuk mund të lidhet


Kam përpiluar një shembull me ITS, për sistemet 64 dhe 32 bit.

Unë lidhem kështu:
Rezultati i lidhjes = ConnectExternalComponent (KDLLPath, "Comp", ExternalComponentType.Native); Lidhja funksionon në një kompjuter, por jo në tjetrin. Ka një ndryshim në OS. Aty ku është bërë lidhja, është Win7, ku nuk ka Win10. Në të njëjtën kohë, në kompjuterin ku komponenti im nuk funksionon, funksionojnë komponentët standardë.

Testuar në platforma të ndryshme (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).

Si mund ta kuptoj pse nuk lidhet?

Përgjigje: vc_redist harrove?

Pyetja: 1C8 dhe një komponent i jashtëm me tipin Native


Mirembrema.
Unë kam një konfigurim BP 3.0.50.12 dhe një dëshirë për të zbatuar peshimin nga kompania Vesy-Soft duke përdorur UniServerAuto në të.
Zhvilluesit e përpiluan komponentin në Native për Windows 32 dhe 64 dhe e arkivuan atë me skedarin kryesor. Ekziston edhe një shembull për 1C se si mund të llogaritet pesha. Në të, duke përdorur një plan urbanistik me të dhëna binare, tregohet ky arkiv, siç e kuptoj unë. Në shembull, gjithçka është në rregull: komponenti është instaluar, lidhur, më pas vendoset lidhja dhe lexohet pesha.
Por sapo filloni ta transferoni në 1C, pesha nuk lexohet. Gjithçka duket se është shkruar thjesht, por nuk e kuptoj se ku është grabuja.
Kush ka pak kohë - ndihmë, shiko me një sy, ndoshta zgjidhja është në sipërfaqe, por unë po shkoj diku në vendin e gabuar dhe po bëj gjënë e gabuar. Nuk më është dashur të punoj kurrë më parë me teknologjinë vendase...

Dhe në bashkëngjitje është teksti im përpunues

Përgjigje:

Epo, kam një lajm ...
Sapo fillova të shoh hap pas hapi se në cilën pikë do të fillonte të dështonte. Për ta bërë këtë, unë krijova një bazë të dhënash të zbrazët dhe e përpunova atë me komandën. Për analogji me shembullin e furnizuesit, e transferova paraqitjen në një konfigurim të ri - funksionon herën e dytë. Ato. herën e parë jo, por herën e dytë po. Kjo nxiti idenë se në përpunimin tonë do të ishte ende e nevojshme të ndahej lidhja e komponentit dhe objektit sipas procedurave të ndryshme.
Pastaj e transferova në bazën time të të dhënave me lidhjen e paraqitjes - funksionon. Phew, kjo është mirë .... Por unë do të doja pa bërë ndryshime në konfigurim, kështu që le të vazhdojmë

Po përpiqem të shtoj paraqitjen në përpunim. Madhësia e saj rritet menjëherë nga 10 kb në 3 mb dhe vërehet një ngadalësim i ndjeshëm i funksionimit - nuk është i përshtatshëm. Unë jam duke filluar të gërmoj drejt lidhjes së komponentëve përmes dll. Ato. në thelb njësoj si aty ku fillova. Por ka një "POR": kur kërkoja emrin dll në dosjen e përdoruesit, vura re se kjo dll ndodhet aty ku (siç e kuptoj unë) shtohen dll-të e regjistruara në 1C:
C:\Users\USER\AppData\Roaming\1C\1cv8\ExtCompT
Prandaj, nuk ka nevojë të përdorni rrugën e plotë për dll, thjesht mund të shkruani emrin e saj:
ConnectExternalComponent("Add1CUniServerAuto32.dll", "UniServerAuto", ExternalComponentType.Native);

Përpiqem... betohet në regjistrim, por kthen rezultatin e peshimit. Rezulton se dll është regjistruar tashmë dhe kjo do të thotë që ju vetëm duhet ta lidhni atë. E heq dhe gjithçka funksionon.
Për ta përmbledhur:
1. Në përpunimin e peshimit, procedura AtOpening përfshinte lidhjen e një komponenti të jashtëm dhe një lidhje me një objekt.
2. Rruga drejt dll-së nuk e kam shkruar, thjesht kam treguar emrin e saj.

Tani jam ulur dhe mendoj, kur u instalua dll në 1C? Në momentin e instalimit të softuerit? Vështirë... Në momentin e nisjes së konfigurimit të zhvilluesit të kësaj dll, ku instalohet kur hapet formulari? Nuk e di, por më duket afër... Si mendoni?
Dhe së dyti, në një vend të ri, kur ka nevojë për të instaluar të njëjtin terminal, çfarë duhet bërë që gjithçka të funksionojë? A duhet ta instaloj plotësisht softuerin, të ekzekutoj konfigurimin e shitësit për të kontrolluar funksionimin dhe më pas (teorikisht) a duhet të funksionojë përpunimi im? Diçka është disi e komplikuar... Apo duhet të bëj Install External Component një herë në përpunimin tim pas instalimit të softuerit?

Do të doja të dëgjoja mendimet tuaja për këtë çështje ...

Pyetje: Komponenti i jashtëm.dll


dite te mire te gjitheve.
Një pyetje.
Një komponent dll që funksionon shkëlqyeshëm në 1C 7.7
1s 8.1 nuk dëshiron të niset fare...
Provova dhe e ngjisja në C:\Program Files\1cv81\bin\cache1c.dll
Provova të regjistrohesha duke përdorur regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll"
Regjistrohet pa probleme.
Kur dua ta aksesoj, më del një mesazh gabimi:

Gabim gjatë ngarkimit të komponentit të jashtëm! cache1c.dll
Procedura ButtonExecutePress(Button) Përpjekje për të ngarkuar komponentin e jashtëm( "C:\Program Files\1cv81\bin\cache1c.dll"); Raporti i përjashtimit ( "Gabim gjatë ngarkimit të komponentit të jashtëm!"+ "cache1c.dll"); Përpjekja e Fundit; Përpjekje // Merrni objektin e komponentit. // m = E re ("cache1c.GTMcmd"); m = New COMObject("cache1c.GTMcmd" ); Raporti i përjashtimit(); Përpjekja e Fundit; Fundi i procedurës

Përgjigje: Eshte banale deri ne pamundesi...
Duhet të bëni pauzë ndërmjet thirrjeve (milisekonda)...
Procedura ButtonExecutePress(Button) Përpjekje // Merrni një objekt komponent. m = New COMObject("cache1c.GTMcmd" ); Raporti i përjashtimit ( "Dështoi në krijimin e objektit të komponentit të jashtëm"); Përpjekja e Fundit; m.RemoteHost = "192.168.1.101" ; m.RemotePort = 6330; m.Connect(); m.Pauzë(100); ...... etj
Për 1c 7.7 - kjo nuk është e nevojshme, rezulton se trajtimi është më i shpejtë.

Pyetje: Puna me një komponent të jashtëm me një server 1C...


Mirembrema,

Ekziston një komponent i jashtëm i shkruar në C++, detyra e të cilit është të marrë informacion nga një bazë të dhënash e jashtme dhe të kthejë rezultatin e pyetjes në formën e një Tabele të Vlerave në 1C.
Për të gjeneruar një tabelë vlerash në momentin aktual, përdoret ndërfaqja IDispatch* pBackConnection, e marrë si parametër në funksionin Init(). Më pas, unë thjesht përdor funksionet 1C për të krijuar një tabelë vlerash, për ta mbushur atë dhe për ta kthyer atë në parametrin e dytë në CallAsFunc (...).
Problemet filluan me kalimin në klientët e hollë 1C. Nga ana e serverit, komponenti i jashtëm nuk fillon vërtet. Mund ta ekzekutoni në anën e klientit, por gjithçka duket si paterica dhe bie jashtë logjikës së përgjithshme "klient-server" në 1C. Për shembull, klienti nuk e kupton se çfarë është një tabelë vlerash, problemet me variablat "globale", sesionet, etj.
NativeAPI është edhe më i kufizuar në këtë drejtim.
Vallëzimi me një dajre çoi në faktin se unë isha në gjendje të nisja një komponent të jashtëm nën serverin 1C, POR puna vazhdon derisa të bëhet një përpjekje për të thirrur Invoke në pBackConnection. Versioni 64-bit i serverit 8.2 përpiqet të bëjë diçka derisa të skadojë, versioni 32-bit (VK është natyrisht edhe 32-bit) thjesht bie menjëherë.
Unë supozoj se serveri 1C nuk e mbështet këtë mënyrë funksionimi.
Prandaj, lindin pyetje: a është kjo e përkohshme apo logjika 1C zbret në anulimin e kësaj skeme pune? Nëse është e pamundur të krijohen struktura të brendshme 1C (një tabelë vlerash) në këtë mënyrë, a ekziston, në parim, një përshkrim se çfarë është një tabelë vlerash në nivelin e sistemit në mënyrë që të përpiqeni ta krijoni atë në C++, mbusheni dhe më pas thjesht futeni në 1C si parametër kthimi? Do të doja të paktën të gjeja një drejtim në cilin drejtim të gërmoj.

Faleminderit.

Përgjigje:

Ju shkruani një gjë dhe mendoni një tjetër.
Në mjedisin 1C, deklarimi i variablave që do të jenë të dukshëm në sesione të ndryshme nuk është i pamundur tani dhe nuk ka pasur një mundësi të tillë më parë. Një seancë tjetër është një proces fizikisht i ndryshëm.
Një sesion është një seancë që lidhet me një bazë të dhënash, d.m.th. sesioni i përdoruesit. Apo po vendosni diçka tuajën në këtë koncept?

Brenda një sesioni ishte e mundur, dhe tani është e mundur, të deklarohen variabla në modulin e sesionit që do të jetojnë dhe do të jenë të dukshme brenda seancës nga vende të ndryshme... në fakt, janë 4 prej tyre.
- Moduli i sesionit;
- Moduli i rregullt i aplikimit;
- Moduli i aplikacionit të menaxhuar;
- Moduli i lidhjes së jashtme.

Epo, sigurisht, duhet të mbani mend kontekstin. Konteksti i serverit nuk është drejtpërdrejt i aksesueshëm nga ana e klientit dhe anasjelltas.

Në fakt, arkitektura 1C përcakton që shkëmbimi i të dhënave do të shkojë si më poshtë:
- me anë të parametrave/kthimeve të procedurave/funksioneve;
- me anë të të ashtuquajturave parametra të sesionit (nuk mund të jenë objekte, por në të vërtetë të dukshme në paleta).

Një tabelë në formular... a është e lidhur me ndonjë tabelë objektesh (përpunim, për shembull)? ose jo. Nëse po, atëherë është i disponueshëm në server (&OnServer) dhe modifikojeni atje....

E megjithatë, po, Tabela e Vlerave nuk është e disponueshme në UV në anën e klientit. Epo, kjo është ajo që vendosi 1C.

Eja! Punon me Excel, punon me FSO dhe shumë gjëra të tjera, por këtu nuk funksionon. Kape gabimin dhe analizo....

Përpjekje
...
veprimet tuaja
...
Përjashtim
str = Përshkrimi i gabimit();
Përpjekja e Fundit;

Me aftësi moderne harduerike, ky nuk është aspak një argument.

Thjesht mendimi juaj personal. Nuk ka lidhje me realitetin. Jo në asnjë mënyrë. E përsëris edhe një herë, 1C funksionon shkëlqyeshëm me COM. Si me in-proc ashtu edhe me jashtë.

Ju lutemi jepni kodin që përdorni për të shkarkuar dhe kontaktoni VK.

Meqë ra fjala, VK... në rastin tuaj, është COM apo Native API?
Nëse COM, atëherë ju e regjistroni atë si ... nëpërmjet regsvr32 ... atëherë si e "zgjidhni" çështjen e thellësisë së bitit?

Pyetje: Instalimi i një komponenti të jashtëm


Ju lutem më tregoni se si të instaloj një komponent të jashtëm. Gjatë ekzekutimit të kodit të mëposhtëm, hidhet një gabim. Në paraqitjen gjeni NameDecl.dll

Duke u përpjekur të SetExternalComponent ("GeneralLayout.Layout"); Përjashtim FundTry ;
Gabim: instalimi i komponentit të jashtëm dështoi!

Përgjigje: ()
ConnectExternalComponent("GeneralLayout.Layout", "NameDecl", ExternalComponentType.Native) kthen FALSE.
E re("AddIn.NameDecl.CNameDecl", E Padefinuar) = (()): Lloji i papërcaktuar (AddIn.NameDecl.NameDecl)

Pyetje: Dll-ja vendase nuk lidhet me 1c 8.1 (fptrwin32_fz54_9_11_0_5549.dll)


Përshëndetje.
1C përditësoi dll-në për arkat online atolin për ffd 1.05 (përfshirë në përpunimin e mirëmbajtjes fptrwin32_fz54_9_11_0_5549.dll).
Unë kam një 1C 8.1 të vjetër. Për dallim nga 8.2, ai nuk mbështet punën me pajisje të jashtme në të njëjtën mënyrë si 8.2, kështu që së pari duhet të regjistroni dll në Windows, dhe pastaj ta lidhni vetëm me 1C?

ProgID = "AddIn.IntegrationComponent.ATOL_KKT_1C83_V9"; LoadExternalComponent("C:\fptrwin32_fz54_9_11_0_5549.dll"); ConnectExternalComponent (progID); Driver = I ri (ProgID);

Megjithatë, përpunimi i vjetër është shkruar në kom "teknologji", dhe i ri është amtare. Prandaj, kur regjistroni regsvr32 jep një gabim:
Moduli është i ngarkuar, por pika hyrëse e DllRegisterServer nuk është gjetur. Dhe sugjeron të kontrolloni nëse ky skedar është skedari i saktë dll ose OCX.
A ka hasur dikush në një situatë të ngjashme dhe si keni dalë? Unë e kuptoj që 7.7 do të ketë një problem të ngjashëm.
Kodi 8.2:

Layout = GetLayout("IntegrationComponent"); Adresa = PlaceInTemporaryStorage(Layout); ConnectExternalComponent(Adresa, "IntegrationComponent", ExternalComponentType.Native); Driver = I ri ("AddIn.IntegrationComponent.ATOL_KKT_1C83_V9");

1C 8.2:
ConnectExternal Component(<Местоположение>, <Имя>, <Тип>)
1C 8.1:
ConnectExternal Component(<Идентификатор объекта>)
Opsione:
<Идентификатор объекта>(kërkohet)
Lloji: String. ProgID (Identifikuesi Programatik) i objektit të komponentit të jashtëm. Duhet të korrespondojë me informacionin në bazën e të dhënave të regjistrimit të sistemit (Regjistri).
Përshkrim:
Lidh objektet e komponentëve të jashtëm me 1C: Enterprise.
Nuk disponohet në serverin 1C: Enterprise. Nuk përdoret në modulin e lidhjes së jashtme.
Shënim:
Komponentët e jashtëm janë të pajtueshëm me komponentët 1C:Enterprise 7.7.
Shembull:
Përpjekje
ConnectExternalComponent ("AddinObject.Scanner");
Raporti ("Përbërësi për skanerin e barkodit është ngarkuar");
Përjashtim
Raporti ("Përbërësi për skanerin e barkodit nuk është i ngarkuar");
Përpjekja e Fundit

A ka ndonjë mënyrë për ta lidhur këtë dll me 8.1 apo jo?

Faleminderit!

Përgjigje:

Unë gjithashtu kam hasur kohët e fundit këtë problem. Nuk ishte e mundur të konvertohej në një version të mëvonshëm të 1c sepse... dll me të cilin funksionon ky konfigurim thjesht ndaloi së punuari dhe 1c u rrëzua me një gabim.
E zgjidha problemin si më poshtë:
Krijova një bazë të dhënash të zbrazët 8.3 në të cilën përpunova inicializimin e komponentit dhe më pas nga 8.1 nëpërmjet një lidhjeje COM hyra në bazën e të dhënave të krijuar më parë dhe inicializova komponentin atje. Pastaj, tashmë në 8.1, thirra metodat e këtij komponenti.
Sigurisht që kjo është një paterica, por nuk kam gjetur ende rrugëdalje tjetër (

Shembulli i kodit 8.3:
Eksporti i Variable Driver;
Funksioni ConnectionComponentsKKT() Eksporto
Përpjekje

Layout = GetLayout("IntegrationComponent");
Adresa = PlaceInTemporaryStorage(Layout);
ConnectExternalComponent(Adresa, "IntegrationComponent", ExternalComponentType.Native);
Driver = I ri ("AddIn.IntegrationComponent.SMDrvFR1C20");
Rezultati = E vërtetë;

Përjashtim

Rezultati = E gabuar;

Përpjekja e Fundit;
Rezultati i Kthimit
Funksioni i Fundit

Shembulli i kodit 8.1

Funksioni CreateDriverObject(Driver) Export

Rezultati = E vërtetë;

Përpjekje

ConnectionString="File="""Rruga drejt bazës së të dhënave""";
ComObject = New COMObject ("V83.ComConnector");
Connect = ComObject.Connect(ConnectionString);

Përpunimi = Connect.Processing.ConnectExternalComponent.Create();
Rezultati i lidhjes = Përpunimi.ConnectionCCPComponents();
Nëse rezultati i lidhjes atëherë
Driver = Përpunim.Driver;
FundNëse;

Përjashtim
Kushdo që e ka bërë këtë ose ka hasur në vendime të ngjashme, shpjegojë vetë parimin duke përdorur një shembull të thjeshtë. Duket se gjithçka është e qartë me lidhjen e komponentëve të jashtëm.

// Shembull i plotësimit të tabelës së vlerave TK.Clear(); Kërkesë = Kërkesë e re; Query.Text = "ZGJEDH | Nomenklatura.Lidhja SI Nomenklatura |NGA | Directory.Nomenklature AS Nomenklature"; Rezultati i Kërkesës = Request.Execute(); Selection = Request Result.Select(); Ndërsa Selection.Next() Faqja e ciklit = TK.Add(); PlotësoniPropertyValues(Page, Selection); FundCycle;
A mund ta përdorni këtë shembull për të shpjeguar se cila pjesë e kodit hiqet zakonisht? Do të ishte logjike të hiqnim pjesën me kërkesë, por atëherë si mund të hyjmë në bazën e të dhënave nga komponenti i jashtëm, duke anashkaluar platformën? Nuk ka kuptim të nxjerrësh tekstin. Ose hiqni vetë formimin e pjesës tabelare. Ndani përvojën tuaj me këdo që e ka hasur këtë.

Përgjigje: Dhe se fjala "I papajtueshëm" do të thotë gjithmonë fjalën "E keqe"? Po, më duket se nëse e quaj stilin tim "1C: Programimi më i keq në këtë motor skripti që ekziston në natyrë (i përkthyer në gjuhën letrare)!" dhe atëherë me siguri do të ketë njerëz që duan ta kontrollojnë këtë bishë. Dhe duket si një klasik: "Unë nuk e kam lexuar Pasternak, por nuk jam plotësisht dakord me të!"

Pyetje: Lidhja e një komponenti të jashtëm në 1s 8.3.6 dhe Win8


Duhet të lidhni Komponentin e Jashtëm vk_rs232.dll me konfigurimin e shkruar vetë. Duket se është regjistruar përmes regsvr32.exe. "Duket" sepse mora një mesazh që "komponenti është i regjistruar, por ka diçka që nuk shkon me murin e zjarrit". Duke u mbështetur në gjysmën e parë të mesazhit, unë shkruaj kodin në 1C
AfterConnecting = Përshkrimi i ri i alarmit ("AfterConnectingVK", ThisForm); StartInstallingExternalComponents("C:\Controller\vk_rs232.dll"); StartConnectingExternalComponents(Pas Lidhjes,"C:\Controller\vk_rs232.dll","DLL_Scales");
dhe marr gabimin se
"Instalimi i një komponenti të jashtëm dështoi! Një komponent për aplikacionin e klientit që po përdorni mund të mungojë!".

Dhe tani nuk e kuptoj:
1. Ndoshta komponenti nuk është i regjistruar në regjistër - si mund ta kontrolloj atje?
2. Ndoshta "versioni" i tij nuk funksionon nën Win8, megjithëse unë e kam atë 32-bit.
3. Ndoshta vetë 1C është shumë i ri, d.m.th. Prandaj, nuk mund të funksionojë me këtë dll?
4. Epo, është e parëndësishme - po shkruaj diçka të gabuar.

Përgjigje: Dhe e gjithë kjo më çoi në problemin tjetër. VneshComp është instaluar, tani duhet ta lidhni. Dhe këtu janë të dyja opsionet
ConnectExternalComponent ("C:\Controller\vk_rs232.dll","Libra")
ConnectExternalComponent ("GeneralLayout.Layout","Libra")

Opsioni sintaksor: Sipas emrit dhe vendndodhjes

Sintaksë:

ConnectExternal Component(<Местоположение>, <Имя>, <Тип>)
Opsione:

<Местоположение>(kërkohet)

Lloji: String.
Vendndodhja e komponentit të jashtëm.
Vendndodhja mund të përdoret:
shtegu drejt skedarit të komponentit të jashtëm në sistemin e skedarëve (nuk disponohet në klientin në internet), jo një arkiv ZIP;
emri plotësisht i kualifikuar i paraqitjes që ruan të dhënat binare ose arkivin ZIP;
URL-ja e komponentit të jashtëm, si të dhëna binare ose një arkiv ZIP, në një format të ngjashëm me GetNavigationLink.
<Имя>(kërkohet)

Lloji: String.
Emri simbolik i komponentit të jashtëm që do të lidhet.
Emri duhet të ndjekë konventat e emërtimit të gjuhës së integruar.
<Тип>(opsionale)

Lloji: ExternalComponentType.
Lloji i komponentit të jashtëm që do të lidhet.
Nuk përdoret nëse komponenti është i paketuar në një arkiv ZIP.
Përshkrimi i opsionit të metodës:

Lidh komponentët e bërë duke përdorur teknologjinë Native dhe COM.
Komponenti mund të ruhet në bazën e informacionit ose në paraqitjen e konfigurimit si të dhëna binare ose në një arkiv ZIP.
Për mënyrat e nisjes "Thin Client" dhe "Web Client", komponenti duhet së pari të instalohet duke përdorur metodën Install External Component.
Opsioni sintaksor: Me ID

Sintaksë:

ConnectExternal Component(<ИдентификаторОбъекта>)
Opsione:

<ИдентификаторОбъекта>(kërkohet)

Lloji: String.
Identifikuesi i objektit të komponentit të jashtëm në formën e ProgID (Identifikuesi Programatik) i regjistrit MS Windows (për shembull: "AddIn.Scanner").
Duhet të korrespondojë me informacionin në bazën e të dhënave të regjistrimit të sistemit (Regjistri).
Përshkrimi i opsionit të metodës:

Komponenti duhet të zbatohet duke përdorur teknologjinë COM dhe të regjistrohet në regjistrin MS Windows.
Këta komponentë janë të pajtueshëm me komponentët 1C:Enterprise 7.7.
Kujdes! Opsioni i metodës nuk funksionon në server dhe në lidhjen e jashtme.
Vlera e kthimit:

Lloji: Boolean.
E vërtetë - lidhja ishte e suksesshme.
Përshkrim:

Lidh një komponent të jashtëm me 1C: Enterprise.
Komponentët e jashtëm mund të ruhen në bazën e informacionit ose paraqitjet e konfigurimit si një arkiv ZIP ose si të dhëna binare, ose në një skedar të sistemit të skedarëve.
Kur punoni në një klient të hollë dhe një klient në internet, komponenti duhet të jetë i instaluar paraprakisht.

Disponueshmëria:

Thin klient, klient web, server, lidhje e jashtme.
Shënim:

Komponentët e jashtëm mund të zbatohen duke përdorur teknologjinë Native API ose COM. Komponentët e bërë duke përdorur teknologjinë COM janë në përputhje me komponentët 1C:Enterprise 7.7.
Klienti i uebit mund të punojë vetëm me komponentë në infobazë që janë të paketuara në një arkiv.
Klienti i hollë mund të punojë me komponentë në infobazë, të paketuar në një arkiv dhe komponentë të vendosur në sistemin e skedarëve.
Klienti i trashë mund të trajtojë të gjitha opsionet e ruajtjes së komponentëve. Në këtë rast, nëse një komponent instalohet duke përdorur metodën Install External Component, atëherë përdoret komponenti i instaluar dhe nëse nuk është i instaluar, komponenti do të merret në momentin e lidhjes.
Serveri mund të punojë me të gjithë komponentët. Komponenti ruhet në memorie për sesion të serverit.
Shembull:

Nëse ConnectExternalComponent ("AddinObject.Scanner") Pastaj
Raporti ("Komponenti për skanerin e barkodit u ngarkua");
Përndryshe
Raporti ("Përbërësi për skanerin e barkodit nuk është i ngarkuar");
fundNëse;

  • Tutorial

Prezantimi

Ky artikull jep një ide se si funksionojnë komponentët e jashtëm në sistemin 1C: Enterprise.
Do të shfaqet procesi i zhvillimit të një komponenti të jashtëm për versionin 8.2 të sistemit 1C: Enterprise, i cili funksionon nën Windows OS me një mënyrë funksionimi skedari. Ky opsion përdoret në shumicën e zgjidhjeve të dizajnuara për bizneset e vogla. VK do të zbatohet në gjuhën e programimit C++.

Komponentët e jashtëm "1C: Ndërmarrja"

"1C: Enterprise" është një sistem i zgjerueshëm. Për të zgjeruar funksionalitetin e sistemit, përdoren komponentë të jashtëm (EC). Nga këndvështrimi i një zhvilluesi, një VC është një objekt i jashtëm që ka veti dhe metoda, dhe gjithashtu mund të gjenerojë ngjarje për përpunim nga sistemi 1C: Enterprise.
Komponentët e jashtëm mund të përdoren për të zgjidhur një klasë problemesh që janë të vështira apo edhe të pamundura për t'u zbatuar në gjuhën e programimit të integruar në 1C: Enterprise. Në veçanti, kjo klasë përfshin detyra që kërkojnë ndërveprim të nivelit të ulët me sistemin operativ, për shembull, për të punuar me pajisje specifike.
Sistemi 1C: Enterprise përdor dy teknologji për krijimin e komponentëve të jashtëm:
  • duke përdorur Native API
  • duke përdorur teknologjinë COM
Duke pasur parasysh kufizimet e dhëna, ndryshimi midis dy teknologjive të sipërpërmendura është i parëndësishëm, kështu që ne do të shqyrtojmë zhvillimin e lojërave video duke përdorur API-në vendase. Nëse është e nevojshme, zhvillimet e zbatuara mund të aplikohen në zhvillimin e softuerit kompjuterik duke përdorur teknologjinë COM, dhe gjithashtu, me modifikime të vogla, të aplikohen për përdorim në sistemin 1C: Enterprise me opsione të tjera funksionimi përveç mënyrës së funksionimit të skedarit.
Struktura VK
Komponenti i jashtëm i sistemit 1C: Enterprise paraqitet në formën e një biblioteke DLL. Kodi i bibliotekës përshkruan klasën pasardhëse IComponentBase. Klasa e krijuar duhet të përcaktojë metodat përgjegjëse për zbatimin e funksioneve të komponentit të jashtëm. Metodat e anashkaluara do të përshkruhen më hollësisht më poshtë ndërsa paraqitet materiali.

Nisja e një VK demo

Detyra:
  1. Mblidhni një komponent të jashtëm të furnizuar me një abonim ITS dhe synon të demonstrojë aftësitë kryesore të mekanizmit të komponentit të jashtëm në 1C
  2. Lidhni komponentin demo me konfigurimin 1C
  3. Sigurohuni që funksionet e deklaruara të funksionojnë saktë
Përmbledhje
Demoja VK ndodhet në diskun e abonimit ITS në drejtorinë "/VNCOMP82/shembull/NativeAPI".
Për të ndërtuar VC-në demo, ne do të përdorim Microsoft Visual Studio 2008. Versionet e tjera të këtij produkti nuk e mbështesin formatin e projektit Visual Studio të përdorur.


Hapni projektin AddInNative. Në cilësimet e projektit, ne përfshijmë direktorinë me skedarët e titullit të nevojshëm për të ndërtuar projektin. Si parazgjedhje, ato janë të vendosura në diskun ITS në drejtori /VNCOMP82/përfshi.
Rezultati i ndërtimit është skedari /bind/AddInNative.dll. Kjo është biblioteka e përpiluar për t'u lidhur me konfigurimin 1C.
Lidhja e konfigurimit VK me 1C
Le të krijojmë një konfigurim bosh 1C.
Më poshtë është kodi për modulin e aplikacionit të menaxhuar.
ndryshore DemoComp; Procedura kur fillon sistemi () Lidhni komponentin e jashtëm ("...\bind\AddInNative.dll", "DemoVK", Lloji i Komponentit të Jashtëm.Native); DemoComp = I ri ("AddIn.DemoVK.AddInNativeExtension"); Fundi i procedurës
Nëse nuk u raportua asnjë gabim gjatë fillimit të konfigurimit 1C, atëherë VK u lidh me sukses.
Si rezultat i ekzekutimit të kodit të mësipërm, një objekt shfaqet në dukshmërinë globale të konfigurimit DemoComp, i cili ka veti dhe metoda që përcaktohen në kodin e komponentit të jashtëm.
Demonstrimi i funksionalitetit të integruar
Le të kontrollojmë funksionalitetin e demo VK. Për ta bërë këtë, le të përpiqemi të vendosim dhe lexojmë disa veti, të thërrasim disa metoda VK dhe gjithashtu të marrim dhe përpunojmë mesazhin VK.
Dokumentacioni i dhënë në diskun ITS deklaron funksionalitetin e mëposhtëm të VC-së demo:
  1. Menaxhimi i gjendjes së objektit të komponentit
    Metodat: Ndez, Fikeni
    Vetitë: Të përfshira
  2. Kontrolli i kohëmatësit
    Çdo sekondë komponenti dërgon një mesazh në sistemin 1C: Enterprise me parametra Komponenti, Timer dhe një linjë numëruesi të orës së sistemit.
    Metodat: StartTimer, Ndalo kohëmatësin
    Vetitë: Ka një kohëmatës
  3. Metoda ShowInStatusLine, e cila shfaq në vijën e statusit tekstin e kaluar në metodë si parametra
  4. Metoda NgarkoFoto. Ngarkon një imazh nga skedari i specifikuar dhe e transferon atë në sistemin 1C: Enterprise në formën e të dhënave binare.
Le të sigurohemi që këto funksione të funksionojnë. Për ta bërë këtë, ekzekutoni kodin e mëposhtëm:
ndryshore DemoComp; Procedura kur fillon sistemi() ConnectExternalComponent(...); DemoComp = I ri ("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Disable(); Raporti (DemoComp.Enabled); DemoComp.Enable(); Raporti (DemoComp.Enabled); DemoComp.StartTimer(); Procedura e përfundimit të procedurës Përpunimi i ngjarjeve të jashtme (Burimi, Ngjarja, të Dhënat) Raporti (Burimi + " " + Ngjarja + " " + Të dhënat); Fundi i procedurës
Rezultati i ekzekutimit të konfigurimit tregohet në imazh


Paneli "Mesazhet" shfaq rezultatet e thirrjeve të metodës DemoComp.Disable() Dhe Demo.Comp.Enable(). Rreshtat pasues në të njëjtin panel përmbajnë rezultatet e përpunimit të mesazheve të marra nga VK - Burimi, Ngjarja Dhe Të dhënat përkatësisht.

Emri i personalizuar i komponentit të jashtëm

Detyrë: Ndryshoni emrin e komponentit të jashtëm në një arbitrar.
Seksioni i mëparshëm përdori identifikuesin AddInNativeExtension, kuptimi i të cilit nuk u shpjegua. Në këtë rast AddInNativeExtension- ky është emri i shtesës.
Kodi VK përcakton një metodë Register ExtensionAs, duke e kthyer emrin në sistemin 1C: Enterprise, i cili është i nevojshëm për regjistrimin e mëvonshëm të VK në sistem. Rekomandohet të specifikoni një identifikues që zbulon në një farë mase thelbin e komponentit të jashtëm.
Këtu është kodi i plotë i metodës Register ExtensionAs me emrin shtesë të ndryshuar:
bool caddinnative :: REGJEKSISHTE (WCHAR_T ** WSEXTENSENTNAME) (WCHAR_T* WSEXTENSION = L "SOMENAME"; INT IACTUALSIZE = :: WCSLEN (WSEXTENTENT) + 1; ((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, iActualSize) kthen false;
Në shembullin e dhënë, emri VK është ndryshuar në Dikush Emri. Pastaj kur lidhni VK, duhet të specifikoni një emër të ri:
DemoComp = I ri ("AddIn.DemoVK.SomeName");

Zgjerimi i listës së pronave VK

Detyra:
  1. Studioni zbatimin e vetive VK
  2. Shtoni një veçori leximi/shkrimi të llojit të vargut
  3. Shtoni një veçori të vargut të leximit/shkrimit që ruan llojin e të dhënave të grupit të fundit të vetive. Asnjë veprim nuk ndërmerret gjatë vendosjes së vlerës së pronës

Për të përcaktuar vetitë e komponentit që krijohet, zhvilluesi duhet të zbatojë metodat e mëposhtme në kodin e bibliotekës AddInNative.cpp:
GetNProps
Rikthen numrin e vetive të kësaj shtese, 0 nëse nuk ka veçori
FindProp
Kthen numrin serial të pronës, emri i së cilës kalohet në parametrat
GetPropName
Kthen emrin e pronës me numrin e tij serial dhe me identifikuesin e gjuhës së kaluar
GetPropVal
Kthen vlerën e pronës me numrin rendor të specifikuar
SetPropVal
Vendos vlerën e pronës me numrin rendor të specifikuar
IsPropReadable
Kthen flamurin e lexueshmërisë së pronës me numrin e sekuencës së specifikuar
IsPropWritable
Kthen flamurin e shkrueshmërisë së pronës me numrin e sekuencës së specifikuar


Le të shqyrtojmë zbatimin e metodave të klasës së mësipërme CAddInNative.
Në VC-në demo, përcaktohen 2 veti: Të përfshira Dhe Ka një kohëmatës (Është Enabled Dhe IsTimerPresent).
Në shtrirjen globale të kodit të bibliotekës, përcaktohen dy vargje:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Enabled", L"Ka një kohëmatës");
të cilat ruajnë emrat e pronave ruse dhe angleze. Në skedarin e kokës AddInNative.h numërimi është përcaktuar:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Gjithmonë e fundit);
ePropIsEnabled Dhe ePropIsTimerPresent, përkatësisht që kanë vlerat 0 dhe 1, përdoren për të zëvendësuar numrat serialë të pronave me identifikues kuptimplotë. ePropLast, i cili ka vlerën 2, përdoret për të marrë numrin e vetive (duke përdorur metodën GetNProps). Këta emra përdoren vetëm brenda kodit të komponentit dhe nuk janë të disponueshëm nga jashtë.
Metodat FindProp dhe GetPropName kryejnë kërkime në grup g_PropEmrat Dhe g_PropNamesRu.
Për të ruajtur vlerat e fushave në modulin e bibliotekës, klasa CAddInNative ka veti që ruajnë vlerën e vetive të komponentit. Metodat GetPropVal Dhe SetPropVal ktheni dhe vendosni vlerën e këtyre vetive në përputhje me rrethanat.
Metodat IsPropReadable Dhe IsPropWritable dhe kthehu e vërtetë ose i rremë, në varësi të numrit rendor të kaluar të pronës në përputhje me logjikën e aplikimit.
Për të shtuar një pronë të personalizuar ju duhet:

  1. Shtoni emrin e pronës që po shtohet në vargje g_PropEmrat Dhe g_PropNamesRu(skedarë AddInNative.cpp)
  2. Për të listuar Props(skedarë AddInNative.h) më parë ePropLast shtoni një emër që identifikon në mënyrë unike pronën që po shtohet
  3. Organizoni memorien për ruajtjen e vlerave të vetive (krijoni fusha përbërëse të modulit që ruajnë vlerat përkatëse)
  4. Bëni ndryshime në metoda GetPropVal Dhe SetPropVal për të bashkëvepruar me memorien e alokuar në hapin e mëparshëm
  5. Në përputhje me logjikën e aplikimit, bëni ndryshime në metoda IsPropReadable Dhe IsPropWritable
Pikat 1, 2, 5 nuk kanë nevojë për shpjegim. Detajet e zbatimit të këtyre hapave mund të gjenden duke studiuar shtojcën e artikullit.
Le t'u japim emra vetive të provës Test Dhe Lloji Kontrollo përkatësisht. Pastaj, si rezultat i hapit 1, kemi:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Enabled", L"Ka një kohëmatës", L"Test", L"Kontrollimi i tipit");
Transferimi Props do të duket si:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Gjithmonë e fundit);
Për të thjeshtuar ndjeshëm kodin, ne do të përdorim STL C++. Në veçanti, për të punuar me vargje WCHAR, le të lidhim bibliotekën string.
Për të ruajtur një vlerë të metodës Test, përcaktojmë në klasë CAddInNative në fushën e një fushe private:
testi i vargut1;
Për të transferuar parametrat e vargut midis 1C: Enterprise dhe komponentëve të jashtëm, përdoret menaxheri i kujtesës 1C: Enterprise. Le të hedhim një vështrim më të afërt në punën e tij. Funksionet përdoren për ndarjen dhe lirimin e memories përkatësisht AllocMemory Dhe Memoria e Lirë të përcaktuara në dosje ImemoryManager.h. Nëse është e nevojshme të kaloni një parametër të vargut në sistemin 1C: Enterprise, komponenti i jashtëm duhet të ndajë memorie për të duke thirrur funksionin AllocMemory. Prototipi i tij duket si ky:
virtual bool ADDIN_API AllocMemory (void** pMemory, ulCountByte e gjatë e panënshkruar) = 0;
Ku pKujtesa- adresa e treguesit në të cilin do të vendoset adresa e zonës së caktuar të memories,
ulCountByte- madhësia e zonës së caktuar të memories.
Një shembull i alokimit të memories për një varg:
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Për lehtësinë e punës me llojet e të dhënave të vargut, ne do të përshkruajmë funksionin wstring_to_p. Ai merr një varg wstring si parametër. Rezultati i funksionit është një strukturë e mbushur tVariant. Kodi i funksionit:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) (char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((void**)&t1, (rr. gjatësia ()+1) madhësia(WCHAR_T)); kthehu i vërtetë)
Pastaj seksioni përkatës i rastit të deklaratës switch të metodës GetPropVal do të marrë formën:
rasti ePropTest1: wstring_to_p(test1, pvarPropVal); pushim;
Metoda SetPropVal:
rasti ePropTest1: nëse (TV_VT(varPropVal) != VTYPE_PWSTR) kthen false; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); pushim;
Për të zbatuar vetinë e dytë, ne përcaktojmë një fushë të klasës CaddInNative
uint8_t lloji i fundit;
në të cilin do të ruajmë llojin e vlerës së fundit të transferuar. Për ta bërë këtë, shtoni komandën në metodën CaddInNative::SetPropVal:
Lloji_i fundit = TV_VT(varPropVal);
Tani, kur kërkojmë të lexojmë vlerën e pronës së dytë, ne do ta kthejmë vlerën lloji i fundit, çfarë kërkon detyra e caktuar.
Le të kontrollojmë funksionalitetin e ndryshimeve të bëra.
Për ta bërë këtë, le të paraqesim pamjen e konfigurimit 1C si më poshtë:
ndryshore DemoComp; Procedura Kur Sistemi Fillon() Lidh Komponentin e Jashtëm("...", "DemoVK", Lloji i Komponentit të Jashtëm.Native); DemoComp = I ri ("AddIn.DemoVK.SomeName"); DemoComp.TypeCheck = 1; Raporti(String(DemoComp.TypeCheck)); DemoComp.Test = "Vasya"; Raporti(String(DemoComp.Test)); DemoComp.Test = "Petya"; Raporti(String(DemoComp.Test)); Raporti(String(DemoComp.TypeCheck)); Fundi i procedurës
Si rezultat i nisjes, ne do të marrim një sekuencë mesazhesh:
3
Vasya
Pjetri
22

Mesazhi i dytë dhe i tretë janë rezultat i leximit të vetive të vendosura në hapin e mëparshëm. Mesazhi i parë dhe i dytë përmbajnë kodin e tipit të grupit të fundit të vetive. 3 korrespondon me një vlerë të plotë, 22 me një vlerë vargu. Në dosje vendoset korrespondenca e llojeve dhe kodeve të tyre llojet.h, i cili ndodhet në diskun e ITS.

Zgjerimi i listës së metodave

Detyra:
  1. Zgjeroni funksionalitetin e komponentit të jashtëm me funksionalitetin e mëposhtëm:
  2. Eksploroni mënyra për të zbatuar metodat e komponentëve të jashtëm
  3. Shtoni një metodë funksioni Funksioni 1, i cili merr dy vargje (“Parameter1” dhe “Parameter2”) si parametër. Rezultati është një varg si: "Kontrollo. Parametri 1, Parametri 2"
  4. Sigurohuni që ndryshimet që bëni të funksionojnë.

Për të përcaktuar metodat e komponentit që krijohet, zhvilluesi duhet të zbatojë metodat e mëposhtme në kodin e bibliotekës AddInNative:
GetNMethods, FindMethod, GetMethodName
Projektuar për të marrë numrin përkatës të metodave, kërkoni numrin dhe emrin e metodës. Ngjashëm me metodat përkatëse për vetitë
GetNParams
Rikthen numrin e parametrave të metodës me numrin e sekuencës së specifikuar; nëse një metodë me këtë numër mungon ose nuk ka parametra, kthen 0
GetParamDefValue
Kthen vlerën e paracaktuar të parametrit të specifikuar të metodës së specifikuar
HasRetVal
Kthen flamurin nëse metoda me vlerën e specifikuar të kthimit ka një vlerë kthyese: e vërtetë për metodat me një vlerë kthyese dhe i rremë ndryshe
CallAsProc
i rremë, ndodh një gabim në kohën e ekzekutimit dhe ekzekutimi i modulit 1C: Enterprise përfundon. Kujtesa për grupin e parametrave ndahet dhe lëshohet nga 1C: Enterprise.
CallAsFunc
Ekzekuton metodën me numrin e sekuencës së specifikuar. Nëse metoda kthehet i rremë, ndodh një gabim në kohën e ekzekutimit dhe ekzekutimi i modulit 1C: Enterprise përfundon. Kujtesa për grupin e parametrave ndahet nga 1C: Enterprise. Nëse vlera e kthyer është një varg ose tip i të dhënave binar, komponenti alokon memorie me funksionin AllocMemory menaxheri i memories, shkruan aty të dhënat dhe e ruan këtë adresë në fushën përkatëse të strukturës. 1C: Ndërmarrja do ta çlirojë këtë memorie duke telefonuar Memoria e Lirë.
Një përshkrim i plotë i metodave, duke përfshirë një listë të parametrave, përshkruhet në detaje në dokumentacionin e dhënë në diskun ITS.
Le të shqyrtojmë zbatimin e metodave të përshkruara më sipër.
Në kodin e komponentit, përcaktohen dy vargje:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage");
dhe numërimi:
enum Metodat (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Gjithmonë e fundit );
Ato përdoren në funksione GetNMethods, FindMethod Dhe GetMethodName, në analogji me përshkrimin e vetive.
Metodat GetNParams, GetParamDefValue, HasRetVal ndërprerësi i implementimit, në varësi të parametrave të kaluar dhe logjikës së aplikimit, ktheni vlerën e kërkuar. Metoda HasRetVal në kodin e tij ka një listë të metodave të vetme që mund të kthejnë një rezultat. Për ta ai kthehet e vërtetë. Për të gjitha metodat e çelikut kthimet i rremë.
Metodat CallAsProc Dhe CallAsFunc përmbajnë kodin direkt të ekzekutueshëm të metodës.
Për të shtuar një metodë që mund të thirret vetëm si funksion, duhet të bëni ndryshimet e mëposhtme në kodin burimor të komponentit të jashtëm:
  1. Shtoni emrin e metodës në vargje g_Emrat e metodave Dhe g_Emrat e metodësRu(skedarë AddInNative.cpp)
  2. Shtoni një identifikues kuptimplotë të metodës në numërimin e metodave (skedari AddInNative.h)
  3. Bëni ndryshime në kodin e funksionit GetNParams sipas logjikës së programit
  4. Nëse është e nevojshme, bëni ndryshime në kodin e metodës GetParamDefValue, nëse dëshironi të përdorni vlerat e paracaktuara të parametrave të metodës.
  5. Bëni ndryshime në funksion HasRetVal
  6. Bëni ndryshime në logjikën e funksioneve CallAsProc ose CallAsFunc, duke vendosur kodin direkt të ekzekutueshëm të metodës atje
Le të paraqesim vargjet g_Emrat e metodave Dhe g_Emrat e metodësRu, si dhe listimi Metodat në formën:
static wchar_t *g_MethodNames = (L"Aktivizo", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test");

Metodat Enum (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Gjithmonë e fundit );
Le të modifikojmë funksionin GetNProps në mënyrë që të kthejë numrin e parametrave të metodës "Test":
gjatë CAddInNative::GetNParams(konst long lMethodNum) ( switch(lMethodNum) (rasti eMethShowInStatusLine: kthen 1; rasti eMethLoadPicture: kthen 1; rasti eMethTest: kthen 2; parazgjedhje: kthen 0; ) kthen 0; )
Le të bëjmë ndryshime në funksion:
bool CAddInNative::GetParamDefValue(konst i gjatë lMethodNum, konst i gjatë lParamNum, tVariant *pvarParamDefValue) (TV_VT(pvarParamDefValue)= VTYPE_EMPTY; switch(nMethodNum e rastit:L rasti i mundshëm e eMethStartTimer : rasti eMethStopTimer: rasti eMethTest : / / Nuk ka vlera të parametrave sipas parazgjedhjes: kthej false;
Falë linjës së shtuar
rasti eMethTest:
nëse një ose më shumë argumente mungojnë, parametrat përkatës do të kenë një vlerë boshe ( VTYPE_EMPTY). Nëse keni nevojë për një vlerë të paracaktuar për një parametër, duhet ta vendosni atë në seksion eMethTest deklarata e ndërruesit të funksionit CAddInNative::GetParamDefValue.
Meqenëse metoda e Testit mund të kthejë një vlerë, duhet të bëni ndryshime në kodin e funksionit HasRetVal:
bool CAddInNative::HasRetVal(konst long lMethodNum) ( switch(lMethodNum) (rasti eMethLoadPicture: rasti eMethTest: kthen true; default: kthen false; ) kthen false; )
Dhe shtoni kodin e ekzekutueshëm të metodës në funksion CallAsFunc:
bool CAddInNative::CallAsFunc(konst long lMethodNum, tVariant* pvarRetValue, tVariant* paparams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) (rasti eMethLoadT; if (!lSizeArray || !paParams) return s1 = (paParams) -> pwstrVal = (paParams+1) -> pwstring(s1+s2), pvarRetValue ; ;
Le të përpilojmë komponentin dhe të sjellim kodin e konfigurimit në formën:
ndryshore DemoComp; Procedura kur sistemi fillon () Lidh komponentin e jashtëm ("...", "DemoVK", Lloji i komponentit të jashtëm. Native); DemoComp = I ri ("AddIn.DemoVK.SomeName"); korsi = DemoComp.Test("Përshëndetje", "Botë!"); Raporti (për); Fundi i procedurës
Pas nisjes së konfigurimit, do të marrim mesazhin: "Përshëndetje, Botë!", që tregon se metoda funksionoi me sukses.

Timer

Detyra:
  1. Studioni zbatimin e kohëmatësit në demo VK
  2. Modifikoni metodën "StartTimer" duke shtuar aftësinë për të kaluar në parametra intervalin e përgjigjes së kohëmatësit (në milisekonda)
  3. Sigurohuni që ndryshimet që bëni të funksionojnë.

Në WinAPI, ju mund të përdorni mesazhin për të punuar me kohën WM_TIMER. Ky mesazh do t'i dërgohet programit tuaj në intervalin kohor që keni vendosur kur krijoni kohëmatësin.
Për të krijuar një kohëmatës, përdorni funksionin SetTimer:
UINT SetTimer(HWND hWnd, // përshkruesi i dritares UINT nIDevent, // identifikuesi i kohëmatësit (numri) UINT nElapse, // vonesa TIMERPROC lpTimerFunc); // tregues për të funksionuar
Sistemi operativ do të dërgojë një mesazh WM_TIMER në program me intervalin e specifikuar në argument nKalimi(në milisekonda). Në parametrin e fundit mund të specifikoni një funksion që do të ekzekutohet sa herë që ndizet kohëmatësi. Kreu i këtij funksioni duhet të duket kështu (emri mund të jetë çdo gjë):
void __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Le të shqyrtojmë zbatimin e një kohëmatës në VC demo.
Meqenëse po shqyrtojmë procesin e zhvillimit të një komponenti të jashtëm për familjen Windows OS, nuk do të shqyrtojmë zbatimin e kohëmatësit në sistemet e tjera operative. Për GNU/Linux OS, në veçanti, zbatimi do të ndryshojë në sintaksën e funksionit SetTimer Dhe TimerProc.
Kodi i ekzekutueshëm thërret metodën SetTimer, të cilit i kalon funksioni MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
ID-ja e kohëmatësit të krijuar vendoset në një variabël m_uiTimer në mënyrë që të mund të çaktivizohet më vonë.
Funksioni MyTimerProc si në vazhdim:
BANKËSHTJA E Thirrjes VOID MyTimerProc(HWND hwnd, // doreza e dritares për mesazhet e kohëmatësit UINT uMsg, // mesazhi WM_TIMER UINT idEvent, // identifikuesi i kohëmatësit DWORD dwTime // koha aktuale e sistemit) ( nëse (!pAsyncEvent) *who = wchar "ComponentNative", *what = L"Timer" *wstime = i ri wchar_t (wstime) (wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(who; , çfarë, wstime);
Thelbi i funksionit është se thirret metoda Ngjarje e jashtme, i cili dërgon një mesazh në sistemin 1C: Enterprise.
Për të zgjeruar funksionalitetin e metodës StartTimer Le të bëjmë sa vijon:
Modifikimi i kodit të metodës GetNParams në mënyrë që të jetë për metodën eMethStartTimer vlera e kthyer 1:
rasti eMethStartTimer: kthimi 1;
Këtu është kodi i metodës CallAsProc në formën:
rasti eMethStartTimer: nëse (!lSizeArray || TV_VT(paParams) != VTYPE_I4 || TV_I4(paParams)<= 0) return false; pAsyncEvent = m_iConnect; #ifndef __linux__ m_uiTimer = ::SetTimer(NULL,0,TV_I4(paParams),(TIMERPROC)MyTimerProc); #else // код для GNU/Linux #endif break;
Tani le të kontrollojmë funksionalitetin. Për ta bërë këtë, ne do të shkruajmë kodin në modulin e aplikacionit të menaxhuar të konfigurimit:
ndryshore DemoComp; Procedura kur sistemi fillon () Lidh komponentin e jashtëm ("...", "DemoVK", Lloji i komponentit të jashtëm. Native); DemoComp = I ri ("AddIn.DemoVK.SomeName"); DemoComp.StartTimer (2000); Fundi i procedurës
Pas fillimit të konfigurimit, programi do të marrë mesazhe në intervale prej 2 sekondash, gjë që tregon se kohëmatësi po funksionon siç duhet.

Ndërveprimi me sistemin 1C: Enterprise

Për të bashkëvepruar midis komponentit të jashtëm dhe sistemit 1C: Enterprise, metodat e klasës IAddInDefBase, të përshkruara në skedar AddInDefBase.h. Ne rendisim ato më të përdorurat:
Gjenerimi i një mesazhi gabimi
virtual bool ADDIN_API AddError (kodi i shkurtër i panënshkruar, burimi konst WCHAR_T*, përshkrimi WCHAR_T* konst, kodi i gjatë)
wcode, kodi- kodet e gabimit (një listë e kodeve të gabimit me përshkrime mund të gjendet në diskun ITS)
burimi- burimi i gabimit
përshkruaj- përshkrimi i gabimit
Dërgimi i një mesazhi në sistemin 1C: Enterprise
bool virtual ADDIN_API Ngjarje e jashtme(WCHAR_T* wszBurimi, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszBurimi- burimi i mesazhit
wszMesazhi- Teksti i mesazhit
wszTë dhënat- të dhënat e transmetuara
Përgjimi i mesazheve kryhet nga procedura e Përpunimit të Ngjarjeve të Jashtme
Regjistrimi i një komponenti të jashtëm në sistemin 1C: Enterprise
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszEmri i profilit- emri i komponentit.
Këto metoda janë të mjaftueshme për ndërveprim të plotë midis VK dhe 1C. Për të marrë të dhëna nga një komponent i jashtëm nga sistemi 1C: Enterprise dhe anasjelltas, komponenti i jashtëm dërgon një mesazh të veçantë, i cili nga ana tjetër kapet nga sistemi 1C dhe, nëse është e nevojshme, thërret metodat e komponentit të jashtëm për të transmetuar të dhënat prapa. .

Lloji i të dhënave tVariant

Kur shkëmbeni të dhëna midis komponentit të jashtëm dhe sistemit 1C: Enterprise, përdoret lloji i të dhënave tVariant. Ai përshkruhet në skedarin type.h, i cili mund të gjendet në diskun ITS:
struct _tVariant ( _ANONYMOUS_UNION union ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; i panënshkruar int uintVal; int64_t llVal; uint8_t ui8Val; uint2_Valt; uint2_Valt; uint2_Valt; float fltVal; struct tmVal * pInterface_2/*iface*/ strLen ; simboli ) __VARIANT_NAME_1 grup dimensional në pvarVal TYPEVAR vt);
Lloji tVariantështë një strukturë që përfshin:
  • përzierje (bashkim) i destinuar drejtpërdrejt për ruajtjen e të dhënave
  • identifikues i llojit të të dhënave
Në përgjithësi, puna me variabla të llojit tVariant ndodh sipas algoritmit të mëposhtëm:
  1. Përcaktimi i llojit të të dhënave të ruajtura aktualisht në një variabël
  2. Hyni në fushën përkatëse të përzierjes për të hyrë drejtpërdrejt në të dhënat
Duke përdorur llojin tVariant thjeshton ndjeshëm ndërveprimin e sistemit 1C: Enterprise dhe komponentëve të jashtëm

Aplikacion

Drejtoria "shembuj" përmban shembuj për artikullin
shembuj/1 - nisni komponentin demo
shembuj/2 - demonstrim i zgjerimit të listës pronësore
shembuj/3 - demonstrim i zgjerimit të listës së metodave
Çdo direktori përmban një projekt VS 2008 dhe një konfigurim të gatshëm 1C.