Å jobbe over en COM-tilkobling er enklere enn du tror. Tre pilarer for arbeid med COM-objekter

Skriv ut (Ctrl+P)

Et av alternativene for å utveksle data mellom 1C-databaser er utveksling via en COM-forbindelse. Ved å bruke en COM-tilkobling kan du koble fra en 1C-database til en annen og lese eller skrive data. Denne metoden kan brukes både i klient-serverversjoner av databaser og i fildatabaser. Denne artikkelen diskuterer disse typene tilkoblinger på plattform 8.3

com-tilkobling

Du kan opprette to typer COM-objekter for 1C-applikasjonen. Dette er oleforbindelser V83.Søknad og com-tilkoblinger V83.COMConnector . I tilfelle V83.Søknad En nesten fullverdig kopi av 1C-applikasjonen lanseres. Ved bruk V83.COMConnector En liten serverdel lanseres. Driftshastigheten i dette tilfellet er høyere, men noen funksjoner er kanskje ikke tilgjengelige. Spesielt arbeid med skjemaer og vanlige moduler der egenskapen til å jobbe med eksterne forbindelser ikke er satt. Stort sett bør du bruke V83.COMConnector og kun ved manglende funksjonalitet V83.Søknad. Forskjellen i driftshastighet kan være spesielt merkbar på store databaser. For plattform 8.2 brukt V82.Application eller V82.COMConnector

Etabler en OLE-forbindelse

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

Etabler en COM-forbindelse

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

Tilkoblingsstreng

//For klient-server-alternativet
Tilkoblingsstreng= “Srvr = ““ServerName” “;Ref = “ “BaseName” ;
//For filmodusalternativ:
Tilkoblingsstreng= "Fil = ""PathKBase" "; Usr = Brukernavn; Pwd = Passord";
Forsøk
Tilkobling = Tilkobling . Koble(ConnectionString) ;
Unntak
Message = New MessageToUser;
Beskjed . Tekst = "Kunne ikke koble til databasen" + Beskrivelsesfeil(); Beskjed;
. Å melde()

EndAttempt ;

Frakobling
Tilkobling = Udefinert; V83.Søknad For objekt V83.COMConnector Det er nødvendig å avslutte tilkoblingen, ellers vil en ufullstendig økt forbli, som deretter må slettes manuelt. I tilfelle

koblingen brytes automatisk når prosedyren som tilkoblingen ble gjort i, er fullført. Og det er et lite punkt til. For brukeren som tilkoblingen opprettes under, må avmerkingsboksen "Be om bekreftelse ved lukking av programmet" være deaktivert i innstillingene.

NewObject()-metoden

For å lage et nytt objekt kan du bruke NewObject()-metoden, for eksempel: V83.COMConnector

Til RequestCOM = Tilkobling. NewObject() ;
"Be om " RequestCOM «Verditabell») ;
ArrayCOM = Tilkobling. NewObject(“Array” ) ;

ViewCOM =Connection.NewObject

Til V83.Søknad

RequestOLE = Tilkobling. NewObject(“ Be om ") ;
TableOLE = Tilkobling. Nytt objekt(«Verditabell») ;
ArrayOLE = Connection.NewObject("Array" );
ViewCOM =Connection.NewObject("UniqueIdentifier", StringUID);

RequestCOM . Tekst ="VELGE
| Posisjoner til organisasjoner,
| Organisasjoners posisjoner.Navn
|FRA | Directory.Positions of Organisations
HVORDAN DU POSISJONER TIL ORGANISASJONER”;

Resultat = RequestCOM. Løpe();
Prøve = Resultat. Velg () ;
Bye Selection. Neste()Syklus
EndCycle ;
Du kan også bruke konfigurasjonsobjektbehandlere:
DirectoryCOM = Tilkobling. Kataloger. Katalognavn;
DocumentCOM = Tilkobling. Dokumentasjon. Dokumentnavn;
RegisterCOM = Tilkobling. Informasjonsregistre. RegisterName ;

Motta og sammenligne oppregning via COM-tilkobling

For å sammenligne verdiene til oppregningselementer definert i konfigurasjonen, er det nødvendig å konvertere disse elementene til en av de primitive typene, som er enkel å sammenligne. Slike typer kan enten være en numerisk type eller en strengtype. Du kan konvertere verdien av et oppregningselement til en numerisk type slik:

Enum Element = Connection.Directories.Directory1.FindByCode(1).Props1;

PossibleValues ​​= Enum Element.Metadata().Enum Values;

EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

Hvis EnumerationItemNumber = 0, så Rapporter( «Tallverdi1»);

ElseIfEnumerationItemNumber = 1 Deretter Rapport("Tallverdi2");

slutt om;

Henter et objekt via COM etter identifikator

Gjennom konfigurasjonsobjektbehandlere får vi et com-objekt, for eksempel:
DocumentCOM = Tilkobling. Dokumentasjon. Dokumentnavn;

Da får vi en unik identifikatorstreng:

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

Identifikator = Ny U uniqueIdentifier(StringUID);
MED linkByIdentifier = Dokumenter[Dokumentnavn].GetLink(Identifier);

Hvis du trenger å finne et com-objekt etter dokument etter identifikator, må du skrive slik:

WidCOM = Connection.NewObject("UniqueIdentifier", StringUID);
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

Et av alternativene for å utveksle data mellom 1C-databaser er utveksling via en COM-forbindelse.

Ved å bruke en COM-tilkobling kan du koble fra en 1C-database til en annen og lese eller skrive data. Denne metoden kan brukes både i klient-serverversjoner av databaser og i fildatabaser. I denne artikkelen skal vi se på eksempler på denne typen forbindelse. Eksemplene bruker plattform 8.2.

Du kan opprette to typer COM-objekter for 1C-applikasjonen. Dette V82.Søknad Og V82.COMConnector. I tilfelle V82.Søknad En nesten fullverdig kopi av 1C-applikasjonen lanseres. ved bruk V82.COMConnector En liten serverdel lanseres.
Driftshastigheten i dette tilfellet er høyere, men noen funksjoner er kanskje ikke tilgjengelige. Spesielt arbeid med skjemaer og vanlige moduler der egenskapen til å jobbe med eksterne forbindelser ikke er satt. Stort sett bør du bruke V82.COMConnector og kun ved manglende funksjonalitet V82.Søknad. Forskjellen i driftshastighet kan være spesielt merkbar på store databaser.

Så la oss komme i gang

  1. La oss lage et COM-objekt
    • For å lage et nytt objekt kan du bruke NewObject()-metoden, for eksempel: V82.Søknad Connection = New COMObject("V82.Application" ) ;
    • For å lage et nytt objekt kan du bruke NewObject()-metoden, for eksempel: V82.COMConnector Connection = New COMObject("V82.COMConnector" );
  2. La oss lage en tilkoblingsstreng
    • for serverversjonen av databasen ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • for filversjonen av databasen ConnectionString = "File = " "PathKBase" "; Usr = Brukernavn; Pwd = Passord";
  3. Kobler til databasen Forsøk på tilkobling = tilkobling. Connect(ConnectionString) ;
  4. Unntaksmelding = New MessageToUser; Beskjed. Tekst = + ErrorDescription() ;

    Beskjed. Å melde() ; EndAttempt ; V82.Søknad For objekt V82.COMConnector Kobler fra databasen

    Tilkobling = Udefinert;

For objekt

koblingen brytes automatisk når prosedyren som tilkoblingen ble gjort i, er fullført. Og det er et lite punkt til. For brukeren som tilkoblingen opprettes under, må avmerkingsboksen "Be om bekreftelse ved lukking av programmet" være deaktivert i innstillingene. La oss nå sette sammen all koden Connection = New COMObject("V82.Application" ) ;//Connection = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ;//ConnectionString = "Fil = ""С:\MyBase""; Usr = Petya; Pwd = 123";

Forsøk på tilkobling = tilkobling. Connect(ConnectionString) ; V82.Søknad Unntaksmelding = New MessageToUser; V82.COMConnector metoden brukes på forbindelsen. Deretter behandles forespørselen ved hjelp av standard 1C-verktøy. i koden ser det slik ut:

Forespørsel = Tilkobling. NewObject("Request" ) ; // For V82.COMConnector Forespørsel = Tilkobling. NewObject("Request" ) ; // For V82.Søknad Be om. Tekst = "VELG | Posisjoner til organisasjoner, | Organisasjoners posisjoner.Navn|FRA | Directory. Positions of Organizations AS Positions of Organizations";

Resultat = Forespørsel. Løpe(); Prøve = Resultat. Velg() ; Bye Selection. Neste() Loop EndLoop ; For versjon 1C:Enterprise 8.3 forblir alt uendret bortsett fra at når du oppretter COM-objekter må du bruke"V83.COMConnector" eller.


"V83.Application"

Nøkkelord: COM, tilkobling, ekstern, OLE, Automation, Connect, ComConnector, Srvr

  1. Når du bruker 1C:Enterprise 8.0 COM-tilkoblinger for å få tilgang til data, er det følgende fordeler sammenlignet med å bruke en automatiseringsserver:

  2. Raskere forbindelsesetablering, siden det ikke er behov for å opprette en separat operativsystemprosess, og alle handlinger utføres i anropsprosessen;
  3. Raskere tilgang til egenskapene og metodene til 1C:Enterprise-objekter, siden organisering av en tilgang ikke krever kommunikasjon mellom prosesser;

Mindre forbruk av operativsystemressurser.

  1. Generelt er det å jobbe med 1C:Enterprise 8.0 via en COM-forbindelse som å jobbe med 1C:Enterprise i serverautomatiseringsmodus. De viktigste forskjellene er som følger:

  2. Når det gjelder en automatiseringsserver, startes en fullverdig 1C:Enterprise 8.0-applikasjon, og når det gjelder en COM-tilkobling, startes en relativt liten COM-server i prosessen.
  3. Når du arbeider via en COM-tilkobling, er funksjonalitet på en eller annen måte knyttet til organiseringen av 1C:Enterprise 8.0-brukergrensesnittet ikke tilgjengelig;

Når du bruker en COM-tilkobling, brukes ikke 1C:Enterprise 8.0-konfigurasjonsapplikasjonsmodulen. Dens rolle når du arbeider med en COM-tilkobling spilles av den eksterne tilkoblingsmodulen.

1.1 Prosedyre for å etablere en COM-forbindelse

  1. For å organisere tilgang til 1C:Enterprise 8.0-data via en COM-tilkobling, utføres følgende handlingssekvens:

  2. et COM-objekt opprettes med identifikatoren V8.COMConnector, ved hjelp av hvilken forbindelsen opprettes;
  3. Connect-metoden til det tidligere opprettede V8.COMConnector-objektet kalles. Connect-metoden returnerer en kobling til et COM-tilkoblingsobjekt med 1C:Enterprise 8.0 infobase;

Viktig! På grunn av mangelen på et brukergrensesnitt i en COM-forbindelse, kan ikke alle objekter, egenskaper og metoder brukes i en COM-forbindelse.

1C:Enterprise-objekter tilgjengelige eksternt via en COM-tilkobling:

  1. Eksporterte variabler og prosedyrer/funksjoner til den eksterne sammenføyningsmodulen

  2. Eksporterte variabler og prosedyrer/funksjoner til vanlige moduler
  3. Inkludere og ekskludere hele moduler ved å angi egenskaper for vanlige moduler

  4. Inkluderer og ekskluderer fragmenter av vanlige moduler som bruker en forprosessor
  5. Global kontekst 1C:Enterprise 8.0, med unntak av objekter som er tett knyttet til klientapplikasjonen (TextDocument, TabularDocument, ...)

1.2 Ekstern tilkoblingsmodul

Som allerede nevnt, utføres applikasjonsmodulens ansvar når du arbeider gjennom en COM-tilkobling av den eksterne tilkoblingsmodulen. Denne modulen kan ha hendelsesbehandlerprosedyrer When SystemStarts() og WhenSystemCompletes(), som kan inneholde handlinger utført ved henholdsvis initialisering og avslutning av tilkoblingen.

Prosedyrer, funksjoner og globale variabler definert i en ekstern sammenføyningsmodul med eksportnøkkelordet blir, som i tilfellet med en applikasjonsmodul, en del av den globale konteksten.

1.3 Vanlige moduler

Egenskapene "Client", "Server" og "External Connection" er introdusert for vanlige moduler. De er ment å bestemme i konfigurasjonen bruken av moduler i klient-serverversjonen og i COM-tilkoblingsmodus.

1.4 Objekt "V8.COMConnector"

Den eneste oppgaven som løses av V8.COMConnector COM-objektet er å etablere en COM-forbindelse med 1C:Enterprise 8.0-informasjonsbasen. Et ubegrenset antall tilkoblinger kan opprettes ved å bruke én forekomst av V8.COMConnector-objektet. V8.COMConnector-objektet har en enkelt Connect-metode, designet for å etablere en COM-forbindelse med 1C:Enterprise 8.0-infobasen.

<СтрокаСоединенияИБ>

Forbindelseslinjen med informasjonssikkerhetssystemet er en kjede av fragmenter av formen Parameter=Verdi. Fragmenter er atskilt fra hverandre med ";". Hvis en verdi inneholder mellomrom, må den omsluttes av doble anførselstegn (").

Vanlige parametere:

Usr - brukernavn;
Pwd - passord.

Følgende parameter er definert for filversjonen:

Fil - infobasekatalog.

Følgende parametere er definert for klient-server-alternativet:

Srvr - 1C:Enterprise servernavn;
Ref - navn på infobasen på serveren.

Connect-metoden etablerer en COM-tilkobling til 1C:Enterprise 8.0-infobasen og returnerer en kobling til COM-tilkoblingsobjektet.

// Et koblingsobjekt er opprettet
V8 = New COMObject("V8.COMConnector");
// et COM-tilkoblingsobjekt er opprettet
Connection = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")

1.5 COM-tilkoblingsobjekt

En COM-forbindelse til 1C:Enterprise infobase gir full tilgang til dens globale kontekst (se "Kontekst for programmodulutførelse"). Derfor kan en COM-tilkobling ha som sine metoder: systemkonstanter, verdier spesifisert i konfiguratoren for objekter som er tilgjengelig ved hjelp av ledere (for eksempel konstanter, oppregninger, kataloger, dokumenter, dokumentlogger, rapporter, behandling, planer for typer av egenskaper, plankontoer, planer for beregningstyper, registre), samt variabler deklarert i den eksterne koblingsmodulen med eksportnøkkelordet.

I tillegg har COM-tilkoblingen en ekstra NewObject-metode som kan brukes til å skape verdier av visse typer.

tk = Tilkobling. NewObject("Verditabell");

String method Lar deg få strengrepresentasjoner av 1C:Enterprise-verdier.

View = Connection.String(Data.UniqueIdentifier());

1.6. Funksjoner ved å jobbe med en COM-tilkobling

I automatisering og i en COM-forbindelse har TRUE og FALSE følgende verdier: -1 (minus én) og 0.

Det er mulig å organisere en pool av COM-tilkoblinger. Samtidig opprettes flere COM-tilkoblingsobjekter PÅ FORHÅND på mottaksserveren 1C:Enterprise og det tar enda kortere tid å etablere en tilkobling, siden det ikke er behov for å opprette et nytt objekt.

Et nytt Query Builder-objekt er implementert, designet for å generere spørringstekster basert på de angitte innstillingene. Dette objektet støtter rapportbyggerfunksjonalitet som ikke er relatert til å sende ut rapporten til et regnearkdokument eller andre brukergrensesnittrelaterte oppgaver. Dette objektet kan brukes på 1C:Enterprise-serveren og i en COM-forbindelse.

Du kan bruke COM-objekter når du kjører det innebygde språket på 1C:Enterprise-serveren.

COM-feil konverteres til innebygde språkunntak.

Hvis konfigurasjonen forsøker å opprette et ugyldig objekt, for eksempel et regnearkdokument, i en ekstern kombineringsmodul, i en delt modul eller i en objektmodul, kan det hende at COM-tilkoblingen ikke opprettes eller kan avsluttes som et unntak.

En måte å overføre data fra en 1C-konfigurasjon til en annen er en programvaretilkobling ved hjelp av COM. Mange bedrifter bruker flere ulike databaser, som det må være visse koblinger og avhengigheter mellom. Hvis det ikke bare er nødvendig å overføre data, men også å utføre visse databehandlinger, vil en COM-forbindelse være den optimale mekanismen. Evnen til å analysere data fra en annen 1C-database er nyttig for enhver utviklere.

Vi kobler oss til 1C-databasen via COM

For å implementere en COM-tilkobling i 1C, brukes en spesiell mekanisme kalt COMConnector. Dette objektet er installert sammen med plattformen og brukes til å koble sammen infobaser. Det skal bemerkes at for versjon 8.2 og 8.3 brukes objekter med forskjellige navn - henholdsvis "V82.COMConnector" og "V83.COMConnector".

Husk at varigheten av COM-tilkoblingen til databasen koster en lisens - ikke la deg rive med av samtidig utførelse av flere tilkoblinger. Dette er spesielt viktig for organisasjoner som har et begrenset antall lisenser. Dette problemet kan løses ved hjelp av rutineoppgaver som utføres når det ikke er noen aktive brukerforbindelser til informasjonsbasen.

For å kunne koble til en annen database og be om nødvendig informasjon, må du kjenne til følgende data:

  1. Hvilken type er det - fil eller klient-server;
  2. Hvor befinner det seg;
  3. Hvilket navn og passord kan du bruke for å logge på?
  4. Hvilke data er du interessert i?

Fra de tre første punktene, for å implementere en COM-tilkobling, må du opprette en streng med parametere. Avhengig av type informasjonssikkerhet vil den variere i utseende. Ved hjelp av den mottatte strengen opprettes en forbindelse, ved hjelp av hvilken du kan samle inn data fra en annen database for analyse og behandling ved hjelp av hvilke som helst metoder.

Connection ParametersFileIB = "Fil=""Path_to_database""; Usr=""Brukernavn"";Pwd=""Passord"""; Connection ParametersClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Password""";

Tilkoblingsfunksjonen er enkel og bør ikke reise noen spørsmål hvis alle parametere er spesifisert riktig. For å fremskynde feilsøking og analyse av mulige feil, er det bedre å omslutte forbindelsen i "Prøv"-konstruksjonen. Funksjonen vil returnere en verdi av typen "COM-objekt", som du vil jobbe med for å få de nødvendige dataene.

&OnServer-funksjon ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c database\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Nytt COMObject("V83.COMConnector"); Forsøk på retur V83COMCon.Connect(IB Connection Parameters); Unntaksrapport(ErrorDescription());

Returner Udefinert; Sluttforsøk; EndFunction

Gjennom en COM-tilkobling kan du ikke bare velge data, men også legge dem til databasen du kobler til. Husk at vi kan overføre 4 primitive datatyper via et COM-objekt. Andre typer vil måtte spesifiseres ved hjelp av plattformens innebygde søkefunksjoner. Vær oppmerksom på at globale plattformfunksjoner også kalles opp via en COM-forbindelse.

Vi mottar data fra 1C-databasen

Etter at du har mottatt ønsket objekt, må du lese data fra en annen database. For å gjøre dette bruker vi en forespørsel via en COM-forbindelse i 1C 8.3 ved å bruke den mottatte verdien av typen "COM-objekt" fra funksjonen. Det er viktig å først koble til databasen og deretter utføre forespørselen. Utførelse skjer gjennom NewObject-metoden, som spesifiserer objekttypen i strengform som en parameter - "Request".

&OnServer-prosedyre TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then RequestBPZO = Connection.NewObject("Request");

  • RequestBPZO.Text = "VELG de første 15 | DirectoryUser.Name AS-navn |FROM | Directory.users AS DirectoryUser";
  • Select = RequestBPZO.Execute().select();
  • Mens Selection.next() loop Report(Selection.Number);
RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "VELG de første 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &Obligatorisk avdeling | Og DirectoryUser.Name som ""%"" + &RequiredName+ ""%""" ; Request BPZO.SetParameter("Nødvendig avdeling", Tilkobling. Kataloger. Enterprise Structure. Finn etter kode("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); Mens Selection.next() loop Report(Selection.Name); EndCycle;

Hvis du trenger å overføre en matrise til databasen for valg basert på flere parametere, for eksempel avdelinger, brukes også NewObject-kommandoen. På samme måte kan du sende en liste eller tabell med verdier, fylle dem med elementer fra en annen database gjennom en tilkobling. Alle eksisterende metoder for objekter og mekanismer på plattformen er tilgjengelige for søk.

RequestBPZO = Connection.NewObject.("Request"); RequestBPZO.Text = "VELG de første 15 | DirectoryUser.Name AS-navn | FRA | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | Og DirectoryUser.Name som ""%"" + &NecessaryName+ ""%" " "; Array of Departments = Connection.NewObject("Array"); Array of Departments.Add(Connection.Directories.Enterprise Structure.Finn By Code("00-000023")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Finn By Code("00-000038")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Finn By Code("00-000046")); Request BPZO.SetParameter("Nødvendig avdeling", Array of Departments); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); Mens Selection.next() loop Report(Selection.Name); EndCycle;

Ved overføring av dokumenter eller katalogelementer oppstår alltid spørsmålet om å kontrollere overføringen av et bestemt objekt. Ved hjelp av COM-forbindelser kan slike problemer løses gjennom en unik identifikator. Du må finne et objekt i plugin-databasen etter identifikator fra gjeldende informasjonssikkerhet ved å bruke "GetLink"-funksjonen, ved å bruke identifikatoren som en streng. Hvis en ikke finnes, kan du opprette den ved hjelp av en COM-tilkobling.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Hvis IKKE ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) så NewUser = Connection.Directories.Users.CreateItem();

NewUser.Name = Directories.Users.FindByCode("00-0000313").Name;

NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual;

NewUser.Write(); slutt om;



Et glimt av Bella. Romantisk kronikk. Et glimt av genialitet. Messerer om Akhmadulina Boris Messerer glimt av Bella romantiske kronikk