Vad är en com-anslutning? V8: COM-anslutning

Ett sätt att överföra data från en 1C-konfiguration till en annan är mjukvaruanslutning använder COM. Många företag använder flera olika databaser, mellan vilka det måste finnas vissa kopplingar och beroenden. Om det inte bara är nödvändigt att överföra data, utan också att utföra viss databehandling, kommer en COM-anslutning att vara den optimala mekanismen. Möjligheten att analysera data från en annan 1C-databas är användbar för alla utvecklare.

Vi ansluter via COM till 1C-databasen

För att implementera en COM-anslutning i 1C används en speciell mekanism som kallas COMConnector. Detta objekt installeras tillsammans med plattformen och används för att ansluta infobaser. Det bör noteras att för version 8.2 och 8.3 används objekt med olika namn - "V82.COMConnector" respektive "V83.COMConnector".

Kom ihåg att varaktigheten av COM-anslutningen till databasen kostar en licens - låt dig inte ryckas med samtidigt som flera anslutningar körs. Detta är särskilt viktigt för organisationer som har ett begränsat antal licenser. Det här problemet kan lösas med rutinuppgifter körs när det inte finns några aktiva användaranslutningar till infobasen.

För att kunna ansluta till en annan databas och begära nödvändig information du bör känna till följande information:

  1. Vilken typ är det - fil eller klient-server;
  2. Var ligger den;
  3. Vilket namn och lösenord kan du använda för att logga in?
  4. Vilken data är du intresserad av?

Från de första tre punkterna, för att implementera en COM-anslutning, måste du skapa en sträng med parametrar. Beroende på typen av informationssäkerhet kommer det att skilja sig åt utseende. Med hjälp av den mottagna strängen skapas en anslutning, med hjälp av vilken du kan samla in data från en annan databas för analys och bearbetning med valfri metod.

Connection ParametersFileIB = "File=""Sökväg_till_databas""; Usr=""Användarnamn"";Pwd=""Lösenord"""; ConnectionParametersClientServerIB = "Srvr=""Server_Name""; Ref=""Databas_Name""; Usr=""User_Name""; Pwd=""Lösenord""";

Anslutningsfunktionen är enkel och bör inte väcka några frågor om alla parametrar är korrekt angivna. För att påskynda felsökning och analys möjliga fel det är bättre att bifoga anslutningen i "Try"-konstruktionen. Funktionen kommer att returnera ett värde av typen "COM-objekt", med vilket du kommer att arbeta för att få fram nödvändig data.

&OnServer Funktion ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c databas\ERP""; Usr=""Administratör"";Pwd=""1"""; V83COMCon= Nytt COMObject("V83.COMConnector"); Försök att återvända V83COMCon.Connect(IB-anslutningsparametrar); Undantagsrapport(ErrorDescription());

Returnera odefinierat; Slutförsök; EndFunction

Genom en COM-anslutning kan du inte bara välja data, utan även lägga till den i databasen du ansluter till. Kom ihåg att vi kan överföra 4 primitiva datatyper via ett COM-objekt. Andra typer måste specificeras med hjälp av plattformens inbyggda sökfunktioner. Observera att globala plattformsfunktioner även anropas via en COM-anslutning.

Vi tar emot data från 1C-databasen

Efter att du har fått önskat objekt behöver du läsa data från en annan databas. För att göra detta använder vi en begäran via en COM-anslutning i 1C 8.3 med det mottagna värdet av typen "COM-objekt" från funktionen. Det är viktigt att först ansluta till databasen och sedan utföra begäran. Exekvering sker genom metoden NewObject, som anger objekttypen i strängform som en parameter - "Request".

&OnServer Procedur TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "VÄLJ de första 15 | DirectoryUser.Name AS Name |FROM | Directory.users AS DirectoryUser"; Select = RequestBPZO.Execute().select();

  • While Selection.next() loop Report(Selection.Number);
  • EndCycle; endIf; Slut på procedur >
  • Till exempel, för att få information om användare av en viss avdelning, kommer vi att ställa in ett villkor i förfrågan genom parametrar. En parameter kommer att vara
RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "VÄLJ första 15 | DirectoryUser.Name AS Name |FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | Och DirectoryUser.Name som ""%"" + &RequiredName+ ""%""" ; Begär BPZO.SetParameter("Obligatorisk avdelning", Anslutning. Kataloger. Företagsstruktur. Hitta efter kod("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); While Selection.next() loop Report(Selection.Name); EndCycle;

Om du behöver överföra en array till databasen för urval baserat på flera parametrar, till exempel avdelningar, används också kommandot NewObject. På samma sätt kan du skicka en lista eller tabell med värden, fylla dem med element från en annan databas via en anslutning. Alla är tillgängliga för dig att söka befintliga metoder plattformsobjekt och mekanismer.

RequestBPZO = Connection.NewObject.("Request"); RequestBPZO.Text = "VÄLJ första 15 | DirectoryUser.Name AS Name | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | Och 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")); Request BPZO.SetParameter("Obligatorisk avdelning", Array of Departments); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); While Selection.next() loop Report(Selection.Name); EndCycle;

Vid överföring av dokument eller katalogelement uppstår alltid frågan om att kontrollera överföringen av ett specifikt objekt. Med hjälp av COM-anslutningar kan sådana problem lösas genom en unik identifierare. Du måste hitta ett objekt i plugin-databasen efter identifierare från den aktuella informationssäkerheten med hjälp av "GetLink"-funktionen, med identifieraren som en sträng. Om en inte hittas kan du skapa den med en COM-anslutning.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Om INTE ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) då NewUser = Connection.Directories.Users.CreateItem();

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

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

NewUser.Write(); endIf;


En COM-anslutning har också rätt att använda procedurer och funktioner från vanliga 1C-moduler med egenskapen "Extern anslutning" aktiverad. Utöver detta villkor måste den anropade funktionen eller proceduren exporteras och inte innehålla interaktiva åtgärder som utförs på servern. Annars kommer du att se ett felmeddelande om att operationen är ogiltig.

Förening..; VariableFunction = Anslutning...; funktionsanrop>allmänt modulnamn>proceduranrop>allmänt modulnamn>

  1. Möjligheterna för extern anslutning till en annan databas i 1C är ganska omfattande och kan tillåta dig att utföra många uppgifter. Det är viktigt att kunna utvärdera verktygen korrekt och välja den optimala lösningen. I de flesta fall visas denna färdighet endast med erfarenhet eller genom att studera exempel på erfarna specialisters arbete. Nyckelord: COM, anslutning, extern, OLE, Automation, Connect, ComConnector, Srvr När du använder 1C:Enterprise 8.0 COM-anslutningar för att komma åt data, finns det följande fördelar jämfört med att använda en automationsserver:

  2. Snabbare anslutningsinstallation eftersom ingen separat process behöver skapas
  3. operativsystem

, och alla åtgärder utförs inom anropsprocessen;

  1. Snabbare åtkomst till egenskaperna och metoderna för 1C:Enterprise-objekt, eftersom att organisera en åtkomst inte kräver kommunikation mellan processer;

  2. Mindre förbrukning av operativsystemresurser. I allmänhet liknar arbetet med 1C:Enterprise 8.0 via en COM-anslutning att arbeta med 1C:Enterprise i serverautomationsläge. De viktigaste skillnaderna är följande: I fallet med en Automation-server startas en fullfjädrad 1C:Enterprise 8.0-applikation, och i fallet med en COM-anslutning startas en relativt liten COM-server under process.
  3. Ej tillgängligt när du arbetar via COM-anslutning funktionalitet- anslutningar 1C:Enterprise 8.0-kanvänds inte. Dess roll när du arbetar med en COM-anslutning spelas av den externa anslutningsmodulen.

1.1 Procedur för att upprätta en COM-anslutning

För att organisera åtkomst till 1C:Enterprise 8.0-data via en COM-anslutning, utförs följande sekvens av åtgärder:

  1. ett COM-objekt skapas med identifieraren V8.COMConnector, med hjälp av vilken anslutningen upprättas;

  2. Connect-metoden för det tidigare skapade V8.COMConnector-objektet anropas. Connect-metoden returnerar en referens till ett COM-anslutningsobjekt med informationsbas 1C:Enterprise 8.0;
  3. Genom det mottagna COM-anslutningsobjektet nås de giltiga metoderna, egenskaperna och objekten för den infobas med vilken anslutningen upprättas.

Viktig! På grund av bristen på ett användargränssnitt i en COM-anslutning kan inte alla objekt, egenskaper och metoder användas i en COM-anslutning.

1C:Enterprise-objekt tillgängliga externt via en COM-anslutning:

  1. Exporterade variabler och procedurer/funktioner för den externa kopplingsmodulen

  2. Exporterade variabler och procedurer/funktioner för vanliga moduler
  3. Inkludera och exkludera hela moduler genom att ställa in egenskaper för gemensamma moduler

  4. Inkludera och exkludera fragment av vanliga moduler som använder en förprocessor
  5. Global kontext 1C:Enterprise 8.0, med undantag för objekt som är tätt kopplade till klientapplikationen (TextDocument, TabularDocument, ...)

1.2 Extern anslutningsmodul

Som redan nämnts utförs applikationsmodulens ansvar vid arbete genom en COM-anslutning av den externa anslutningsmodulen. Den här modulen kan ha händelsehanterarprocedurer When SystemStarts() och WhenSystemCompletes(), som kan innehålla åtgärder som utförs vid initialisering respektive avslutning av anslutningen.

Procedurer, funktioner och globala variabler definierade i den yttre kopplingsmodulen med nyckelord Export blir, som i fallet med en applikationsmodul, en del av det globala sammanhanget.

1.3 Vanliga moduler

Egenskaperna "Klient", "Server" och "Extern anslutning" har införts för vanliga moduler. De är avsedda att i konfigurationen bestämma användningen av moduler i klient-serverversionen och i COM-anslutningsläge.

1.4 Objekt "V8.COMConnector"

Den enda uppgiften som löses av V8.COMConnector COM-objektet är att upprätta en COM-anslutning med informationsbasen 1C:Enterprise 8.0. Ett obegränsat antal anslutningar kan upprättas med en instans av V8.COMConnector-objektet. V8.COMConnector-objektet har en enda Connect-metod, utformad för att upprätta en COM-anslutning med 1C:Enterprise 8.0-infobasen.

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

Kopplingslinjen till informationssäkerhetssystemet är en kedja av fragment av formen Parameter=Värde. Fragment separeras från varandra med ";". Om värdet innehåller blanksteg, då måste det stå inom dubbla citattecken (").

Allmänna parametrar:

Usr - användarnamn;
Pwd - lösenord.

För filversion parameter definierad:

Fil - infobaskatalog.

Följande parametrar är definierade för klient-serveralternativet:

Srvr - 1C: Företagsservernamn;
Ref - namnet på infobasen på servern.

Connect-metoden upprättar en COM-anslutning till 1C:Enterprise 8.0-infobasen och returnerar en länk till COM-anslutningsobjektet.

// Ett kopplingsobjekt skapas
V8 = New COMObject("V8.COMConnector");
// ett COM-anslutningsobjekt skapas
Connection = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")

1.5 COM-anslutningsobjekt

COM-anslutning till 1C:Enterprise infobase ger full tillgång till dess globala sammanhang (se "Exekutionskontext mjukvarumodul"). Därför kan en COM-anslutning ha som sina metoder: systemkonstanter, värden specificerade i konfiguratorn för objekt som nås med hjälp av chefer (till exempel konstanter, uppräkningar, kataloger, dokument, dokumentloggar, rapporter, bearbetning, planer för typer av egenskaper, plankonton, planer för beräkningstyper, register), samt variabler som deklareras i den externa anslutningsmodulen med nyckelordet Export.

Dessutom har COM-anslutningen ytterligare metod NewObject, som kan användas för att skapa värden av vissa typer.

tz = Anslutning. NewObject("ValueTable");

Strängmetod Låter dig få strängrepresentationer av 1C:Enterprise-värden.

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

1.6. Funktioner för att arbeta med en COM-anslutning

I Automation och i en COM-anslutning har TRUE och FALSE följande värden: -1 (minus ett) och 0.

Det är möjligt att organisera en pool av COM-anslutningar. Samtidigt skapas flera COM-anslutningsobjekt i FÖRHÅND på den mottagande servern 1C:Enterprise och det tar ännu kortare tid att upprätta en anslutning, eftersom det inte finns något behov av att skapa ett nytt objekt.

Ett nytt Query Builder-objekt har implementerats, designat för att generera frågetexter baserat på de angivna inställningarna. Det här objektet stöder funktionaliteten hos rapportbyggaren, som inte är relaterad till utmatning av rapporten till ett kalkylarksdokument och andra uppgifter relaterade till gräns-snittet. Detta objekt kan användas på 1C:Enterprise-servern och i en COM-anslutning.

Tillgänglig använder COM-objekt när du kör det inbyggda språket på 1C:Enterprise-servern.

COM-fel konverteras till inbäddade språkundantag.

Om konfigurationen försöker skapa ett ogiltigt objekt, t.ex. kalkylarksdokument, i en extern anslutningsmodul, i en delad modul eller i en objektmodul, kan COM-anslutningen inte upprättas eller avbrytas som ett undantag.

Skriv ut (Ctrl+P)

Ett av alternativen för att utbyta data mellan 1C-databaser är utbyte via en COM-anslutning. Med en COM-anslutning kan du ansluta från en 1C-databas till en annan och läsa eller skriva data. Denna metod kan användas både i klient-serverversioner av databaser och i fildatabaser. Den här artikeln diskuterar dessa typer av anslutningar på plattform 8.3

com-anslutning

Du kan skapa två typer av COM-objekt för 1C-applikationen. Dessa är ole-anslutningar V83.Ansökan och com-anslutningar V83.COMConnector . I fallet med V83.Ansökan En nästan fullfjädrad kopia av 1C-applikationen lanseras. Vid användning V83.COMConnector En liten serverdel lanseras. Driftshastigheten i detta fall är högre, men vissa funktioner kanske inte är tillgängliga. Framför allt att arbeta med formulär och gemensamma moduler för vilken egenskapen att arbeta med externa anslutningar inte är inställd. För det mesta ska du använda V83.COMConnector och endast vid bristande funktionalitet V83.Ansökan. Skillnaden i driftshastighet kan vara särskilt märkbar på databaser med stora volymer. För plattform 8.2 används V82.Application eller V82.COMConnector

Upprätta en OLE-anslutning

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

Upprätta en COM-anslutning

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

Anslutningssträng

//För alternativet klient-server
Anslutningssträng= “Srvr = ““Servernamn” “;Ref = “ “Basnamn” ;
//För filläge alternativ:
Anslutningssträng= "File = ""PathKBase" "; Usr = Användarnamn; Pwd = Lösenord";
Försök
Anslutning = Anslutning . Ansluta(ConnectionString) ;
Undantag
Message = New MessageToUser;
Meddelande . Text = "Kunde inte ansluta till databasen" + DescriptionErrors(); Meddelande;
. Rapportera()

EndAttempt ;

Urkoppling
Anslutning = Odefinierad; V83.Ansökan För objekt V83.COMConnector Det är nödvändigt att avsluta anslutningen, annars kvarstår en ofullständig session, som sedan måste raderas manuellt. I fallet med

anslutningen bryts automatiskt när proceduren där anslutningen gjordes är klar. Och det finns en liten punkt till. För användaren under vilken anslutningen görs måste kryssrutan "Begär bekräftelse när programmet stängs" vara avaktiverad i dess inställningar.

NewObject() metod

För att skapa ett nytt objekt kan du använda metoden NewObject(), till exempel: V83.COMConnector

För RequestCOM = Anslutning. NewObject() ;
"Begäran" RequestCOM TableCOM) ;
"Värdetabell"

ArrayCOM = Anslutning. NewObject(“Array” ) ;

ViewCOM =Anslutning.NewObject V83.Ansökan

För RequestOLE = Anslutning. NewObject(“) ;
Begär"(TableCOM) ;
TableOLE = Anslutning. Nytt objekt ArrayOLE = Connection.NewObject
("Array"); ViewCOM =Anslutning.NewObject

("UniqueIdentifier", StringUID); RequestCOM. Text =
"VÄLJA
| Organisationers positioner, kod.
| Organisationers positioner.Namn |FRÅN
| Directory.Positions of Organisations;

HUR MAN POSITIONER FÖR ORGANISATIONER” Resultat = RequestCOM.
Sikt(); Prov = Resultat.
Välj () ;Hejdå urval. Nästa()
Cykel
EndCycle ;
Du kan också använda konfigurationsobjekthanterare:
DirectoryCOM = Anslutning. Kataloger. Katalognamn; DocumentCOM
= Anslutning. Dokument. DocumentName; RegisterCOM = Anslutning. Informationsregister

. RegisterName ;

Ta emot och jämföra uppräkning via COM-anslutning

För att jämföra värdena för uppräkningselement som definieras i konfigurationen, är det nödvändigt att konvertera dessa element till en av de primitiva typerna, vars jämförelse är lätt. Sådana typer kan vara antingen en numerisk typ eller en strängtyp. Du kan konvertera värdet på ett uppräkningselement till en numerisk typ så här: Enum Artikel =

Connection.Directories.Directory1.FindByCode(1).Props1;

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

EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement))); Om EnumerationItemNumber = 0 Rapportera();

"Räknevärde 1" ElseIfEnumerationItemNumber = 1 Report("EnumerationValue2");

endIf;

Hämta ett objekt via COM med identifierare

Genom konfigurationsobjekthanterare får vi ett com-objekt, till exempel:
DocumentCOM = Anslutning. Dokument. DocumentName;

Då får vi en unik identifierarsträng:

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

Identifierare = Nytt U uniqueIdentifier(StringUID);
MED linkByIdentifier = Dokument[Dokumentnamn].GetLink(Identifier);

Om du behöver hitta ett com-objekt per dokument efter identifierare, måste du skriva så här:

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

) Det stämmer

Samtidigt har jag sett mer än en gång när publikationer som inte ens nådde 10 poäng helt enkelt "tog fart".
Varför hände detta? Tydligen för att någon uppenbarligen gillade dem.


Detta är vad jag säger, att det skulle vara trevligt att förstå hur mycket du behöver det utan att läsa betygsartikeln, eller att utvärdera det inte så primitivt +/-. När det gäller vad jag gillade skulle jag rätta till det så här: det fick så mycket på grund av det faktum att stjärnorna passade in och många människor samlades på sajten och många gillade den, du förstår själv att detta är en slumpmässig fråga eftersom så fort artikeln lämnar startsida då kan den redan hittas endast på begäran, och så röstar alla som går förbi. Och så vitt jag förstår låter ständiga kommentarer = marknadsföring av artikeln dig behålla den på huvudsidan.
Det är just därför de lägger butiker på allmänna gator – det som ofta är viktigt är inte varornas kvalitet och relevans, utan platsens trafikbarhet köper ofta något som de slänger nästa dag, bara för processens skull. Detta är en sjukdom som länge varit känd för alla - shoppingberoende. Eller att helt enkelt öka flödet ökar sannolikheten för rätt köpare.

Och fördelarna och nackdelarna... - det här är bara ett slags "tack" för den tid och det arbete som lagts ner


Dessa. Räknas ett minus också som ett "tack"? Jag ville veta din åsikt om det borde användas i sådana fall, och hur intressant andra tycker? Ska du uttrycka det när artikeln är skadlig/dålig eller när den helt enkelt är värdelös/tom för dig?
Enligt min mening ser artikeln ut som en enkel betygsökning, eftersom:
1. Problemet med typer jag citerade ignorerades helt av författaren, även om han inte var för lat för att skriva en massa kommentarer.
2. Det finns en uppenbar felaktighet i artikeln: det sägs att detta är det enda sättet

V82 = New COMObject("V82.ComConnector"); Code = AccountCOM.Code;


men jag kan enkelt göra det med bearbetning så här:

Rapport(Bas. Kataloger. Motparter. Sök efter namn("LLC"). Kod);


och allt är bra! Och jag väljer anslutningen V82.ComConnector
Det är på något sätt konstigt att författaren inte alls bryr sig om att hans artikel innehåller de problem som påtalades, men han reagerar inte på något sätt.
3. Men det finns fortfarande ett problem när felet "Klass finns inte" dyker upp
4. Det finns ett problem när 8.2 är installerat och sedan 8.1 är installerat - försök att byta via OLE/COM typiskt utbyte UT-BP!
5. Kan du ange huvudbearbetningen på webbplatsen som gör att du kan ansluta universellt via OLE/COM så att nybörjare inte slösar tid, du skriver för dem! Förresten, av någon anledning finns hennes bild på din display, varför? Och som ett resultat, 2 ord på meriter och 6 mer bakom kulisserna.

I allmänhet kastar jag inte lera, utan pekar ut specifika luckor, men det finns ingen reaktion. Om det här är upplevelsen du delar, så är den på något sätt felaktig och ofullständig.
Min poäng är att om författaren hade en önskan att samla alla fel, kunde han åtminstone lyssna på andras erfarenheter och inte snärja på kommentarer. En situation uppstår omedelbart när den som läser den vet mer än författaren, de säger till honom (ibland felaktigt), och han slår också emot. Som ett resultat finns all information inte i artikeln, utan i kommentarerna! Rolig! Detta händer ofta, men du behöver inte fokusera på att du ville ha det bästa - jag visar vad som är bäst, och andra visar det! Inkludera detta i artikeln så är det inte alla som är intresserade av att läsa denna skärmytsling.

Dela