Obținerea de informații despre proprietățile de export și metodele de obiecte 1c prin com

Cum se determină compoziția proprietăților și a metodelor obiectelor 1C de tipuri de agregate din corpul unui obiect COM sau al unei componente externe? Toate răspunsurile de aici.

Laid înapoi în versiunea a 7-a 1C: Enterprise utilizarea COM-obiecte și componente externe realizate în limbaje de programare care acceptă COM cu, desigur, rezultatele sunt posibile platforma la un nou nivel. Totuși, posibilitățile deja bogate ale lui 1C s-au extins la limite incomensurabile. După ce ne-am familiarizat cu această ocazie, am avut chiar impresia că practic totul ar putea fi făcut în 1C.






Rezultatul sistemului 1C: Enterprise versiunea 8.x a redus ușor importanța componentelor externe, deoarece funcțiile de bază au fost deja implementate la nivel de platformă, de exemplu, lucrează cu XML, HTTP, ZIP, e-mail etc. Însă însăși 1S a încetat să fie pur și simplu un program contabil și, prin urmare, dezvoltatorii ulteriori vor extinde, prin intermediul componentelor externe, posibilitățile sale deja uriașe. De asemenea, destul de des există scheme de conectare la 1C folosind tehnologia COM din programele dezvoltate în C / C ++, Delphi etc. adică în limbile care sprijină lucrul cu COM.

În ambele cazuri, 1C acționează ca un server OLE, ceea ce înseamnă că clientul OLE trebuie adesea să obțină informații de la server despre proprietățile și metodele oferite clientului. O parte din problemă poate fi rezolvată prin utilizarea metadatelor, dar cum obțineți o listă, de exemplu, a metodelor de export ale unui modul comun? Sau ați scris un obiect COM care, la apelarea metodelor sale, preia parametrii tipului agregat de la 1C și trebuie să determinați în corpul obiectului ceea ce a fost transferat dvs. când ați apelat metoda. Lista de proprietăți și metode acceptate ar fi, de asemenea, foarte utilă.

Pentru început, un mic program educațional. Cu obiecte COM, 1C funcționează prin interfața IDispatch. Această interfață, la rândul său, este susținută de toate obiectele de tip 1C agregat: Enterprise și permite, printre altele, pentru a primi informații detaliate cu privire la metodele obiectului (proprietăți, metode, parametrii metodei și tipurile lor, a reveni tipuri, etc.). Aici este semnătura metodelor sale (aici și mai jos, folosind Delphi ca exemplu):







Pentru a testa existența unei singure metode sau a unei proprietăți pentru un obiect COM, trebuie să utilizați metoda GetIDsOfNames. și fă-o așa:

Pentru obiect COM ( „serverul“) ar putea „spune“ partea care apelează ( „Clientul“) cu privire la metodele sale, este necesar ca, atunci când apelați GetTypeInfo returnează un pointer la interfața ITypeInfo este implementată. prin care clientul primește aceste informații. Rețineți că acest lucru nu este obligatoriu. În acest caz, de fiecare dată când metoda server este numit de numele clientului solicită prima metoda GetIDsOfNames. care, în cazul metodei solicitate, returnează DispID. După aceasta, metoda Invoke este apelată cu DispID recepționat. În cazul sprijinului pentru informații ITypeInfo despre metodele și proprietățile disponibile solicitate o dată atunci când obiectul este inițializat, iar apoi metodele sunt numite deja de la DispID.

Pentru informații despre proprietăți și metode, utilizați ITypeInfo. trebuie să faci ceva de genul:

Analiza obiectelor sistemului 1C: versiunea Enterprise 8.x arată că nu toate obiectele sunt suportate prin obținerea interfeței ITypeInfo. În special, acesta poate fi obținut pentru obiecte de tip „SpravochnikObekt“, „DokumentObekt“, „ObrabotkaObekt“ (dar nu „VneshnyayaObrabotkaObekt“), „RegistrHHHHHHHHHNaborZapisey“ și altele.

Există o cale de ieșire în această situație, și constă în faptul că pentru obiectele sale 1C implementat IDispatchEx suport interfață. care de asemenea vă permite să obțineți informații despre proprietăți și metode. Iată descrierea lui:

Informațiile furnizate de această interfață despre metodele obiectului nu sunt la fel de detaliate ca atunci când se utilizează ITypeInfo. dar pentru scopul nostru este suficient. Mai mult decât atât: implementarea ITypeInfo în obiectele sistemului 1C: Enterprise nu vă permite să distingeți procedura de funcția respectivă, iar atunci când utilizați IDispatchEx acest lucru este posibil. Și principalul lucru: IDispatchEx este implementat pentru toate obiectele agregate (cu excepția, din păcate, rădăcină).

Deci, pentru a obține o listă de proprietăți și metode folosind interfața IDispatchEx. trebuie să faci ceva de genul:

În practică, această abordare poate fi utilă, de exemplu, dacă ați scris orice COM-obiect care primește ca parametri odinesovskie obiectele de tip agregat. In practica mea a fost o metodă care are ca parametru sau un obiect de tip „Imagine“, sau „DvoichnyeDannye“ și cel mai bun mod de a distinge între corpul COM-un obiect de altul, nu am găsit.

Pentru a demonstra metoda, se oferă un utilitar mic pentru descărcare, care implementează ambele metode de obținere a informațiilor despre proprietăți și metodele obiectelor (fișier executabil + cod sursă (Delphi XE)).







Articole similare

Trimiteți-le prietenilor: