At arbejde over en COM-forbindelse er nemmere, end du tror. Tre søjler til at arbejde med COM-objekter

Udskriv (Ctrl+P)

En af mulighederne for at udveksle data mellem 1C-databaser er udveksling via en COM-forbindelse. Ved at bruge en COM-forbindelse kan du oprette forbindelse fra en 1C-database til en anden og læse eller skrive data. Denne metode kan bruges både i klient-server-versioner af databaser og i fildatabaser. Denne artikel diskuterer disse typer forbindelser på platform 8.3

com forbindelse

Du kan oprette to typer COM-objekter til 1C-applikationen. Disse er ole-forbindelser V83.Anvendelse og com-forbindelser V83.COMConnector . I tilfælde af V83.Anvendelse En næsten fuldgyldig kopi af 1C-applikationen lanceres. I tilfælde af brug V83.COMConnector En lille serverdel lanceres. Betjeningshastigheden er i dette tilfælde højere, men nogle funktioner er muligvis ikke tilgængelige. Især arbejde med formularer og fælles moduler, for hvilke egenskaben til at arbejde med eksterne forbindelser ikke er indstillet. For det meste skal du bruge V83.COMConnector og kun i tilfælde af manglende funktionalitet V83.Anvendelse. Forskellen i driftshastighed kan især være mærkbar på store databaser. Til platform 8.2 brugt V82.Application eller V82.COMConnector

Etabler en OLE-forbindelse

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

Opret en COM-forbindelse

Forbindelse = Nyt COMObject(“V83.COMConnector”);

Forbindelsesstreng

//For klient-server-indstillingen
Forbindelsesstreng= “Srvr = ““Servernavn” “;Ref = “ “Basenavn” ;
//For filtilstand indstilling:
Forbindelsesstreng= "Fil = ""PathKBase" "; Usr = Brugernavn; Pwd = Adgangskode";
Forsøg
Forbindelse = Forbindelse . Forbinde(ConnectionString) ;
Undtagelse
Message = New MessageToUser;
Besked . Tekst = "Kunne ikke oprette forbindelse til databasen" + Beskrivelsesfejl(); Besked;
. Rapport()

Slutforsøg ;

Afbrydelse
Forbindelse = Udefineret; V83.Anvendelse Til objekt V83.COMConnector Det er nødvendigt at afbryde forbindelsen, ellers forbliver en ufuldstændig session, som derefter skal slettes manuelt. I tilfælde af

forbindelsen afbrydes automatisk, når den procedure, hvor forbindelsen blev foretaget, er afsluttet. Og der er endnu et lille punkt. For den bruger, under hvem forbindelsen oprettes, skal afkrydsningsfeltet "Anmod om bekræftelse ved lukning af programmet" være deaktiveret i indstillingerne.

NewObject() metode

For at oprette et nyt objekt kan du bruge NewObject() metoden, for eksempel: V83.COMConnector

For RequestCOM = Tilslutning. NewObject() ;
"Forespørgsel" RequestCOM "Tabel over værdier") ;
ArrayCOM = Forbindelse. NewObject(“Array”);

ViewCOM =Connection.NewObject

For V83.Anvendelse

RequestOLE = Tilslutning. NewObject(“ Anmod") ;
TableOLE = Forbindelse. Nyt objekt("Tabel over værdier") ;
ArrayOLE = Connection.NewObject("Array");
ViewCOM =Connection.NewObject("UniqueIdentifier", StringUID);

RequestCOM . Tekst ="VÆLGE
| Organisationers positioner, kode.
| Organisationers positioner.Navn
|FRA | Directory.Positions of Organisations
HVORDAN MAN HOLDER ORGANISATIONER”;

Resultat = RequestCOM. Løbe();
Prøve = Resultat. Vælg ();
Farvel udvælgelse. Næste()Cyklus
EndCycle ;
Du kan også brugerer:
DirectoryCOM = Forbindelse. Vejviser. DirectoryName;
DocumentCOM = Tilslutning. Dokumenter. Dokumentnavn;
RegisterCOM = Forbindelse. Informationsregistre. RegisterName ;

Modtagelse og sammenligning af opregning via COM-forbindelse

For at sammenligne værdierne af opregningselementer defineret i konfigurationen, er det nødvendigt at konvertere disse elementer til en af ​​de primitive typer, hvis sammenligning er let. Sådanne typer kan enten være en numerisk type eller en strengtype. Du kan konvertere værdien af ​​et opregningselement til en numerisk type som denne:

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

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

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

Hvis EnumerationItemNumber = 0, skal du rapportere( "Tælleværdi1");

ElseIfEnumerationItemNumber = 1 Rapport("EnumerationValue2");

endIf;

Hentning af et objekt via COM efter identifikator

Gennem konfår vi et com-objekt, for eksempel:
DocumentCOM = Tilslutning. Dokumenter. Dokumentnavn;

Så får vi en unik identifikationsstreng:

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

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

Hvis du skal finde et com-objekt efter dokument efter identifikator, så skal du skrive sådan her:

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

En af mulighederne for at udveksle data mellem 1C-databaser er udveksling via en COM-forbindelse.

Ved at bruge en COM-forbindelse kan du oprette forbindelse fra en 1C-database til en anden og læse eller skrive data. Denne metode kan bruges både i klient-server-versioner af databaser og i fildatabaser. I denne artikel vil vi se på eksempler på denne type forbindelse. Eksemplerne bruger platform 8.2.

Du kan oprette to typer COM-objekter til 1C-applikationen. Denne V82.Anvendelse Og V82.COMConnector. I tilfælde af V82.Anvendelse En næsten fuldgyldig kopi af 1C-applikationen lanceres. i tilfælde af brug V82.COMConnector En lille serverdel lanceres.
Betjeningshastigheden er i dette tilfælde højere, men nogle funktioner er muligvis ikke tilgængelige. Især arbejde med formularer og fælles moduler, for hvilke egenskaben til at arbejde med eksterne forbindelser ikke er indstillet. For det meste skal du bruge V82.COMConnector og kun i tilfælde af manglende funktionalitet V82.Anvendelse. Forskellen i driftshastighed kan især være mærkbar på store databaser.

Så lad os komme i gang

  1. Lad os oprette et COM-objekt
    • For at oprette et nyt objekt kan du bruge NewObject() metoden, for eksempel: V82.Anvendelse Forbindelse = New COMObject("V82.Application" );
    • For at oprette et nyt objekt kan du bruge NewObject() metoden, for eksempel: V82.COMConnector Forbindelse = New COMObject("V82.COMConnector" );
  2. Lad os oprette en forbindelsesstreng
    • for serverversionen af ​​databasen ConnectionString = "Srvr = " "Servernavn" ";Ref = " "Basenavn" ;
    • for filversionen af ​​databasen ConnectionString = "File = " "PathKBase" "; Usr = Brugernavn; Pwd = Adgangskode";
  3. Tilslutning til databasen Forsøg tilslutning = Tilslutning. Connect(ConnectionString) ;
  4. Exception Message = New MessageToUser; Besked. Text = + ErrorDescription() ;

    Besked. Rapport() ; V82.Anvendelse Til objekt V82.COMConnector Slutforsøg ;

    Afbryder forbindelsen til databasen

Forbindelse = Udefineret;

Til objekt forbindelsen afbrydes automatisk, når den procedure, hvor forbindelsen blev foretaget, er afsluttet. Og der er endnu et lille punkt. For den bruger, under hvem forbindelsen oprettes, skal afkrydsningsfeltet "Anmod om bekræftelse ved lukning af programmet" være deaktiveret i indstillingerne. Lad os nu sætte al koden sammen Forbindelse = New COMObject("V82.Application" ); //Connection = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ;

//ConnectionString = "File = ""С:\MyBase""; Usr = Petya; Pwd = 123"; V82.Anvendelse Forsøg tilslutning = Tilslutning. Connect(ConnectionString) ; V82.COMConnector metoden anvendes på forbindelsen. Derefter behandles anmodningen ved hjælp af standard 1C-værktøjer. i kode ser det sådan ud:

Forespørgsel = Tilslutning. NewObject("Forespørgsel" ) ; // For V82.COMConnector Forespørgsel = Tilslutning. NewObject("Anmodning" ) ; // For V82.Anvendelse Anmodning. Tekst = "VÆLG | Organisationers positioner, kode. | Organisationers positioner.Navn|FRA | Directory. Organisationers positioner AS.;

Resultat = Forespørgsel. Løbe(); Prøve = Resultat. Vælg() ; Farvel udvælgelse. Næste() Loop EndLoop ; For version 1C:Enterprise 8.3 forbliver alt uændret bortset fra, at når du opretter COM-objekter, skal du bruge"V83.COMConnector" eller.


"V83.Applikation"

Nøgleord: COM, forbindelse, ekstern, OLE, Automation, Connect, ComConnector, Srvr

  1. Når du bruger 1C:Enterprise 8.0 COM-forbindelser til at få adgang til data, er der følgende fordele sammenlignet med at bruge en Automation-server:

  2. Hurtigere forbindelsesetablering, da der ikke er behov for at oprette en separat operativsystemproces, og alle handlinger udføres inden for opkaldsprocessen;
  3. Hurtigere adgang til egenskaberne og metoderne for 1C:Enterprise-objekter, da organisering af en adgang ikke kræver interproceskommunikation;

Mindre forbrug af operativsystemressourcer.

  1. Generelt er arbejdet med 1C:Enterprise 8.0 via en COM-forbindelse det samme som at arbejde med 1C:Enterprise i serverautomatiseringstilstand. De vigtigste forskelle er som følger:

  2. I tilfælde af en Automation-server lanceres en fuldgyldig 1C:Enterprise 8.0-applikation, og i tilfælde af en COM-forbindelse lanceres en relativt lille COM-server i processen.
  3. Når du arbejder via en COM-forbindelse, er funktionalitet på den ene eller anden måde relateret til organisationen af ​​1C:Enterprise 8.0-brugergrænsefladen ikke tilgængelig;

Når du betjener en COM-forbindelse, bruges 1C:Enterprise 8.0-kikke. Dens rolle, når du arbejder med en COM-forbindelse, spilles af det eksterne forbindelsesmodul.

1.1 Procedure for etablering af en COM-forbindelse

  1. For at organisere adgangen til 1C:Enterprise 8.0-data via en COM-forbindelse udføres følgende handlingssekvens:

  2. et COM-objekt oprettes med identifikatoren V8.COMConnector, ved hjælp af hvilken forbindelsen etableres;
  3. Connect-metoden for det tidligere oprettede V8.COMConnector-objekt kaldes. Connect-metoden returnerer et link til et COM-forbindelsesobjekt med 1C:Enterprise 8.0 infobasen;

Vigtig! På grund af manglen på en brugergrænseflade i en COM-forbindelse, kan ikke alle objekter, egenskaber og metoder bruges i en COM-forbindelse.

1C:Enterprise-objekter, der er tilgængelige eksternt via en COM-forbindelse:

  1. Eksporterede variabler og procedurer/funktioner for det eksterne joinmodul

  2. Eksporterede variabler og procedurer/funktioner af fælles moduler
  3. Inkludering og udelukkelse af hele moduler ved at indstille egenskaber for fælles moduler

  4. Inkluderer og ekskluderer fragmenter af almindelige moduler ved hjælp af en præprocessor
  5. Global kontekst 1C:Enterprise 8.0, med undtagelse af objekter, der er tæt knyttet til klientapplikationen (TextDocument, TabularDocument, ...)

1.2 Eksternt tilslutningsmodul

Som allerede nævnt udføres applikationsmodulets ansvar ved arbejde gennem en COM-forbindelse af det eksterne forbindelsesmodul. Dette modul kan have hændelseshåndteringsprocedurer When SystemStarts() og WhenSystemCompletes(), som kan indeholde handlinger udført under henholdsvis initialisering og afslutning af forbindelse.

Procedurer, funktioner og globale variable defineret i et eksternt join-modul med eksportnøgleordet bliver, som i tilfældet med et applikationsmodul, en del af den globale kontekst.

1.3 Fælles moduler

Egenskaberne "Client", "Server" og "External Connection" er indført for almindelige moduler. De er beregnet til at bestemme i konfigurationen brugen af ​​moduler i klient-serverversionen og i COM-forbindelsestilstand.

1.4 Objekt "V8.COMConnector"

Den eneste opgave, som V8.COMConnector COM-objektet løser, er at etablere en COM-forbindelse med 1C:Enterprise 8.0 informationsbasen. Et ubegrænset antal forbindelser kan etableres ved hjælp af én instans af V8.COMConnector-objektet. V8.COMConnector-objektet har en enkelt Connect-metode, designet til at etablere en COM-forbindelse med 1C:Enterprise 8.0 infobasen.

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

Forbindelseslinjen med informationssikkerhedssystemet er en kæde af fragmenter af formen Parameter=Værdi. Fragmenter er adskilt fra hinanden med ";". Hvis en værdi indeholder mellemrum, skal den være omgivet af dobbelte anførselstegn (").

Generelle parametre:

Usr - brugernavn;
Pwd - adgangskode.

Følgende parameter er defineret for filversionen:

Fil - infobase bibliotek.

Følgende parametre er defineret for klient-server-indstillingen:

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

Connect-metoden etablerer en COM-forbindelse til 1C:Enterprise 8.0-infobasen og returnerer et link til COM-forbindelsesobjektet.

// Der oprettes et forbindelsesobjekt
V8 = New COMObject("V8.COMConnector");
// et COM-forbindelsesobjekt oprettes
Connection = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")

1.5 COM-forbindelsesobjekt

En COM-forbindelse til 1C:Enterprise-infobasen giver fuld adgang til dens globale kontekst (se "Kontekst for udførelse af programmodul"). Derfor kan en COM-forbindelse have som sine metoder: systemkonstanter, værdier angivet i konfiguratoren af ​​objekter, der tilgås ved hjælp af ledere (for eksempel konstanter, opregninger, mapper, dokumenter, dokumentlogfiler, rapporter, behandling, planer for typer af karakteristika, plankonti, planer for beregningstyper, registre), samt variable deklareret i det eksterne tilslutningsmodul med eksportnøgleordet.

Derudover har COM-forbindelsen en ekstra NewObject-metode, der kan bruges til at skabe værdier af visse typer.

tk = Forbindelse. NewObject("VærdiTabel");

Strengmetode Giver dig mulighed for at få strengrepræsentationer af 1C:Enterprise-værdier.

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

1.6. Funktioner ved at arbejde med en COM-forbindelse

I Automation og i en COM-forbindelse har TRUE og FALSE følgende værdier: -1 (minus en) og 0.

Det er muligt at organisere en pulje af COM-forbindelser. Samtidig oprettes flere COM-forbindelsesobjekter I FORHÅND på den modtagende server 1C:Enterprise, og det tager endnu mindre tid at etablere forbindelse, da der ikke er behov for at oprette et nyt objekt.

Et nyt Query Builder-objekt er blevet implementeret, designet til at generere forespørgselstekster baseret på de angivne indstillinger. Dette objekt understøtter rapportbyggerfunktionalitet, der ikke er relateret til udskrivning af rapporten til et regnearksdokument eller andre brugergrænsefladerelaterede opgaver. Dette objekt kan bruges på 1C:Enterprise-serveren og i en COM-forbindelse.

Du kan bruge COM-objekter, når du kører det indbyggede sprog på 1C:Enterprise-serveren.

COM-fejl konverteres til indlejrede sprogundtagelser.

Hvis konfigurationen forsøger at oprette et ugyldigt objekt, såsom et regnearksdokument, i et eksternt joinmodul, i et delt modul eller i et objektmodul, etableres COM-forbindelsen muligvis ikke eller kan blive afsluttet som en undtagelse.

En måde at overføre data fra en 1C-konfiguration til en anden er en softwareforbindelse ved hjælp af COM. Mange virksomheder bruger flere forskellige databaser, mellem hvilke der skal være visse forbindelser og afhængigheder. Hvis det ikke kun er nødvendigt at overføre data, men også at udføre visse databehandlinger, vil en COM-forbindelse være den optimale mekanisme. Evnen til at analysere data fra en anden 1C-database er nyttig for enhver udvikler.

Vi forbinder via COM til 1C-databasen

For at implementere en COM-forbindelse i 1C bruges en speciel mekanisme kaldet COMConnector. Dette objekt installeres sammen med platformen og bruges til at forbinde infobaser. Det skal bemærkes, at til version 8.2 og 8.3 bruges objekter med forskellige navne - henholdsvis "V82.COMConnector" og "V83.COMConnector".

Husk at varigheden af ​​COM-forbindelsen til databasen koster en licens - lad dig ikke rive med af samtidig eksekvering af flere forbindelser. Dette er især vigtigt for organisationer, der har et begrænset antal licenser. Dette problem kan løses ved hjælp af rutineopgaver, der udføres, når der ikke er aktive brugerforbindelser til informationsbasen.

For at kunne oprette forbindelse til en anden database og anmode om de nødvendige oplysninger, skal du kende følgende data:

  1. Hvilken type er det - fil eller klient-server;
  2. Hvor er den placeret;
  3. Hvilket navn og kodeord kan du bruge til at logge på?
  4. Hvilke data er du interesseret i?

Fra de første tre punkter skal du generere en række parametre for at implementere en COM-forbindelse. Afhængig af typen af ​​informationssikkerhed vil den afvige i udseende. Ved hjælp af den modtagne streng oprettes en forbindelse, ved hjælp af hvilken du kan indsamle data fra en anden database til analyse og bearbejdning ved hjælp af enhver metode.

Connection ParametersFileIB = "File=""Sti_til_database""; Usr=""Brugernavn"";Pwd=""Password"""; ForbindelsesparametreClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Password""";

Tilslutningsfunktionen er enkel og bør ikke rejse nogen spørgsmål, hvis alle parametre er angivet korrekt. For at fremskynde fejlfinding og analyse af mulige fejl er det bedre at omslutte forbindelsen i "Prøv"-konstruktionen. Funktionen returnerer en værdi af typen "COM-objekt", som du vil arbejde med for at få de nødvendige data.

&OnServer Funktion ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c database\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Nyt COMObject("V83.COMConnector"); Forsøg at returnere V83COMCon.Connect(IB Connection Parameters); Undtagelsesrapport(ErrorDescription());

Returner Udefineret; Slutforsøg; EndFunction

Gennem en COM-forbindelse kan du ikke kun vælge data, men også tilføje dem til den database, du opretter forbindelse til. Husk at vi kan overføre 4 primitive datatyper via et COM-objekt. Andre typer skal angives ved hjælp af platformens indbyggede søgefunktioner. Bemærk, at globale platformsfunktioner også kaldes via en COM-forbindelse.

Vi modtager data fra 1C-databasen

Efter du har modtaget det ønskede objekt, skal du læse data fra en anden database. For at gøre dette bruger vi en anmodning via en COM-forbindelse i 1C 8.3 ved hjælp af den modtagne værdi af typen "COM-objekt" fra funktionen. Det er vigtigt først at oprette forbindelse til databasen og derefter udføre anmodningen. Udførelse sker gennem NewObject-metoden, der angiver objekttypen i strengform som en parameter - "Request".

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

  • RequestBPZO.Text = "VÆLG de første 15 | DirectoryUser.Name AS Name |FROM | Directory.users AS DirectoryUser";
  • Select = RequestBPZO.Execute().select();
  • Mens Selection.next() loop Report(Selection.Number);
RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "VÆLG de første 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | Og DirectoryUser.Name som ""%"" + &RequiredName+ ""%""" ; Request BPZO.SetParameter("Påkrævet afdeling", Forbindelse. Mapper. Virksomhedsstruktur. Find efter kode("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); Mens Selection.next() loop Report(Selection.Name); EndCycle;

Hvis du skal overføre et array til databasen for valg baseret på flere parametre, for eksempel afdelinger, bruges kommandoen NewObject også. På samme måde kan du sende en liste eller tabel med værdier og fylde dem med elementer fra en anden database gennem en forbindelse. Alle eksisterende metoder til objekter og mekanismer på platformen er tilgængelige for dig til søgning.

RequestBPZO = Connection.NewObject.("Request"); RequestBPZO.Text = "VÆLG de første 15 | DirectoryUser.Name AS Name | FROM | 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.Find By Code("00-000023")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000038")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000046")); RequestBPZO.SetParameter("RequiredDepartment", Array ofDepartments); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); Mens Selection.next() loop Report(Selection.Name); EndCycle;

Ved overførsel af dokumenter eller bibliotekselementer opstår altid spørgsmålet om at kontrollere overførslen af ​​et bestemt objekt. Ved hjælp af COM-forbindelser kan sådanne problemer løses gennem en unik identifikator. Du skal finde et objekt i plug-in-databasen efter identifikator fra den aktuelle informationssikkerhed ved hjælp af "GetLink"-funktionen, ved at bruge identifikatoren som en streng. Hvis en ikke findes, kan du oprette den ved hjælp af en COM-forbindelse.

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(); endIf;