KELL

On neid, kes loevad seda uudist enne sind.
Tellige uusimate artiklite saamiseks.
Meil
Nimi
Perekonnanimi
Kuidas teile meeldiks Kellukest lugeda
Rämpsposti pole

Küsimus: väline Native Api komponent Linuxi C++ (Ubuntu x64) versioonis 1C 8.3


Kirjutan VK-d, ma ei saa ubuntu 1-ga ühendust luua. Isegi exapl 1-st pole ühendatud. Nii et küsimus selle kohta:

1) Proovin VK-d ühendada artiklis toodud VNCOMPS-i näite põhjal

(lingi leiab päris lõpust: "Kopeerimine").
Sisemiselt on NativeApi projektil makefile. Selle abil ehitan ma Ununtule .so raamatukogu.
Kuid valikul "Ühenda väline komponent" tõuseb 1 õhku.
Samamoodi, kui ma ehitan "build.sh" abil (projekti juurtes).

Makefile'is endas muudan lipu m32 asemel m64, sest 1c ja x64 süsteem ise. (m32 parameetriga see niikuinii ei võta)
Siin on näide VK helistamisest versioonist 1C 8.3:
Ühendus Valmis = Ühendage väline komponent("/home/alexeyubuntux64-20 gb/Documents/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ExternalComponentType.Native); Just sellel teemal on artikkel.
Aga niipalju kui mina näen, on VNCOMPSi näites kõiki neid punkte juba arvesse võetud ja parandatud.

Aga tegelikult äri koostamise parameetrites. MB 32-bitine väliskomponent haakub tavaliselt 32-bitise 1c-ga, kuid juurutasin Ubuntu x64 1c enterprise83 8.3.5-1486 amd64-le. Ja ma tahan talle VK-d tuua.

Kas kellelgi on aimu, kuidas seda probleemi lahendada?
VNCOMPS-i näide peaks töötama, kuid ehitamise parameetreid tuleb parandada või platvorm ise, millel ma testin, on vale.

Vastus: Huvitav, kas Java-s on võimalik välist komponenti kirjutada?

Küsimus: väline komponent (native) pole ühendatud


Koostatud näide ITS-iga, 64- ja 32-bitiste süsteemide jaoks.

Ühendan nii:
ConnectionResult = ConnectExternalComponent(CDLLPath, "Comp", ExternalComponentType.Native); Üks arvuti ühendub, teine ​​mitte. OS-is on erinevus. Seal, kus ühendus läheb, on Win7, kus pole Win10. Samal ajal töötavad standardkomponendid arvutis, kus minu komponent ei tööta.

Testitud erinevatel platvormidel (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).

Kuidas aru saada, miks see ei ühenda?

Vastus: vc_redist ei unustanud?

Küsimus: 1C8 ja Native tüüpi väline komponent


Tere päevast.
Olemas on konfiguratsioon BP 3.0.50.12 ja soov rakendada kaalumist firmalt Scales-Soft, kasutades UniServerAuto.
Arendajad koostasid algkomponendi Windows 32 ja 64 jaoks ning panid selle koos maifesti failiga arhiivi. 1C kohta on ka näide, kuidas saab kaalu arvutada. Selles on binaarandmetega paigutuse abil see arhiiv näidatud, nagu ma aru saan. Näites on kõik korras: komponent on paigaldatud, ühendatud, seejärel luuakse ühendus ja loetakse kaal.
Aga niipea kui hakkad ennast 1C peale üle kandma, siis kaalu ei loeta. Tundub, et kõik on lihtsalt kirjas, aga ma ei saa aru, kus reha on.
Kellel vähegi aega - aidake, vaadake ühe silmaga, ehk on lahendus pealispinnal, aga ma kõnnin kuskil vales kohas ja teen midagi valesti. Ma pole kunagi varem Native tehnoloogiaga töötanud...

Ja manuses on minu töötlustekst

Vastus:

Noh, mul on uudiseid...
Hakkasin lihtsalt samm-sammult vaatama, mis hetkel see ebaõnnestuma hakkab. Selleks lõin käsuga tühja andmebaasi ja töötlemise. Analoogiliselt tarnija näitega viisin paigutuse üle uude konfi - see töötab teist korda. Need. Esimene kord ei, teine ​​kord jah. Sellest tekkiski mõte, et selle töötlemisel oleks siiski vajalik komponendi ja objekti ühendamine erinevate protseduuride järgi eraldada.
Seejärel kandsin selle paigutusühendusega oma andmebaasi üle - see töötab. Fuh, see on juba hea .... Aga mulle meeldiks see ilma konfiguratsiooni muutmata, nii et liigume edasi

Üritan lisada töötlemisele paigutust. Selle suurus kasvab kohe 10kb pealt 3mb peale ja märgatakse olulist aeglustumist – ei mahu. Hakkan otsima komponendi ühendamist dll-i kaudu. Need. põhimõtteliselt sama, kus alustasite. Kuid on üks "AGA": kasutaja kaustas dll-i nime järgi otsides märkasin, et see dll asub seal, kus (nagu ma aru saan) lisatakse 1C-s registreeritud dll-id:
C:\Users\USER\AppData\Roaming\1C\1cv8\ExtCompT
Seetõttu pole dll-i täielikku teed vaja kasutada, võite lihtsalt kirjutada selle nime:
ConnectExternalComponent("Add1CUniServerAuto32.dll", "UniServerAuto", ExternalComponentType.Native);

Proovin ... vannub registreerimisel, kuid tagastab kaalumise tulemuse. Selgub, et dll on juba registreeritud, mis tähendab, et peate selle lihtsalt ühendama. Eemaldan selle ja kõik töötab.
Teen kokkuvõtte:
1. Kaalumise töötlemisel protseduuris Avamisel lisasin välise komponendi ühendamise ja ühendamise objektiga.
2. dll-i tee, mida ma ei kirjutanud, märkisin lihtsalt selle nime.

Nüüd istun ja mõtlen, millal dll installiti 1C-sse? Tarkvara installimise ajal? Vaevalt... Kus see selle dll-i arendaja konfiguratsiooni käitamise ajal vormi avamisel seatakse? Ma ei tea, aga see tundub mulle lähedane... Mis sa arvad?
Ja teiseks, uues kohas, kui on vaja paigaldada sama terminal, mida tuleb teha, et kõik toimiks? Installige tarkvara täielikult, käivitage tarnija konfiguratsioon töö kontrollimiseks ja siis (teoreetiliselt) peaks minu töötlemine toimima? Midagi natuke keerulist... Või pärast tarkvara installimist minu töötlusse installida üks kord ExternalComponent?

Mulle meeldiks kuulda teie mõtteid selle kohta...

Küsimus: Väline komponent.dll


Head päeva kõigile.
Küsimus.
dll komponent, mis töötab hästi versioonis 1C 7.7
1s 8.1 ei taha üldse käivitada ...
Proovisin ja kleepige see kausta C:\Program Files\1cv81\bin\cache1c.dll
Üritasin registreerida regsvr32 abil "C:\Program Files\1cv81\bin\cache1c.dll"
Registreeritud probleemideta.
Kui proovin sellele juurde pääseda, kuvatakse tõrketeade:

Viga väliskomponendi laadimisel! cache1c.dll
Protseduur Execute ButtonClick(Button) Katse laadida väline komponent( "C:\Program Files\1cv81\bin\cache1c.dll"); Erandi aruanne( "Väliskomponendi laadimisel tekkis viga!"+ "cache1c.dll"); Katse lõpp; Katse // Hangi komponendi objekt. // m = Uus ("cache1c.GTMcmd" ); m = Uus COMObject("cache1c.GTMcmd" ); Erandi aruanne(); Katse lõpp; Lõppprotseduur

Vastus: Banaalne kuni võimatuse piirini...
Kõnede vahel on vaja säilitada pause (millisekundeid)...
Protseduur ButtonExecuteClick(Button) Attempt // Hangi komponendi objekt. m = Uus COMObject("cache1c.GTMcmd" ); Erandi aruanne( "Välise komponendi objekti ei saanud luua"); Katse lõpp; m.RemoteHost = "192.168.1.101" ; m.RemotePort = 6330; m.Connect(); m.paus(100); ...... jne
1s 7,7 jaoks - see pole vajalik, selgub, et ringlus on kiirem.

Küsimus: välise komponendi töö 1C serveriga ...


Tere päevast,

Seal on C ++ keeles kirjutatud väline komponent, mille ülesanne on saada teavet välisest andmebaasist ja tagastada päringu tulemus 1C väärtuste tabeli kujul.
Väärtuste tabeli moodustamiseks praegusel hetkel kasutatakse liidest IDispatch* pBackConnection, mis võetakse vastu funktsiooni Init() parameetrina. Lisaks moodustan funktsioonide 1C abil lihtsalt väärtuste tabeli, täidan selle ja tagastan selle CallAsFunci teise parameetri juurde (...).
Probleemid algasid üleminekuga 1C õhukestele klientidele. Serveri poolel väline komponent tegelikult ei käivitu. Saate seda käivitada kliendi poolel, kuid see kõik näeb välja nagu kargud ja langeb 1C-s üldisest "kliendi-serveri" loogikast välja. Näiteks ei saa klient aru, mis on väärtuste tabel, probleemid "globaalsete" muutujatega, seanssidega jne.
NativeAPI on selles osas veelgi kärbitud.
Tamburiiniga tantsimine viis selleni, et sain käivitada välise komponendi 1C serveri all, AGA töö käib seni, kuni proovitakse kutsuda Invoke'i pBackConnectionis. Serveri 64-bitine versioon 8.2 üritab midagi teha, kuni see aegumiseni välja kukub, 32-bitine versioon (VK on loomulikult ka 32-bitine) kukub lihtsalt kohe välja.
Eeldan, et 1C server seda töörežiimi ei teeninda.
Sellest tulenevalt tekivad küsimused, kas see on ajutine või taandub 1C loogika selle tööskeemi kaotamisele? Kui sellisel viisil on võimatu luua sisemisi 1C struktuure (väärtuste tabelit), kas on põhimõtteliselt kirjeldus selle kohta, mis väärtuste tabel süsteemi tasemel on, et proovida seda C ++-s luua. , täitke see ja seejärel lihtsalt libistage tagastusparameetriks 1C? Tahaks saada vähemalt suuna, mis suunas kaevata.

Aitäh.

Vastus:

Kirjutad üht ja mõtled teist.
1C keskkonnas pole erinevates seanssides nähtavate muutujate deklareerimine praegu võimatu ega olnud võimalik ka varem. Erinev seanss on füüsiliselt erinev protsess.
Seanss on andmebaasi ühenduse seanss, st. kasutaja seanss. Või paned midagi oma ja selle kontseptsiooni?

Ühe seansi jooksul oli võimalik ja on ka praegu võimalik seansimoodulis deklareerida muutujaid, mis hakkavad elama ja seansi sees erinevatest kohtadest nähtavad... tegelikult on neid 4.
- Seansimoodul;
- tavarakenduse moodul;
- Hallatud rakenduste moodul;
- Väline ühendusmoodul.

Ja muidugi peate konteksti meeles pidama. Serveri kontekst ei ole kliendi poolel otse juurdepääsetav ja vastupidi.

Üldiselt näeb 1C arhitektuur ette, et andmevahetus jätkub:
- protseduuride/funktsioonide parameetrite/tagastustega;
- nn seansi parameetrite abil (need ei saa olla objektid, tegelikult näete seda paletis).

Tabel vormil... ja see on seotud mis tahes objekti tabeliga (näiteks töötlused)? või mitte. Kui jah, siis on see saadaval ka serveris (&AtServer) ja redigeeri seal....

Ja jah, ValueTable pole kliendi poolel UV-valguses saadaval. Noh, 1C otsustas nii.

Ole nüüd! Siin töötab see Exceliga, FSO ja paljude kõige muuga, kuid siin see ei tööta. Otsige veast kinni ja analüüsige....

Katse
...
teie tegevused
...
Erand
str = DescriptionError();
Katse lõpp;

Tänapäevaste riistvaravõimaluste juures pole see argument.

Puhtalt teie isiklik arvamus. Reaalsusega pole midagi pistmist. Mitte mingil juhul. Kordan veel kord, 1C töötab COM-iga suurepäraselt. Nii in-proc kui ka out-proc.

Andke kood, mille laadite üles ja rakendate VK-le.

Muide, VK... kas teie puhul on see COM või Native API?
Kui COM, siis registreerid selle nimega... regsvr32 kaudu... kuidas siis bitisügavuse probleemi "lahendada"?

Küsimus: Välise komponendi paigaldamine


Palun öelge mulle, kuidas välist komponenti installida. Järgmise koodi täitmisel kuvatakse tõrge. Otsige paigutusest üles NameDecl.dll

Katse määrata SetExternalComponent("GeneralLayout.Layout"); Erand EndTry ;
Viga: pistikprogrammi installimine ebaõnnestus!

Vastus: ()
ConnectExternalComponent("GeneralLayout.Layout", "NameDecl", ExternalComponentType.Native) tagastab FALSE ,
New("AddIn.NameDecl.CNameDecl", Undefined) = (()): tüüp pole määratletud (AddIn.NameDecl.NameDecl)

Küsimus: Native dll pole ühendatud versiooniga 1s 8.1 (fptrwin32_fz54_9_11_0_5549.dll)


Tere.
1C värskendas võrgukassade atol dll-i fdd 1.05 jaoks (sisaldub fptrwin32_fz54_9_11_0_5549.dll hooldusprotsessis).
Mul on vana 1C 8.1. Erinevalt versioonist 8.2 ei toeta see välisseadmetega töötamist samamoodi nagu 8.2, seega peate esmalt dll Windowsis registreerima ja seejärel ühendama selle ainult 1C-ga?

ProgID = "AddIn.IntegrationComponent.ATOL_KKT_1C83_V9"; LoadExternalComponent("C:\fptrwin32_fz54_9_11_0_5549.dll"); ConnectExternalComponent(ProgID); Draiver = Uus(ProgID);

Kuid vana töötlemine oli kirjutatud "technology" com-is ja uus emakeel. Sellest lähtuvalt annab regsvr32 registreerimisel vea:
Moodul laaditi, kuid DllRegisterServeri sisenemispunkti ei leitud. Ja soovitab kontrollida, kas see fail on õige dll- või OCX-fail.
Kes sarnase olukorraga kokku puutus, kuidas välja pääsesite? Saan aru, et sarnane probleem on 7.7-s.
Kood 8.2:

Layout = GetLayout("Integratsioonikomponent"); Aadress = PlaceInTempStorage(Layout); ConnectExternalComponent(aadress, "IntegrationComponent", ExternalComponentType.Native); Draiver = New("AddIn.IntegrationComponent.ATOL_KKT_1C83_V9");

1C 8.2:
Ühenda väline komponent (<Местоположение>, <Имя>, <Тип>)
1C 8.1:
Ühenda väline komponent (<Идентификатор объекта>)
Valikud:
<Идентификатор объекта>(nõutud)
Tüüp: string. Välise komponendi objekti ProgID (programmiline identifikaator). Peab ühtima süsteemi registreerimise andmebaasis (Registry) oleva teabega.
Kirjeldus:
Ühendab väliste komponentide objektid 1C:Enterprise'iga.
Pole saadaval serveris 1C:Enterprise. Ei kasutata välises ühendusmoodulis.
Märge:
Välised komponendid ühilduvad 1C:Enterprise 7.7 komponentidega.
Näide:
Katse
ConnectExternalComponent("AddinObject.Scanner");
alert("Vöötkoodiskanneri komponent on laaditud");
Erand
alert("Vöötkoodiskanneri komponenti pole laaditud");
Lõpeta katsed

Kas selle dll-i saab kuidagi ühendada 8.1-ga või mitte?

Aitäh!

Vastus:

Mul oli ka hiljuti see probleem. 1s hilisemale versioonile ei olnud võimalik teisendada. dll, millega see konfiguratsioon töötab, lihtsalt lakkas töötamast ja 1c kukkus välja veaga.
Probleem lahendati järgmisel viisil:
Tegin tühja andmebaasi 8.3, milles töötlesin komponendi lähtestamist ja siis 8.1-st COM ühenduse kaudu pääsesin varem loodud andmebaasi ja initsialiseerisin seal komponendi. Siis, juba 8.1-s, kutsusin selle komponendi meetodid välja.
Muidugi on see kark, kuid ma pole veel leidnud teist väljapääsu (

Koodi näide 8.3:
Remi draiveri eksport;
Funktsioon ÜhendusComponentsCCP() Eksport
Katse

Layout = GetLayout("Integratsioonikomponent");
Aadress = PlaceInTempStorage(Layout);
ConnectExternalComponent(aadress, "IntegrationComponent", ExternalComponentType.Native);
Draiver = New("AddIn.IntegrationComponent.SMDrvFR1C20");
tulemus = tõene;​

Erand

tulemus = vale;​

Katse lõpp;
Tagastamise tulemus
Lõppfunktsioonid

Koodi näide 8.1

Funktsioon CreateDriverObject(Driver) Export

tulemus = tõene;

Katse

ConnectionString="Fail="""Tee andmebaasi""";
ComObject= Uus COMObject("V83.Comnector");
Ühenda = ComObject.Connect(ConnectionString);

Töötlemine = Connect.Processing.ConnectingExternalComponent.Create();
ConnectionResult = Töötlemine.KKT komponentide ühendamine();
Kui tulemus ühendab, siis
Draiver = töötlemine. Draiver;
EndIf;

Erand
Kõik, kes on seda teinud või kogenud sarnaseid probleeme, palun selgitage. lihtne näide põhimõte ise. Tundub, et väliste komponentide ühendamisega on kõik selge.

// Näide väärtuste tabeli täitmisest TK.Clear(); Taotlus = uus taotlus; Query.Text = "VALI | Nomenklatuur Link KUIDAS Nomenklatuur | Directory.Nomenclature AS nomenklatuur"; QueryResult = Query.Execute(); Sampling = QueryResult.Select(); While Sampling.Next() Loop Str = TK.Add(); FillPropertyValues(Pr, Sampling); EndCycle;
Kas saaksite selle näitega selgitada, milline osa koodist tavaliselt välja võetakse. Loogiline oleks päringuga osa välja võtta, aga kuidas me siis väliskomponendist väliskomponendist andmebaasi pääseme, platvormist mööda minnes? Tekst on mõttetu. Või võtke välja tabeliosa moodustamine. Palun jagage oma kogemusi sellega.

Vastus: Ja et sõna "ühildumatu" tähendab alati sõna "halb"? Jah, mulle tundub, et kui ma nimetan oma stiili "1C: halvim programmeerimine sellel skriptimismootoril, mis looduses eksisteerib (tõlgitud kirjakeelde)!" ja siis kindlasti leidub neid, kes tahavad seda metsalist üle vaadata. Ja see näeb välja nagu klassika: "Ma pole Pasternaki lugenud, aga ma pole temaga täiesti nõus!" :)

Küsimus: välise komponendi ühendamine versioonides 1s 8.3.6 ja Win8


On vaja ühendada vk_rs232.dll ExternalComponent ise kirjutatud konfiguratsiooniga. Nagu regsvr32.exe kaudu registreeritud. "Tundub", sest sain teate, et "komponent on registreeritud, kuid tulemüüriga on midagi valesti." Sõnumi esimesele poolele toetudes kirjutan koodi 1s
AfterConnection = New NotificationDescription("AfterConnectionVK",See vorm); StartExternalComponentInstallation(,"C:\Controller\vk_rs232.dll"); StartConnectingExternalComponent(AfterConnecting,"C:\Controller\vk_rs232.dll","DLL_Scales");
ja ma saan sellest veast aru
"Välise komponendi installimine ebaõnnestus! Teie kasutatava klientrakenduse komponent võib puududa!".

Ja nüüd ma ei saa aru
1. Võib-olla pole komponenti registris registreeritud – kuidas seda seal kontrollida?
2. Võib-olla selle "versioon" ei tööta Win8 all, kuigi mul on see 32-bitine.
3. Võib-olla on 1s ise liiga uus, st. vastavalt sellele ei saa selle dll-iga töötada?
4. No see on banaalne – ma kirjutan midagi valesti.

Vastus: Ja see kõik viis mind järgmise probleemini. VneshComp installitud, nüüd peate selle ühendama. Ja siin on mõlemad variandid.
ConnectExternalComponent ("C:\Controller\vk_rs232.dll","Kaalud")
ConnectExternalComponent ("GeneralLayout.Layout","Scales")

Süntaksivalik: nime ja asukoha järgi

Süntaks:

Ühenda väline komponent (<Местоположение>, <Имя>, <Тип>)
Valikud:

<Местоположение>(nõutud)

Tüüp: string.
Välise komponendi asukoht.
Asukohta saab kasutada:
failisüsteemi välise komponendi faili tee (pole veebikliendis saadaval), mitte ZIP-arhiiv;
täisnimi paigutus, mis salvestab binaarandmeid või ZIP-arhiivi;
Välise komponendi URL binaarandmete või ZIP-arhiivi kujul, sarnaselt GetNaviLinkile.
<Имя>(nõutud)

Tüüp: string.
Ühendatava väliskomponendi sümboolne nimi.
Nimi peab järgima sisseehitatud keele nimetavasid.
<Тип>(valikuline)

Tüüp: välise komponendi tüüp.
Ühendatava välise komponendi tüüp.
Ei kasutata, kui komponent on pakitud ZIP-arhiivi.
Meetodi variandi kirjeldus:

Ühendab Native- ja COM-tehnoloogia abil valmistatud komponente.
Komponenti saab salvestada teabebaasi või konfiguratsioonipaigutusse binaarandmetena või ZIP-arhiivis.
Käivitusrežiimide "Õhuke klient" ja "Veebiklient" jaoks peab komponent olema eelnevalt installitud meetodil Install External Component.
Süntaksivalik: ID järgi

Süntaks:

Ühenda väline komponent (<ИдентификаторОбъекта>)
Valikud:

<ИдентификаторОбъекта>(nõutud)

Tüüp: string.
Välise komponendi objekti identifikaator MS Windowsi registri ProgID (Programmatic Identifier) ​​kujul (näiteks: "AddIn.Scanner").
Peab ühtima süsteemi registreerimise andmebaasis (Registry) oleva teabega.
Meetodi variandi kirjeldus:

Komponent peab olema realiseeritud COM-tehnoloogia abil ja registreeritud MS Windowsi registris.
Need komponendid ühilduvad 1C:Enterprise 7.7 komponentidega.
Tähelepanu! Meetodi variant ei tööta serveris ja välisühenduses.
Tagastusväärtus:

Tüüp: Boolean.
Tõsi – ühendus õnnestus.
Kirjeldus:

Ühendab välise komponendi 1C:Enterprise'iga.
Välised komponendid saab salvestada teabebaasi või konfiguratsioonipaigutustesse ZIP-arhiivina või binaarandmetena või failisüsteemi faili.
Töötades õhukese kliendi ja veebikliendiga, peab komponent olema eelinstallitud.

Saadavus:

Õhuke klient, veebiklient, server, välisühendus.
Märge:

Väliseid komponente saab juurutada kasutades Native API või COM tehnoloogiat. COM-tehnoloogia abil valmistatud komponendid ühilduvad 1C:Enterprise 7.7 komponentidega.
Veebiklient saab töötada ainult teabebaasi komponentidega, mis on pakitud arhiivi.
Õhuke klient saab töötada teabebaasi komponentidega, mis on pakitud arhiivi, ja komponentidega, mis asuvad failisüsteemis.
Paks klient saab töötada kõigi komponentide salvestusvõimalustega. Sellisel juhul, kui komponent on installitud meetodil InstallExternalComponent, siis kasutatakse installitud komponenti ja kui see pole installitud, siis võetakse komponent vastu ühendamise hetkel.
Server saab töötada kõigi komponentidega. Komponent salvestatakse serveriseansi jaoks vahemällu.
Näide:

Kui ConnectExternalComponent("AddinObject.Scanner") Siis
alert("Vöötkoodiskanneri komponent on laaditud");
Muidu
alert("Vöötkoodiskanneri komponenti pole laaditud");
EndIf;

  • õpetus

Sissejuhatus

See artikkel annab ülevaate sellest, kuidas väliskomponendid süsteemis 1C:Enterprise töötavad.
Kuvatakse Windowsi operatsioonisüsteemis töötava süsteemi 1C:Enterprise versioon 8.2 välise komponendi väljatöötamise protsess koos töö failiversiooniga. Seda valikut kasutatakse enamikes väikeettevõtetele mõeldud lahendustes. VC rakendatakse C++ programmeerimiskeeles.

Välised komponendid "1C: Enterprise"

"1C: Enterprise" on laiendatav süsteem. Laiendamiseks funktsionaalsust süsteem kasutab väliseid komponente (VC). Arendaja seisukohast on VC väline objekt, millel on omadused ja meetodid ning mis võib genereerida ka sündmusi töötlemiseks süsteemis 1C:Enterprise.
Väliseid komponente saab kasutada selliste ülesannete lahendamiseks, mida on 1C: Enterprise sisseehitatud programmeerimiskeele abil keeruline või isegi võimatu rakendada. Eelkõige sisaldab see klass ülesandeid, mis nõuavad madalal tasemel suhtlemist operatsioonisüsteemiga, näiteks konkreetse riistvaraga töötamiseks.
Süsteem 1C:Enterprise kasutab väliskomponentide loomiseks kahte tehnoloogiat:
  • kasutades Native API-d
  • kasutades COM-tehnoloogiat
Arvestades kahe ülaltoodud tehnoloogia vahelisi piiranguid, on erinevus tähtsusetu, seega kaalume VK arendamist Native API abil. Vajadusel saab rakendatud arendusi rakendada VC arendamisel COM-tehnoloogia abil ning väikeste muudatustega rakendada ka 1C: Enterprise süsteemis kasutamiseks muude töövõimalustega peale faili töörežiimi.
VK struktuur
Süsteemi 1C:Enterprise väliskomponent on esitatud DLL-i teegina. Teegi kood kirjeldab IComponentBase'i tuletatud klassi. Loodavas klassis tuleb määratleda väliskomponendi funktsioonide realiseerimise eest vastutavad meetodid. Ülejäetud meetodeid kirjeldatakse täpsemalt hiljem materjali tutvustamise käigus.

Demo VK käivitamine

Ülesanne:
  1. Pange kokku ITS-i tellimusega kaasas olev väline komponent, mis on loodud 1C-s välise komponendi mehhanismi peamiste võimaluste demonstreerimiseks
  2. Ühendage demokomponent 1C konfiguratsiooniga
  3. Veenduge, et deklareeritud funktsioonid töötavad õigesti
Koostamine
Demo-VC asub ITS-i tellimiskettal kataloogis "/VNCOMP82/example/NativeAPI".
Demo-VK koostamiseks kasutame Microsoft Visual Studio 2008. Selle toote muud versioonid ei toeta kasutatud Visual Studio projektivormingut.


Avage projekt AddInNative. Projekti seadistustes ühendame kataloogi projekti koostamiseks vajalike päisefailidega. Vaikimisi asuvad need ITS-i kettal kataloogis /VNCOMP82/include.
Ehitamise tulemus on fail /bind/AddInNative.dll. See on koostatud teek 1C konfiguratsiooniga ühenduse loomiseks.
VK ühendamine 1C konfiguratsiooniga
Loome tühja konfiguratsiooni 1C.
Järgmine on hallatava rakenduse mooduli kood.
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...\bind\AddInNative.dll", "DemoVK", ExternalComponentType.Native); DemoComp = New("AddIn.DemoVK.AddInNativeExtension"); Lõppprotseduur
Kui 1C konfiguratsiooni käivitamisel viga ei teatatud, ühendati VK edukalt.
Ülaltoodud koodi täitmise tulemusena ilmub konfiguratsiooni globaalsesse nähtavusse objekt DemoComp Sellel on omadused ja meetodid, mis on määratletud välises ubakoodis.
Manustatud funktsionaalsuse demonstreerimine
Kontrollime demo VK jõudlust. Selleks proovime määrata ja lugeda mõningaid omadusi, kutsuda välja mõned VK meetodid ning võtta vastu ja töödelda ka VK-teade.
ITS-kettal olevas dokumentatsioonis on toodud demo-VC järgmised funktsioonid:
  1. Komponendi objekti olekuhaldus
    Meetodid: Lülitage sisse, Välja lülitama
    Omadused: Kaasas
  2. Taimeri juhtimine
    Iga sekundi järel saadab komponent süsteemile 1C: Enterprise sõnumi koos parameetritega Komponent, taimer ja süsteemi kella loenduri string.
    Meetodid: Käivitamise taimer, StopTimer
    Omadused: Seal on taimer
  3. meetod ShowInStatusLine, mis kuvab olekuribal meetodile parameetritena edastatud teksti
  4. meetod Lae pilt üles. Laadib pildi määratud failist ja edastab selle binaarandmetena süsteemi 1C:Enterprise.
Veenduge, et need funktsioonid töötavad. Selleks käivitame järgmise koodi:
var DemoComp; SystemStart() Protseduur ConnectExternalComponent(...); DemoComp = New("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Disable(); Teavita (DemoComp. Enabled); DemoComp.Enable(); Teavita (DemoComp. Enabled); DemoComp.StartTimer(); EndProcedure ProcedureExternalEventHandler(Allikas, Sündmus, Andmed) Aruanne(Allikas + " " + Sündmus + " " + Andmed); Lõppprotseduur
Konfiguratsiooni käivitamise tulemus on näidatud pildil


Meetodikutsete tulemused kuvatakse paneelil "Sõnumid". DemoComp.Disable() ja Demo.Comp.Enable(). Sama paneeli järgmised read sisaldavad VK-lt saadud sõnumite töötlemise tulemusi - Allikas, Sündmus ja Andmed vastavalt.

Välise komponendi meelevaldne nimi

Ülesanne: muutke väliskomponendi nimi suvaliseks.
Eelmises jaotises kasutati identifikaatorit AddInNativeExtension, mille tähendust ei selgitatud. Sel juhul AddInNativeExtension on laienduse nimi.
VC-kood määratleb meetodi RegisterExtensionAs, mis tagastab nime süsteemile 1C: Enterprise, mis on vajalik VC järgnevaks registreerimiseks süsteemis. Soovitatav on määrata identifikaator, mis teatud määral paljastab välise komponendi olemuse.
Siin on meetodi täielik kood RegisterExtensionAs muudetud laiendi nimega:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* siht = 0; if (m-m_Mälu_mälu ((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); return true; ) return false; )
Ülaltoodud näites on VK nimeks muudetud Mingi nimi. Seejärel peate VK ühendamisel määrama uue nime:
DemoComp = Uus("AddIn.DemoVK.SomeName");

VK kinnistute nimekirja laiendamine

Ülesanne:
  1. Uurige VC omaduste rakendamist
  2. Lisage stringi tüüpi lugemis-kirjutamisomadus
  3. Lisage lugemis-/kirjutusstringitüübi atribuut, mis salvestab atribuudi viimati määratud andmetüübi. Vara väärtuse määramisel ei võeta midagi ette

Loodava komponendi omaduste määratlemiseks peab arendaja rakendama AddInNative.cpp teegi koodis järgmised meetodid:
GetNprops
Tagastab selle laienduse atribuutide arvu, 0, kui atribuute pole
FindProp
Tagastab selle atribuudi järjekorranumbri, mille nimi parameetrites edastatakse
HangiPropName
Tagastab atribuudi nime selle järgu ja edastatud keele ID järgi
GetPropVal
Tagastab vara väärtuse määratud järjekorraga
SetPropVal
Määrab vara väärtuse määratud järgarvuga
IsPropReadable
Tagastab atribuudi loetavuse lipu määratud järjekorraga
IsPropWritable
Tagastab atribuudi kirjutatavuse lipu määratud järjenumbriga


Kaaluge ülaltoodud klassimeetodite rakendamist CAddInNative.
Demo-VC määratleb 2 omadust: Kaasas ja Seal on taimer (On Lubatud ja IsTimerPresent).
Teegi koodi globaalses ulatuses on määratletud kaks massiivi:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Lubatud", L"Taimer on olemas");
mis salvestavad kinnistute vene- ja ingliskeelsed nimed. Päisefailis AddInNative.h enum on määratletud:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Alati viimane );
ePropIsEnabled ja ePropIsTimerPresent, mille väärtused on vastavalt 0 ja 1, kasutatakse omaduste järjekorranumbrite asendamiseks tähenduslike identifikaatoritega. Atribuutide arvu saamiseks kasutatakse ePropLasti, mille väärtus on 2 (meetodil GetNprops). Neid nimesid kasutatakse ainult komponendi koodi sees ja need ei ole väljastpoolt juurdepääsetavad.
Meetodid FindProp ja GetPropName otsivad massiive g_PropNames ja g_PropNames.
Teegi mooduli väljade väärtuse salvestamiseks on klassis CAddInNative atribuudid, mis salvestavad komponendi atribuutide väärtuse. meetodid GetPropVal ja SetPropVal vastavalt tagastada ja määrata nende omaduste väärtus.
meetodid IsPropReadable ja IsPropWritable ja tagasi tõsi või vale, olenevalt läbitud omaduse järgust vastavalt rakendusloogikale.
Kohandatud atribuudi lisamiseks tehke järgmist.

  1. Lisa massiividesse lisatava atribuudi nimi g_PropNames ja g_PropNames(fail AddInNative.cpp)
  2. Loendamisele rekvisiidid(fail AddInNative.h) enne ePropLast lisage lisatava atribuudi üheselt identifitseeriv nimi
  3. Korraldage mälu atribuutide väärtuste salvestamiseks (looge komponentmooduli väljad, mis salvestavad vastavad väärtused)
  4. Tehke meetodites muudatusi GetPropVal ja SetPropVal eelmises etapis eraldatud mäluga suhtlemiseks
  5. Vastavalt rakendusloogikale tehke meetodites muudatused IsPropReadable ja IsPropWritable
Üksused 1, 2, 5 ei vaja selgitust. Nende sammude rakendamise üksikasjad leiate artikli lisast.
Nimetagem testi omadused Test ja Tüübi kontroll vastavalt. Lõike 1 tulemusena on meil:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Lubatud", L"HasTimer", L"Test", L"CheckType");
Loendamine rekvisiidid näeb välja selline:
enum Props ( ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Alati viimane );
Koodi oluliseks lihtsustamiseks kasutame STL C++. Eelkõige keelpillidega töötamiseks WCHAR, ühendage raamatukogu wstring.
Meetodi väärtuse salvestamiseks Test, määratlege klassis CAddInNative privaatväljal:
string test1;
Stringiparameetrite edastamiseks 1C:Enterprise'i ja välise komponendi vahel kasutatakse mäluhaldurit 1C:Enterprise. Vaatame tema tööd lähemalt. Mälu eraldamiseks ja vabastamiseks kasutage funktsioone AllocMemory ja Vaba mälu, failis määratletud Mäluhaldur.h. Kui süsteemile 1C: Enterprise on vaja edastada stringi parameeter, peab väline komponent eraldama selle jaoks mälu funktsiooni kutsudes. AllocMemory. Selle prototüüp näeb välja selline:
virtual bool ADDIN_API AllocMemory (tühine** pMemory, allkirjastamata pikk ulCountByte) = 0;
kus pMälu- selle kursori aadress, kuhu eraldatud mälu aadress asetatakse,
ulCountByte- eraldatud mäluala suurus.
Näide stringile mälu eraldamisest:
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * suurus(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Stringi andmetüüpidega töötamise mugavuse huvides kirjeldame funktsiooni wstring_p. See võtab parameetrina wstringi stringi. Funktsiooni tulemuseks on täidetud struktuur tVariant. Funktsiooni kood:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) ( char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * suurus(WCHAR_T)); memcpy(t1, str.c_str(), (str.length()+1) * suurus(WCHAR_T)); val -> pstrVal = t1; val -> strLen = str.length(); tagasi tõeseks;)
Seejärel meetodi lüliti avalduse vastav käändeosa GetPropVal toimub järgmisel kujul:
juhtum ePropTest1: wstring_to_p(test1, pvarPropVal); murda;
meetod SetPropVal:
case ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) return false; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); murda;
Teise omaduse rakendamiseks määratleme klassivälja CaddInNative
uint8_t last_type;
kuhu salvestame viimati edastatud väärtuse tüübi. Selleks lisage meetodile CaddInNative::SetPropVal järgmine käsk:
viimane_tüüp = TV_VT(varPropVal);
Nüüd, kui taotlete teise vara väärtuse lugemist, tagastame selle väärtuse viimane_tüüp, mida määratud ülesanne nõuab.
Kontrollime tehtud muudatuste toimivust.
Selleks esitleme välimus konfiguratsioon 1C vaatele:
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = Uus("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; Aruanne(String(DemoComp.TypeCheck)); DemoComp.Test = "Vasya"; Aruanne(String(DemoComp.Test)); DemoComp.Test = "Petya"; Aruanne(String(DemoComp.Test)); Aruanne(String(DemoComp.TypeCheck)); Lõppprotseduur
Käivitamise tulemusena saame sõnumite jada:
3
Vasja
Petya
22

Teine ja kolmas teade on eelmises etapis seatud atribuudi lugemise tulemus. Esimene ja teine ​​teade sisaldavad viimase atribuutide komplekti tüübikoodi. 3 vastab täisarvu väärtusele, 22 - stringi väärtusele. Tüüpide ja nende koodide vastavus tuvastatakse failis tüübid.h, mis asub ITS-i kettal.

Meetodite loendi laiendamine

Ülesanne:
  1. Laiendage välise komponendi funktsionaalsust järgmiste funktsioonidega:
  2. Siit saate teada, kuidas rakendada väliste komponentide meetodeid
  3. Lisa meetod-funktsioon Funktsioon1, mis võtab parameetrina kaks stringi ("Parameeter1" ja "Parameeter2"). Selle tulemusena tagastatakse vormi string: „Kontrolli. Parameeter1, parameeter 2"
  4. Veenduge, et tehtud muudatused töötavad.

Loodava komponendi meetodite määratlemiseks peab arendaja rakendama AddInNative teegi koodis järgmised meetodid:
GetNMethods, Otsi meetod, GetMethodName
Mõeldud vastavalt meetodite arvu saamiseks, meetodi numbri ja nime otsimiseks. Sarnaselt omaduste vastavate meetoditega
GetNParams
Tagastab määratud järjenumbriga meetodi parameetrite arvu; kui selle numbriga meetodit pole või sellel pole parameetreid, tagastab 0
GetParamDefValue
Tagastab määratud meetodi määratud parameetri vaikeväärtuse
HasRetVal
Tagastab lipu, mis määratud tagastusväärtusega järgarvuga meetodil on: true meetodite puhul, millel on tagastusväärtus ja vale muidu
CallAsProc
vale, ilmneb käitusaegne tõrge ja mooduli 1C: Enterprise täitmine peatub. Parameetrite massiivi mälu eraldab ja vabastab 1C: Enterprise.
CallAsFunc
Käivitab meetodi määratud järgarvuga. Kui meetod naaseb vale, ilmneb käitusaegne tõrge ja mooduli 1C: Enterprise täitmine peatub. Parameetrite massiivi mälu eraldab 1C: Enterprise. Kui tagastatav väärtus on stringi või kahendandmete tüüpi, eraldab komponent funktsiooniga mälu AllocMemory mäluhaldur, kirjutab sinna andmed ja salvestab selle aadressi struktuuri vastavale väljale. 1С: Ettevõte vabastab selle mälu helistades Vaba mälu.
Meetodite täielikku kirjeldust, sealhulgas parameetrite loendit, kirjeldatakse üksikasjalikult ITS-kettale lisatud dokumentatsioonis.
Kaaluge ülalkirjeldatud meetodite rakendamist.
Komponendi koodis on määratletud kaks massiivi:
static wchar_t *g_MethodNames = (L"Luba", L"Keela", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Luba", L"Keela", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage");
ja enum:
enum Methods ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Alati viimane );
Neid kasutatakse funktsioonides GetNMethods, Otsi meetod ja GetMethodName, analoogselt omaduste kirjeldusega.
meetodid GetNParams, GetParamDefValue, HasRetVal tööseadme lüliti, olenevalt läbitud parameetritest ja rakenduse loogikast, tagastab vajaliku väärtuse. meetod HasRetVal selle koodis on loend ainult meetoditest, mis võivad tulemuse tagastada. Nende jaoks tuleb see tagasi tõsi. Kõigi terasmeetodite puhul tagastab vale.
meetodid CallAsProc ja CallAsFunc sisaldavad otse käivitatavat meetodi koodi.
Meetodi lisamiseks, mida saab kutsuda ainult funktsioonina, peate väliskomponendi lähtekoodis tegema järgmised muudatused:
  1. Lisage massiividele meetodi nimi g_MethodNames ja g_MethodNames(fail AddInNative.cpp)
  2. Lisage meetodite loendisse tähenduslik meetodi identifikaator (fail AddInNative.h)
  3. Tehke funktsiooni koodis muudatused GetNParams programmi loogika järgi
  4. Vajadusel tehke meetodi koodis muudatused GetParamDefValue kui soovite kasutada meetodi parameetrite vaikeväärtusi.
  5. Tehke funktsioonis muudatused HasRetVal
  6. Muutke funktsioonide loogikat CallAsProc või CallAsFunc, asetades sinna meetodi otse käivitatava koodi
Toome massiive g_MethodNames ja g_MethodNames, samuti loendus meetodid vaatele:
static wchar_t *g_MethodNames = (L"Luba", L"Keela", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Luba", L"Keela", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage", L"Test");

Enum Methods ( eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Alati viimane );
Redigeerime funktsiooni GetNprops nii, et see tagastab meetodi "Test" parameetrite arvu:
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: return 1; case eMethLoadPicture: return 1; case eMethTest: return 2; default: return 0; ) return 0; )
Teeme funktsioonis muudatused:
booli caddintotive :: getParamDefValue (const pikk lMethodnum, const pikk lparamnum, tvariant *pvarparamdefValue) (tv_vt (pvarparamdefValue) = vtype_empty; switch (lMetodNum) (juhtum EMetStMable: EMETHDOW: EMTHOW: EMTHOW: EMTHOW : case / Vaikimisi pole parameetrite väärtusi; vaikimisi: return false; ) return false; )
Tänu lisatud reale
juhtum eMethTest:
ühe või mitme argumendi puudumisel on vastavatel parameetritel tühi väärtus ( VTYPE_EMPTY). Kui vajate parameetri vaikeväärtust, peate selle jaotises määrama eMethTest funktsiooni lüliti avaldus CAddInNative::GetParamDefValue.
Kuna meetod "Test" võib tagastada väärtuse, peate funktsiooni koodis muutma HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; vaikimisi: return false; ) return false; )
Ja lisage funktsioonile meetodi käivitatav kood CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) ( case eMethLoadPestic: ...MethLoadPestic: ... if (!lSizeArray || !paParams) tagastab false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; wstring_to_p(std::wstring(s1+s2), pvarRetValue); ret = true ; murda; ) tagasi ret;)
Kompileerime komponendi ja toome konfiguratsioonikoodi vormile:
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = Uus("AddIn.DemoVK.SomeName"); lane = DemoComp.Test("Tere, ", "Maailm!"); Teavita (trans); Lõppprotseduur
Pärast seadistamise alustamist saame teate: "Tere, maailm!", Mis näitab, et meetod on edukalt töötanud.

Taimer

Ülesanne:
  1. Uurige taimeri rakendamist demo VK-s
  2. Muutke meetodit "StartTimer", lisades parameetritesse võimaluse edastada taimeri intervall (millisekundites)
  3. Veenduge, et tehtud muudatused töötavad.

WinAPI-s saate ajaga töötamiseks kasutada sõnumit WM_TIMER. See sõnum saadetakse teie programmile ajaintervalli jooksul, mille määrate taimeri loomisel.
Taimeri loomiseks kasutage funktsiooni SetTimer:
UINT SetTimer(HWND hWnd, // akna käepide UINT nIDevent, // taimeri identifikaator (number) UINT nElapse, // viivitus TIMERPROC lpTimerFunc); // funktsiooni osuti
Operatsioonisüsteem saadab sõnumi WM_TIMER programmile argumendis määratud intervalliga nAeg(millisekundites). Viimases parameetris saate määrata funktsiooni, mis käivitatakse iga kord, kui taimer käivitub. Selle funktsiooni päis peaks välja nägema järgmine (nimi võib olla ükskõik milline):
void __stdcall TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Kaaluge taimeri rakendamist demo VK-s.
Kuna me kaalume Windowsi perekonna OS-i välise komponendi väljatöötamise protsessi, ei võta me taimeri kasutuselevõttu arvesse teistes operatsioonisüsteemid. Eelkõige GNU/Linux OS-i puhul erineb rakendamine funktsiooni süntaksi poolest SetTimer ja TimerProc.
Meetodit kutsutakse käivitatavas koodis SetTimer, millele funktsioon edastatakse MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Loodud taimeri ID asetatakse muutujasse m_uiTimer et saaksite selle hiljem välja lülitada.
Funktsioon MyTimerProc järgnevalt:
VOID CALLBACK MyTimerProc(HWND hwnd, // taimeriteadete akna käepide UINT uMsg, // WM_TIMER teade UINT idEvent, // taimeri identifikaator DWORD dwTime // praegune süsteemiaeg) ( if (!pAsyncEvent) return; wchar_t *who "ComponentNative", *what = L"Taimer"; wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(who , mis, wstime); kustuta wstime; ) )
Funktsiooni olemus seisneb selles, et meetod kutsutakse Väline sündmus, mis saadab sõnumi süsteemile 1C: Enterprise.
Meetodi funktsionaalsuse laiendamiseks Käivitamise taimer teeme järgmist:
Meetodi koodi muutmine GetNParams nii et see on meetodi jaoks eMethStartTimer tagastatud väärtus 1:
case eMethStartTimer: tagastamine 1;
Siin on meetodi kood CallAsProc vaatele:
case eMethStartTimer: if (!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;
Nüüd kontrollime funktsionaalsust. Selleks kirjutame konfiguratsiooni hallatava rakenduse moodulisse koodi:
var DemoComp; SystemStartup Procedure() ConnectExternalComponent("...", "DemoVK", ExternalComponentType.Native); DemoComp = Uus("AddIn.DemoVK.SomeName"); DemoComp.StartTimer(2000); Lõppprotseduur
Pärast konfigureerimise käivitamist saab programm 2-sekundilise intervalliga teateid, mis näitavad taimeri õiget tööd.

Koostoime süsteemiga 1C: Enterprise

Välise komponendi ja süsteemi 1C:Enterprise interaktsiooni jaoks failis kirjeldatud klassi IAddInDefBase meetodid AddInDefBase.h. Loetleme kõige sagedamini kasutatavad:
Veateadete genereerimine
virtuaalne bool ADDIN_API AddError (allkirjata lühike wkood, konst WCHAR_T* allikas, konst WCHAR_T* descr, pikk kood)
wcode, kood- veakoodid (tõrkekoodide loendi koos kirjeldusega leiate ITS-i kettalt)
allikas- vea allikas
kirjeldus- vea kirjeldus
Sõnumi saatmine süsteemile 1C: Enterprise
virtual bool ADDIN_API väline sündmus(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszSource- sõnumi allikas
wszSõnum- Sõnumi tekst
wszData- edastatud andmed
Sõnumi pealtkuulamine toimub protseduuriga HandlingExternalEvent
Välise komponendi registreerimine süsteemis 1C:Enterprise
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfiilinimi- komponendi nimi.
Need meetodid on piisavad VK ja 1C täielikuks koostoimeks. Andmete vastuvõtmiseks välise komponendi kaudu süsteemist 1C: Enterprise ja vastupidi saadab väline komponent spetsiaalse sõnumi, mille omakorda püüab 1C süsteem kinni ja vajadusel kutsub välja välise komponendi meetodid saatmiseks. tagasiandmed.

tVariant andmetüüp

Andmete vahetamisel välise komponendi ja süsteemi 1C:Enterprise vahel kasutatakse andmetüüpi tVariant. Seda kirjeldatakse failis type.h, mille leiate ITS-i kettalt:
struct _tvariant (_anonyous_union Union (int8_t i8Val; int16_t ShortVal; int32_t lval; int intVal; allkirjastamata int uintval; int64_t llval; uint8_t ui8Val; uint16_t ushortval; uint32_t ulval; uint 64_ode; bVal; char chVal; wchar_t wchVal; DATE kuupäev; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; _ANONYMOUS_STRUCT struct ( void* pInterfaceVal; IID liidese ID; ) __VARIANT_NAME_2/*iface____________________________________________________________________________________________________________ /baitide arv ) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT struct ( WCHAR_T* pwstrVal; uint32_t wstrLen; //sümbolite arv ) __VARIANT_NAME_4/*wstr*/; ) __VARIANT_NAME_E massiivi /b-dimensiooni_nimi3_1 jaoks; in pvarVal TYPEVAR vt; );
Tüüp tVariant on struktuur, mis sisaldab:
  • segu (liit), mis on ette nähtud otse andmete salvestamiseks
  • andmetüübi identifikaator
Üldiselt tüüpi muutujatega töötamine tVariant toimub vastavalt järgmisele algoritmile:
  1. Hetkel muutujas salvestatud andmete tüübi määramine
  2. Juurdepääs segu vastavale väljale, andmetele vahetuks juurdepääsuks
Tüübi kasutamine tVariant lihtsustab oluliselt 1C: Enterprise süsteemi ja välise komponendi koostoimet

Rakendus

Kataloog "näited" sisaldab artikli näiteid
näited/1 – käivitage demokomponent
näited/2 - atribuutide loendi laienduse demo
näited/3 - meetodite loendi laienduse demonstratsioon
Iga kataloog sisaldab VS 2008 projekti ja eelehitatud 1C konfiguratsiooni.

Sageli on programmeerijatel probleeme väliste komponentide (näiteks kaubanduslike seadmete draiverite) ühendamisega, kui kasutajad töötavad 1C-ga, luues terminali kaudu ühenduse serveriga.

Samal ajal näevad kasutajad näiteks artikli kuulutuses toodud pilti.

Samal ajal kui kohalikest arvutitest töötades pole väliste komponentide ühendamisega probleeme.

Millega see seotud on? Selle põhjuseks on asjaolu, et kui kasutajad töötavad terminaliserveri kaudu, on neil vähem õigusi kui kohalikus arvutis töötades.

Seda on lihtne kontrollida, kui logite terminaliserverisse sisse administraatoriõigustega kontoga.

Selle erinevuse põhjuseks on asjaolu, et 1C ei saa välist komponenti registris registreerida, kui kasutaja töötab terminalis tavaõigustega, kuna tavakasutajal pole süsteemiregistri harus kirjutamisõigusi HKEY_CLASSES_ROOT.

Terminali väliskomponentide ühendamise teemalistes väljaannetes pakutakse selle probleemi lahendamiseks mitmesuguseid meetodeid.

Näiteks need:

1. Käivitage 1C esimest korda administraatoriõigustega.

See valik ei tööta alati. Ma selgitan allpool, miks.

2. Andke terminali tavakasutajatele kirjutamisõigus süsteemi registri harusse HKEY_CLASSES_ROOT.

Ebapiisavalt "arenenud" kasutajad ei tohiks seda teha, vastasel juhul võivad tekkida probleemid.

3. Erinevate "vidinate" abil registreerige VK täisõigustega kasutaja nimel.

Süüa pole ka hea.

Mis on siis parim viis sellest olukorrast välja tulla?

Pakun sellele probleemile oma lahenduse. Minu meelest - lihtne ja ilus, varem infostardis ei pakutud.

Seda probleemi uurides mõtlesin - miks 1C üldse üritab VK-d uut teed pidi registreerida? Lõppude lõpuks on see juba süsteemis registreeritud.

Asi selgus selles, et tüüpilistes 1C konfiguratsioonides (näiteks "Trade Management") kasutatakse järgmist globaalse konteksti meetodi süntaksit ConnectExternalComponent() :

ConnectExternalComponent("Reference.Connected Equipment.Layout.DriverATOLBarcodeScanner", "ATOLScanner");

Nagu näete, on VK draiver ühendatud kataloogi "Ühendatud seadmed" paigutusega "DriverATOLScannerBarcode".

Mis siis juhtub?

1C salvestab komponendi kasutaja ajutisse kausta, näiteks "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

ja proovib seda sellel teel registreerida HKEY_CLASSES_ROOT registriharus.

Terminalis pole tavakasutajatel õigust seda registriharu muuta, seega pole komponenti nende jaoks ühendatud.

Nüüd sellest, kuidas sellest olukorrast välja tulla.

Globaalse konteksti meetod Rakendusel ConnectExternalComponent() on mitu süntaksivalikut. Seda me kasutamegi.

Niisiis, samm-sammult:

1. Registreerige väliskomponent terminaliserveri utiliidi regsvr32.exe abil kaustas C:\WINDOWS\SYSTEM32 32-bitise operatsioonisüsteemi jaoks või kaustas C:\WINDOWS\SYSWOW64 64-bitise operatsioonisüsteemi jaoks.

2. Kasutage meetodi ConnectExternalComponent() jaoks üht kahest täiendavast süntaksivalikust.

Valik 1:

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

DriverObject = Uus("AddIn.ATOLScanner.Scanner45");

2. valik:

ProgID = "AddIn.Scanner45";

Ühendage väline komponent (ProgID);

DriverObject = Uus(ProgID);

Minu arvates on eelistatav variant nr 2.

Samal ajal ei proovi 1C VC-d registris uuel teel ümber registreerida ja seega on kõik probleemid lahendatud.

Noh, see on kõik. Edu tööl!

Näiteks ei ole võimalik komponenti ümber kirjutada, kui te pole selle autor ja lähtekoode lihtsalt pole. Või kui Native API tehnoloogia toetatud lihtsamatest tüüpidest (number, string, tõeväärtus, kuupäev) selle tööks ei piisa.

Failibaasiga töötamisel pole erilisi probleeme. Ajastatud ülesanne kutsutakse välja tavakasutaja taustaprotsessis. Seetõttu on kliendikõned talle kättesaadavad. Ajastatud ülesande käivitamisel pole serveri andmebaasis kliendi konteksti, seega kõne ConnectExternalComponent() pole saadaval.

Sel juhul saate komponendile kliendil helistada. Selleks piisab, kui käivitada serveris ajastatud ülesandest veel üks 1C seanss, mille käigus kliendil vajalikud toimingud teha. Noh, ärge unustage jooksuseanssi hiljem lõpetada.

Oletame, et ajastatud ülesandes loome ja salvestame aruande, mis kasutab täisnimest keeldumiseks välist COM-komponenti NameDeclension.dll. Failibaasil töötab selline ajastatud ülesanne õigesti, kuid see ei tööta serverikomponendis.

Probleemi lahendamiseks lisame ajastatud tegumimoodulisse protseduuri, mis käivitab serverirežiimis uue seansi ja selles käivitab välistöötluse kaudu kliendile aruande genereerimise kõne.

#If Client Then Procedure ExecuteFormationAndSavingReport() Ekspordi If ConnectExternalComponent("CommonLayout.NAMEDECL","Cl",ExternalComponentType.COM) Then Component = New ("AddIn.Cl.NameDeclension"); //Siin on kood aruande genereerimiseks ja salvestamiseks ElseJoinRegisterLog("RegistTask", LevelJoinLog.Error, "Kliendi välise komponendi ühendamine ebaõnnestus"); EndIf; Protseduuri lõpp #Muidu Protseduur ExecuteFormationAndSavingReport() Eksport ExecuteOperationOnClient("RegularTasks.ExecuteFormationAndSavingReport()"); EndProcedure Procedure PerformOperationOnClient(ParameterToExecute) ExportUserName = ""; UserPassword = ""; PathToExternalProcessing = "c:/temp/Autostart.epf"; Tsitaat = """"; DirectoryBIN = DirectoryProgram(); PathToConfiguration = InfoBase ConnectionString(); ConfigurationPath = StrReplace(ConfigurationPath, tsitaat, tsitaat + tsitaat); StartString = Quote + Bin Directory + "1cv8.exe" + Quote + " ENTERPRISE" + " /IBConnectionString " + Quote + ConfigurationPath + Quote + " /N " + Quate + Username + Quote + " /P " + Quate + User Password + Quote + " /Execute" + Quote + PathToExternalProcessing + Quote + " /C " + Quote + ParameterToExecute + Quote; StartApplication(StartString); Protseduur #EndIf

Väline töötlemiskood, mis paneb kliendi konteksti lihtsalt ajastatud tööde moodulist vajaliku aruande printima ja pärast aruande loomist seansi lõpetama.

Katse käivitada(StartupParameter); Erand EndTry; ShutdownSystem (False);

Lahenduse mugavus seisneb selles, et ajastatud ülesannete seadistamisel pole vahet, millises režiimis ülesanne käivitatakse. Kui andmebaas on fail, algab vajalik protseduur kohe. Kui andmebaas on serveripoolne ja käivitamisel pole kliendi konteksti, siis lähtestatakse uus seanss ja protseduur töötab kliendi kontekstis õigesti.

Tüüpilise rakenduse kood. Teoreetiliselt töötab see samamoodi ka hallatavas.

p.s. Seda lähenemisviisi saab kasutada ka mis tahes kliendiprotseduuride täitmiseks ajastatud töödes.

KELL

On neid, kes loevad seda uudist enne sind.
Tellige uusimate artiklite saamiseks.
Meil
Nimi
Perekonnanimi
Kuidas teile meeldiks Kellukest lugeda
Rämpsposti pole