Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Vargu i lidhjes me 1s 8.3. Tre balena të punës me objekte COM

Përshëndetje Khabravchans!

Në këtë artikull, unë dua të flas se si është vendosur integrimi me platformën 1C në organizatën time. Më shtyu ta bëj këtë nga mungesa pothuajse e plotë e informacionit teknik mbi këtë temë. Duke lexuar artikuj dhe raporte të ndryshme mbi temën e lidhjes së 1C me çdo sistem informacioni, bindeni vazhdimisht se ato janë të gjitha marketingu, demonstrimi në natyrë dhe kurrë teknike, duke pasqyruar problemin dhe thelbin e zgjidhjes së tij.

Ju paralajmëroj se metoda në asnjë mënyrë nuk pretendon të jetë universale. Meqenëse ka vetë shumë konfigurime 1C, dhe akoma më shumë sisteme informacioni, gjuhë dhe platforma, numri i kombinimeve të mundshme është i madh. Qëllimi im është të tregoj një zgjidhje të mundshme.


Si një gjuhë që do të integrohet me 1C, zgjodha Python. Është shumë i përshtatshëm për automatizimin e procesit. Kjo lehtësohet nga sintaksa minimaliste (kodi shtypet shumë shpejt), biblioteka e pasur standarde (më pak nevojë për module të palëve të treta), ndër-platformë - me një probabilitet të lartë, kodi i shkruar në Linix OS do të funksionojë me sukses në Dritaret.

Për të filluar, unë do të përshkruaj të dhënat me të cilat do të punojmë. Organizata - një kompani e furnizimit me energji elektrike në rajonin e Lindjes së Largët - shërben përafërsisht 400 mijë abonentë, baza është 1C në një konfigurim të shkruar vetë. Për çdo pajtimtar ruhen pagesat e tij, llogaritjet, shërbimet e konsumuara dhe skemat e llogaritjes, pajisjet matëse, leximet dhe shumë të dhëna të tjera.

Pasi në organizatë kishte një program të shkruar në Delphi dhe duke përdorur MSSQL / Firebird si bazë të dhënash. Në ato kohë të lavdishme, ishte e mundur të lidheshim me bazën e të dhënave duke përdorur çdo gjuhë dhe të kryeje shumë veprime - të zgjidhni pajtimtarët e debitorit, të postoni pagesat e marra, të regjistroni leximet e instrumenteve. Nuk është për t'u habitur që koleksioni i skripteve që automatizojnë rutinën ka qenë vazhdimisht në rritje. Programuesit mund të kryejnë çdo veprim pa hapur vetë programin.

Mjerisht, me kalimin në 1C, falas mbaroi - nuk ishte më e mundur të lidheshim drejtpërdrejt me bazën e të dhënave. Në përgjithësi, vetë platforma 1C është e pandashme dhe është e integruar dobët me sistemet e tjera. Është, siç thonë ata, një gjë më vete. Kur ngarkoni të dhëna në 1C, duhet të mbani mend se nuk do të jetë aq e lehtë t'i nxirrni ato prej andej. Por duke pasur parasysh faktin se organizata kishte nevojë të zbatonte sistemet e pagesave dhe një llogari personale, ishte e nevojshme të gjendej një lloj zgjidhjeje.

Detyrat kryesore me të cilat u përballa ishin aftësia për të marrë shpejt të dhëna për një llogari personale specifike - emrin e plotë, adresën, pajisjet matëse, leximet e njehsorëve, pagesat, tarifat. Plus, formimi i dokumenteve - një akt pajtimi, faturë pagese. Pra, nuk ka asnjë mundësi për një lidhje të drejtpërdrejtë me bazën e të dhënave - të gjithë ata që shikuan bazën e të dhënave 1C në serverin SQL panë që ishte e vështirë ta kuptonin atë në masën e tabelave si aaa1, aaa2. Dhe të ndërtosh pyetje me emra të tillë tabelash dhe fushash është thjesht joreale. Përveç kësaj, shumë tabela 1C (veçanërisht ato më të rëndësishmet, si prerja e fundit, balancat dhe rrotullimet) janë virtuale dhe janë të shpërndara nëpër tabela të ndryshme fizike, duke u mbledhur në bashkime të shumta. Kjo metodë nuk është e përshtatshme.

Platforma 1C ofron mundësinë për t'u lidhur me të përmes një lidhjeje COM. Ashtu si shumë programe të Windows, gjatë instalimit të 1C, dy objekte COM regjistrohen në sistem - Serveri i Automatizimit dhe Lidhësi COM. Ju mund të punoni me të dy objektet duke përdorur një gjuhë që mbështet teknologjinë COM.

Objekti i Serverit të Automatizimit është një aplikacion 1C që pothuajse nuk ndryshon nga një aplikacion i rregullt i klientit. Dallimi është se përveç kësaj ekziston mundësia e kontrollit programatik të instancës së aplikacionit. Kur punoni me objektin COM Connector, lëshohet një version i lehtë i aplikacionit 1C, në të cilin formularët nuk janë të disponueshëm, si dhe funksionet dhe metodat që lidhen me ndërfaqen dhe efektet vizuale. Vetë aplikacioni fillon në modalitetin "Lidhja e jashtme". Inicializimi i variablave globale (për shembull, përcaktimi i përdoruesit aktual dhe cilësimet e tij) duhet të kryhet në modulin e lidhjes së jashtme 1C. Nëse në modalitetin e lidhjes së jashtme thirret një funksion në kod që nuk është i disponueshëm në këtë modalitet, do të hidhet një përjashtim (i cili do t'i kalohet skriptit tonë python). Thirrjet drejt funksioneve të pasigurta duhet të përshtaten me konstruksionet e formularit

#Nëse JO Lidhja e Jashtme Atëherë Paralajmërim ("Përshëndetje!"); #FundNëse

Meqenëse puna me objektet COM është një teknologji vetëm për Windows, nuk është për t'u habitur që nuk përfshihet në shpërndarjen standarde të Python. Do t'ju duhet të instaloni një shtesë - një grup modulesh që ofrojnë të gjithë funksionalitetin e nevojshëm për programim nën Windows në Python. Mund të shkarkohet si një instalues ​​exe tashmë i montuar. Vetë zgjerimi siguron akses në regjistër, shërbimet, objektet ODBC, COM, etj. Përndryshe, mund të instaloni menjëherë shpërndarjen ActiveState Python, në të cilën shtrirja Win32 del nga kutia.

Për ca kohë kam eksperimentuar me lidhjen COM në zhvillimin e aplikacioneve në internet, në veçanti, një llogari personale. Disavantazhet e mëposhtme janë identifikuar:

Lidhja COM është e ngadaltë. Performanca e ulët është një minus i njohur i teknologjisë COM.
- Procesi i vendosjes së një lidhjeje me 1C, në varësi të konfigurimit, mund të zgjasë nga 1 deri në 8 sekonda (në rastin tim - 6 sekonda). Eshtë e panevojshme të thuhet, krijimi i një lidhjeje për secilën kërkesë do të bëjë që çdo faqe të ngarkohet në 8 sekonda.
- Meqenëse aplikacionet në ueb python funksionojnë si serverë të pavarur, pika e mëparshme mund të kompensohet duke ruajtur lidhjen në disa ndryshore globale dhe duke e rivendosur atë në rast gabimi. Si të mbaj një lidhje në PHP, unë, sinqerisht, nuk kam menduar ende.
- Ueb aplikacion i humbur ndër-platformë.

Bazuar në pikat e listuara më sipër, u vendos që të ndryshohet parimi i ndërveprimit, duke e ndarë atë në 2 pjesë - e para e varur nga platforma (Windows), shkarkimi i të dhënave 1C në çdo format të përshtatshëm dhe i dyti, i pavarur nga platforma, i aftë për të duke punuar me të dhëna pa dyshuar asgjë për 1C në parim.

Strategjia e veprimit është si më poshtë: skripti python lidhet me 1C, ekzekuton pyetjet e nevojshme dhe ngarkon të dhënat në bazën e të dhënave SQLite. Ju mund të lidheni me këtë bazë të dhënash nga Python, PHP, Java. Shumica e projekteve tona janë në python, dhe meqenëse e urrej të shkruaj pyetje të papërpunuara SQL me dorë, e gjithë puna me bazën e të dhënave SQLite bëhet përmes ORM SQLAlchemy. Ishte e nevojshme vetëm të përshkruhej struktura e të dhënave të bazës së të dhënave në një stil deklarativ:

Nga sqlalchemy.ext.importi deklarativ declarative_base nga sqlalchemy import Kolona, ​​Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tabelename__" = "Integer = "Një numër i madh" E vërtetë) llogari = Kolona(Unicode(32), indeksi=E vërtetë) kodi = Kolona(Unicode(32)) adresa = Kolona(Unicode(512)) fio = Kolona(Unicode(256)) burimi = Kolona(Unicode(16) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) house = Column(Integer) Flat = Column(Integer) mro = Kolona(Unicode(256)) klasa Pagesa(Baza): __emri i tabelës__ = "pagesat" # dhe kështu me radhë...

Tani mjafton ta importoni këtë modul në çdo projekt python dhe mund të punoni me të dhënat.

Unë parashikoj pyetjen tuaj - "pse SQLite"? Arsyeja kryesore është se baza e të dhënave është e nevojshme vetëm për lexim, kështu që nuk duhet të shqetësohemi për problemet me shkrimin në SQLite. Së dyti, formati i këtij DBMS është i përshtatshëm - është më i përshtatshëm për ta parë atë (ka shumë shërbime falas, duke përfshirë një super-zgjatje për FireFox). Së treti, në disa raste kërkohej të merrnin akses te pajtimtarët nga ato makina në të cilat nuk ka lidhje me serverin MySQL. Në këtë rast, mjafton të kopjoni skedarin e bazës së të dhënave SQLite dhe në këtë makinë do të keni akses në të gjitha informacionet.

Shkarkimi ndodh një herë në ditë gjatë natës. Futja e të dhënave në 1C mund të automatizohet në të njëjtën mënyrë. Për shembull, kërkohet të regjistrohen leximet e lëna nga pajtimtarët në faqen e internetit të llogarisë personale. Në këtë rast, ne përsëri lidhemi me 1C dhe krijojmë dhe zbatojmë në mënyrë programore dokumentin "Akti i Marrjes së Dëshmive". Unë do të jap kodin më poshtë.

Puna me objekte COM në Python është paksa e pazakontë. Së pari, "pitoniteti" i kodit humbet - rregullat për emërtimin e variablave dhe funksioneve në 1C, për ta thënë butë, nuk korrespondojnë me Zen e Python. Së dyti, të gjithë e dinë që objektet 1C shpesh quhen karaktere cirilike, të cilat do të shkaktojnë probleme kur zhvillohen në Python ... por ato janë të zgjidhshme. Unë ju sugjeroj të hidhni një sy kodit:

Importo pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=emri i përdoruesit;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)

Siç mund ta shihni nga kodi, klienti është inicializuar për të punuar me 1C. Objekti COM përcaktohet me emrin "V82.COMConnector". Ju lutemi vini re se ky emër është i vlefshëm për platformën V8.2, nëse keni versionin 8.1, atëherë emri do të jetë "V81.COMConnector".

Në klientin e inicializuar, ne e quajmë metodën Connect(), duke ia kaluar vargun e lidhjes. Vargu përbëhet nga emri i serverit, baza e të dhënave, përdoruesi dhe fjalëkalimi. Objekti V82 që rezulton ruan lidhjen me aplikacionin 1C. Nuk ka një metodë Disconnect() apo diçka të tillë. Për t'u shkëputur nga baza, mjafton të hiqni objektin nga memoria me funksionin del () ose të caktoni variablin në None.

Duke pasur një objekt, ju mund të përdorni çdo fushë dhe metodë të kontekstit global 1C, të operoni me objekte universale si TabularDocument, TableValues, etj. Është e rëndësishme të theksohet se kur punoni përmes një lidhjeje COM, 1C punon në modalitetin "Lidhja e jashtme". Ai nuk përfshin asnjë veçori për punë ndërvepruese, të tilla si dialogët pop-up, njoftimet dhe, më e rëndësishmja, formularët. Jam i sigurt që do të shani zhvilluesit e konfigurimit më shumë se një herë për mbështjelljen e funksionalitetit më të rëndësishëm në procedurën Button1Press() në modulin e formës së dokumentit.

Le të flasim për një gjë kaq të rëndësishme si atributet cirilike. Përkundër faktit se 1C është një mjedis dygjuhësh dhe ekziston një ekuivalent në anglisht për secilën metodë ruse, herët a vonë do t'ju duhet t'i drejtoheni atributit cirilik. Nëse në PHP ose VBSCript kjo nuk do të shkaktojë ndonjë problem,

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Lidhja e vargut") Set AccountsManager = v8.Documents.Accounts.... Vendos AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... AccountsWrite.Write()

Atëherë kodi i python thjesht do të rrëzohet me një gabim sintaksor. Çfarë duhet bërë? Të ndryshohet konfigurimi? Jo, thjesht përdorni metodat getattr dhe setattr. Duke kaluar një objekt COM dhe një emër atribut cirilik në këto funksione, mund të merrni dhe vendosni vlerat në përputhje me rrethanat:

#coding=cp1251 katalog = getattr(V82.Katalogët, "Llogaritë Personale")

Sa më poshtë është e rëndësishme: emrat e atributeve, si dhe parametrat e funksioneve dhe metodave, duhet të kalojnë në kodimin cp1251. Prandaj, për të shmangur konfuzionin e kodimit paraprakisht, ka kuptim ta deklaroni atë në fillim të skedarit: #coding=cp1251. Pas kësaj, ju mund të kaloni vargjet pa u shqetësuar për kodimin e tyre. Por! Të gjitha vargjet e marra nga 1C (rezultatet e thirrjeve të funksionit, kërkesat) do të kodohen në UTF-8.

Një shembull i një kodi që ekzekuton një pyetje në mjedisin 1C, përsëritet mbi rezultatin dhe ruan bazën e të dhënave në SQLite:

#coding=cp1251 q = """ SELECT PersonalAccounts.Code AS code, PersonalAccounts.Building.Location.Name + ", " + PersonalAccounts.ShortAddress AS Adresa, PersonalAccounts.Subscriber.Emri AS fio, PersonalAccounts,PersonalName.Same. EXPRESS(KarakteristikatLlogaritëPersonaleFetëFundi.Vlera AS Drejtoria.Rrjeti TerritorialOrganizatat).Emri AS tso,Llogaritë Personale.Ndërtesa.Vendosja.Emri AS np,Llogaritë Personale.Ndërtesa.RrugaASNJËNJË LlogaritëNjëNjerëzore. Dression. Retor. Emri si mro nga një libër referimi. Llogaria gjyqësore si llogaria e fytyrës së lidhjes së majtë të regjistrit. Karakteristikat e Shkollës së Ekonomisë. Squints (, vidicapiterism = vlera (libër referencë. Vidkarakterike -orthoganizimi i grirë)) si karakteristikat e ekspozimit. = V82.NewObject( "Query", q) seleksionimi = pyetës.Execute().Zgjidh() CONN = db.lidh() CONN.query(modelet.Abonent).delete() ndërsa përzgjedhja.Next(): abonent = modele.Abonent() abonent.account = selection.code.strip() abonent.code = zgjedhje.kodi abonent.fio = përzgjedhje.fio abonent.adresa = përzgjedhje.adresa abonent.psu = përzgjedhje.psu abonent.tso = përzgjedhje.tso abonent.burimi = u"ASRN" abonent.np = përzgjedhje.np abonent.rrugë = përzgjedhje.rrugë abonent.shtëpi = përzgjedhje.shtëpi abonent.flat = përzgjedhje.banesë abonent.mro = përzgjedhje.mro CONN.add(abonent) CONN.commit()

Këtu CONN është sesioni i lidhjes me bazën e të dhënave SQLite. Krijohet një objekt pyetës, plotësohet teksti i tij. Siç u përmend më lart, teksti i kërkesës duhet të jetë në cp1251, për të cilin kodimi është deklaruar fillimisht. Pas ekzekutimit të pyetjes, të gjithë abonentët fshihen në bazën e të dhënave në mënyrë që të mos shtohen dublikatë, pastaj ato shtohen në një cikël dhe vijon kryerja përfundimtare.

Kur punoja me kërkesat, zbulova rregullat e mëposhtme.

Kur zgjidhni fushat, jepini emra latinë, do të jetë shumë më e përshtatshme t'i aksesoni ato përmes një përzgjedhësi (pika), në vend të getattr().
- Zgjidhni vetëm llojet primitive të të dhënave: vargjet, numrat, datat dhe booleans. Asnjëherë mos zgjidhni lidhje me një objekt (dokument, direktori)! Në këtë kontekst, ju absolutisht nuk keni nevojë për referenca dhe madje janë të dëmshme, sepse çdo akses në atributin ose metodën e referencës do të rezultojë në një kërkesë përmes një lidhjeje COM. Nëse i aksesoni atributet e lidhjes në një lak, do të jetë jashtëzakonisht i ngadaltë.
- Nëse zgjidhni një fushë Data, ajo do të kthehet si një objekt PyTime. Ky është një lloj i veçantë i të dhënave për kalimin e datës/kohës në një lidhje COM. Nuk është aq i përshtatshëm për të punuar me të sa me orarin e zakonshëm të datës. Nëse ia kaloni këtë objekt int(), atëherë do të kthehet një vulë kohore, nga e cila më pas mund të merrni datën duke përdorur metodën fromtimestamp().

Tani le të shohim se si formohen dokumentet e shtypura. Fakti është se konsumatorit duhet t'i jepet mundësia të shkarkojë dokumente të përgatitura paraprakisht, për shembull, një faturë pagese ose një akt rakordimi. Këto dokumente gjenerohen në 1C në përputhje me kërkesat e vendosura, zbatimi i tyre në Python do të marrë shumë kohë. Prandaj, është më mirë të gjeneroni dokumente në 1C dhe t'i ruani ato në formatin Excel.

Pra, dokumenti i aktit të barazimit gjenerohet me përpunim të jashtëm të veçantë. Për ata që nuk janë të njohur me terminologjinë 1C: përpunimi është një program autonom që ka modulin, formularët, shabllonet e tij, të krijuar për të ekzekutuar në mjedisin 1C. Shtë e nevojshme të inicializoni përpunimin, të plotësoni detajet e tij dhe të thërrisni një funksion që do të na kthejë një dokument spreadsheet të destinuar për shikim në 1C. Ky dokument duhet të ruhet në formatin Excel dhe të kopjohet në server ose të shkruhet në bazën e të dhënave.

Lidhje = getattr(V82.Katalogët, "Raportet e Sistemit").FindByDescription("Akti i verifikimit të Elenit") nav_url = V82.GetURL(lidhja, "Raporti") emri = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExReporti i Jashtëm. (emri) setattr(Raporti i jashtëm, "Llogaria personale", referencë) table_doc = ExternalReport.GetDoc() shteg = V82.GetTempFileName("xls") table_doc.Write(rruga, V82 .SpreadsheetDocumentDocumentType raport.XLS) raport =(raporti i llojit të skedarit.XLS). .account = reference.Code.strip() report.type = u"vepro" report.document = open(rruga, "rb").read() CONN.add(raport)

Pjesa e mësipërme bën sa vijon. Përpunimi që formon dokumentin është i lidhur. Përpunimi mund të ndërtohet në konfigurim, të ruhet në disk ose në një bazë të dhënash 1C (në një lloj drejtorie). Meqenëse përpunimi ndryshon shpesh, për të mos përditësuar konfigurimin çdo herë, përpunimi që ndryshon më shpesh ruhet në direktoriumin "ReportsSystem", në atributin e tipit "magazinimi i vlerës" me emrin Raport. Përpunimi mund të inicializohet duke e shkarkuar atë nga baza e të dhënave në disk dhe duke e ngarkuar atë, ose me metodën GetURL(), në të cilën ju duhet të kaloni një lidhje me elementin e drejtorisë dhe emrin e atributit. Ne caktojmë vlerat e atributeve në objektin e përpunimit që rezulton, thërrasim funksionin e eksportuar GetDoc() dhe marrim një dokument spreadsheet që ruhet në një skedar të përkohshëm Excel. Përmbajtja e këtij skedari është shkruar në bazën e të dhënave SQlite.

Gjëja e fundit që mbetet për t'u marrë parasysh është futja programatike e të dhënave në 1C. Le të supozojmë se kërkohet të futen indikacione nga pajtimtarët. Për ta bërë këtë, mjafton të krijoni dhe zhvilloni dokumentin "Akti i marrjes së provave":

#coding=cp1251 acts = getattr(V82.Dokumentet, "Akti i Marrjes së Dëshmive") act = acts.CreateDocument() setattr(act, "Indication", 1024.23) setattr(act, "Pajtimtar", "Ivanov") # Mbushje në detaje të tjera. ..veproni.Shkruani()
Tani futja e të dhënave është e automatizuar.

Pra, unë kam përshkruar një metodë që bazohet në ngarkimin dhe shkarkimin programatik të të dhënave duke përdorur një lidhje COM. Kjo metodë funksionon me sukses në organizatën time për gati një vit. Baza, e formuar nga 1C, shërben 3 sisteme pagese, blerje interneti (pagesë me karta përmes Internetit), si dhe një llogari personale. Përveç kësaj, skriptet e ndryshme lidhen me bazën e të dhënave për të automatizuar rutinën.

Megjithë mangësitë e metodës (shpejtësia e ngadaltë e lidhjes COM), në përgjithësi, ajo funksionon në mënyrë të qëndrueshme. Ne kemi të dhëna në një formë të pavarur nga platforma (SQLite) me të cilat mund të punohet nga çdo gjuhë. Dhe pjesa kryesore e kodit është shkruar në Python, që do të thotë se shumë mjete dhe teknika janë të disponueshme që as nuk mund t'i ëndërroni në 1C.

Kjo është një nga mënyrat e mundshme për të bashkëvepruar me 1C. Jam i sigurt se nuk është i ri dhe ndoshta tashmë është testuar dhe optimizuar nga dikush. Megjithatë, u përpoqa të parashtroj sa më shumë detaje të procesit, në mënyrë që t'ju shpëtoj nga grackat që kam shkelur vetë.

Ju uroj të gjithëve fat dhe mbani mend se 1C nuk është aq e frikshme sa është pikturuar!

Një nga opsionet për shkëmbimin e të dhënave midis bazave të të dhënave 1C është një shkëmbim përmes një lidhjeje COM.

Duke përdorur një lidhje COM, mund të lidheni nga një bazë të dhënash 1C në tjetrën dhe të lexoni ose shkruani të dhëna. Ju mund ta përdorni këtë metodë si në versionet klient-server të bazave të të dhënave dhe në bazat e të dhënave të skedarëve. Në këtë artikull, ne do të analizojmë shembuj të komponimeve të tilla. Shembujt përdorin platformën 8.2.

Ju mund të krijoni dy lloje të objekteve COM për aplikacionin 1C. Kjo V82.Aplikimi Dhe V82. COMConnector. Në rast se V82.Aplikimi lëshohet një kopje pothuajse e plotë e aplikacionit 1C. në rast përdorimi V82. COMConnector fillon një pjesë e vogël e serverit.
Shpejtësia e punës në këtë rast është më e lartë, por disa funksione mund të mos jenë të disponueshme. Në veçanti, puna me formularë dhe me module të zakonshme për të cilat nuk është vendosur vetia e punës me lidhje të jashtme. Ju duhet të përdorni kryesisht V82. COMConnector dhe vetëm në rast të mungesës së funksionalitetit V82.Aplikimi. Dallimi në shpejtësi mund të jetë veçanërisht i dukshëm në bazat e të dhënave të mëdha.

Pra, le të fillojmë

  1. Le të krijojmë një objekt COM
    • Për V82.Aplikimi Lidhja = New COMObject("V82.Application");
    • Për V82. COMConnector Lidhja = New COMObject("V82.COMConnector");
  2. Le të krijojmë një varg lidhjeje
    • për versionin e serverit të bazës së të dhënave ConnectionString = "Srvr = " "Emri i Serverit" ";Ref = " "Emri bazë" ;
    • për versionin e skedarit të bazës së të dhënave ConnectionString = "File = " "PathKBase" "; Usr = Emri i përdoruesit; Pwd = Fjalëkalimi";
  3. Krijimi i një lidhjeje me bazën e të dhënave Përpjekje Lidhje = Lidhje. Connect (ConnectionString) ; Exception Message = New MessageToUser; Mesazh. Teksti = + Përshkrimi Gabimet() ; Mesazh. Për të raportuar() ; Fund Provoni ;
  4. Shkëputja nga baza Lidhja = E pacaktuar ;

    Për objekt V82.Aplikimiështë e detyrueshme shkëputja e lidhjes, përndryshe një seancë jo e plotë do të mbetet e varur, e cila më pas do të duhet të fshihet manualisht. Në rast se V82. COMConnector lidhja ndërpritet automatikisht në përfundim të procedurës në të cilën është bërë lidhja dhe ka edhe një moment të vogël.

    Për përdoruesin nën të cilin po bëhet lidhja, kutia e kontrollit "Kërkoni konfirmim kur mbyllni programin" në cilësimet e tij duhet të çaktivizohet.

Dhe tani le të bashkojmë të gjithë kodin

Lidhja = New COMObject("V82.Application"); //Connection = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = ""Server1C"";Ref = ""MyBase""; Usr = Peter; Pwd = 123" ; //ConnectionString = "File = ""С:\MyBase""; Usr = Peter; Pwd = 123"; Përpjekje Lidhje = Lidhje. Connect (ConnectionString) ; Exception Message = New MessageToUser; Mesazh. Teksti = "Nuk mund të lidhet me bazën e të dhënave"+ Përshkrimi Gabim() ; Mesazh. Për të raportuar() ; Fund Provoni ; Lidhja = E pacaktuar ;

Për llojin e lidhjes V82.Aplikimi metoda aplikohet në objektin COM që u krijua fillimisht dhe për V82. COMConnector metoda zbatohet në lidhje. puna e mëtejshme me kërkesën kryhet duke përdorur mjete standarde 1C. në kod duket kështu:

Kërkesë = Lidhje. NewObject("Kërkesë"); // Për V82. COMConnector Kërkesë = Lidhje. NewObject("Kërkesë"); // Për V82.Aplikimi Kërkesë. Teksti = "ZGJIDH | Pozicionet e Organizatave Kodi, | Pozicionet e Organizatave Emri| NGA | Drejtoria. Pozicionet e Organizatave AS Pozicionet e Organizatave "; Rezultati = Kërkesë. Ekzekutoni (); Mostra = Rezultati. Zgjidhni(); Ndërsa përzgjedhja. Tjetër() Cikli i Fundit ;

Për versionin 1C: Enterprise 8.3, gjithçka mbetet e pandryshuar, përveç se kur krijoni COMObjects, duhet të përdorni "V83.COMConnector" ose V83.Aplikimi.

Print (Ctrl+P)

Një nga opsionet për shkëmbimin e të dhënave midis bazave të të dhënave 1C është një shkëmbim përmes një lidhjeje COM. Duke përdorur një lidhje COM, mund të lidheni nga një bazë të dhënash 1C në tjetrën dhe të lexoni ose shkruani të dhëna. Ju mund ta përdorni këtë metodë si në versionet klient-server të bazave të të dhënave dhe në bazat e të dhënave të skedarëve. Ky artikull diskuton këtë lloj lidhjesh në platformën 8.3

lidhje com

Ju mund të krijoni dy lloje të objekteve COM për aplikacionin 1C. Janë lidhje ole V83.Aplikimi dhe lidhjet com V83. COMConnector . Në rast se V83.Aplikimi lëshohet një kopje pothuajse e plotë e aplikacionit 1C. Në rast përdorimi V83. COMConnector fillon një pjesë e vogël e serverit. Shpejtësia e punës në këtë rast është më e lartë, por disa funksione mund të mos jenë të disponueshme. Në veçanti, puna me formularë dhe me module të zakonshme për të cilat nuk është vendosur vetia e punës me lidhje të jashtme. Ju duhet të përdorni kryesisht V83. COMConnector dhe vetëm në rast të mungesës së funksionalitetit V83.Aplikimi. Dallimi në shpejtësi mund të jetë veçanërisht i dukshëm në bazat e të dhënave të mëdha. Për platformën 8.2 përdoret V82.Application ose V82.COMConnector

Krijoni një lidhje OLE

Lidhja = New COMObject (“V83.Application”);

Vendosni lidhjen COM

Lidhja = New COMObject (“V83.COMConnector”);

Vargu i lidhjes

//Për opsionin klient-server
StringConnection= “Srvr = “ “Emri i Serverit” “;Ref = “ “Emri bazë” ;
//Për opsionin e modalitetit të skedarit:
StringConnection= "Skedari = ""Baza e rrugës" “; Usr = Emri i përdoruesit; Pwd = Fjalëkalimi”;
Përpjekje
Lidhje = Lidhje . Lidheni(ConnectionString) ;
Përjashtim
Message = New MessageToUser;
Mesazh . Teksti = "Lidhja me bazën e të dhënave dështoi" + Përshkrimi Gabim(); Mesazh . Për të raportuar();
Fund Provoni ;

Prishja e lidhjes

Lidhja = E pacaktuar ;
Për objekt V83.Aplikimiështë e detyrueshme shkëputja e lidhjes, përndryshe një seancë jo e plotë do të mbetet e varur, e cila më pas do të duhet të fshihet manualisht. Në rast se V83. COMConnector lidhja ndërpritet automatikisht në përfundim të procedurës në të cilën është bërë lidhja dhe ka edhe një moment të vogël. Për përdoruesin nën të cilin po bëhet lidhja, kutia e kontrollit "Kërkoni konfirmim kur mbyllni programin" në cilësimet e tij duhet të çaktivizohet.

Metoda NewObject().

Për të krijuar një objekt të ri, mund të përdorni metodën NewObject(), për shembull:

Për V83. COMConnector

RequestCOM = Lidhja. Objekti i ri( "Kërkesë ") ;
TableCOM = Lidhja. Objekti i ri( "Tabela e vlerave") ;
ArrayCOM = Lidhja. NewObject("Array");

WidCOM = Connection.NewObject

Për V83.Aplikimi

QueryOLE = Lidhja. Objekti i ri (" Kërkesë ") ;
TableOLE = Lidhja. Objekt i Ri("Tabela e vlerave") ;
ArrayOLE = Lidhja.NewObject(“Array”);
WidCOM = Connection.NewObject(“UniqueIdentifier”,StringUID);

RequestCOM . Teksti ="ZGJIDH
| Pozicionet e Organizatave Kodi,
| Pozicionet e Organizatave Emri
| NGA | Drejtoria.PozicionetOrganizatat
AS Pozicionet e Organizatave”;

Rezultati = RequestCOM. Ekzekutoni ();
Mostra = rezultat. Zgjidhni ();
Ndërsa përzgjedhja. Tjetra ()Cikli
Cikli i Fundit ;
Ju gjithashtu mund të përdorni menaxherët e objekteve të konfigurimit:
DirectoryCOM = Lidhja. Libra referencë. Emri i drejtorisë;
DocumentCOM = Lidhja. Dokumentacioni. Emri i Dokumentit;
RegisterCOM = Lidhja. RegjistratInformacion. Emri i Regjistrit;

Marrja dhe krahasimi i një numri mbi një lidhje COM

Për të krahasuar vlerat e elementeve të numërimit të përcaktuar në konfigurim, është e nevojshme të konvertohen këto elemente në një nga llojet primitive, krahasimi i të cilave nuk shkakton vështirësi. Këto lloje mund të jenë ose një lloj numerik ose një lloj vargu. Ju mund të konvertoni vlerën e një elementi numërues në një lloj numerik si ky

Elementi Enum = Connection.Directories.Directory1.FindByCode(1).Atributi1;

PossibleValues ​​= EnumElement.Metadata().EnumValues;

EnumElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumElement)));

Nëse EnumItemNumber = 0 Pastaj Raportoni( "EnumValue1");

ElseIf EnumItemNumber = 1 Pastaj Raporti ("Vlera e Përgjithshme2");

FundNëse;

Marrja e një objekti përmes COM me ID

Nëpërmjet menaxherëve të objekteve të konfigurimit ne marrim një objekt com, për shembull:
DocumentCOM = Lidhja. Dokumentacioni. Emri i Dokumentit;

Pastaj marrim vargun unik të identifikuesit:

StringUID = Connection.string ( DocumentCOM.UniqueIdentifier())

ID = Y i ri ID unike (StringUID);
ME linkByIdentifier = Dokumentet[Emri i Dokumentit].GetLink(Identifikuesi);

Nëse duhet të gjeni objektin com sipas dokumentit me ID, atëherë duhet të shkruani kështu:

WidCOM = Lidhja.NewObject(“UniqueIdentifier”,StringUID );
LinkByIdentifier = Lidhja.Dokumentet[Emri i Dokumentit].GetLink(UidCOM);

Artikujt kryesorë të lidhur