Ta emot data via com-anslutning från 1s. V8: COM-anslutning. Ta emot och jämföra uppräkning via COM-anslutning

Fråga: Analysera en webbplats med COM IE 11


God dag.!
Frågan är smärtsamt välkänd, du måste ta informationen från sajten. Men det finns nyanser:
1. Det går inte att gå direkt till auktoriseringssidan (gå först till startsidan, klicka på inloggningslänken, hämta auktoriseringsformuläret och först sedan logga in).
2. Du måste besöka webbplatsen via sökruta sök efter data, läs sedan och sök igen (data kan vara på ryska och engelska, dvs. om data som ska sökas är på ryska, måste du söka i den "ryska versionen" av webbplatsen, och detta är en annan länk till en annan sida. Det är samma problem med engelska).

Så småningom:
- gå till startsidan - logga in - leta efter data - (gå till en annan version av webbplatsen, om det behövs) - ta det.

Problem:
Data läses inte in i egenskapen "dokument" när du följer en länk.
Det inträffar på två punkter:
- när vi följer länken för att logga in (detta är inte en knapp, utan bara en länk);
- när vi byter språk på sajten (även en länk).

Notera
Om du, innan du följer en länk i auktoriseringsstadiet, får en länk, stänger com och öppnar den igen med övergången genom metoden IE.navigate("länk"), lagras data i egenskapen "dokument" normalt . Men du kommer inte att kunna göra samma sak när du byter språk på webbplatsen, eftersom... Jag måste logga in igen och plus att jag inte skulle vilja lösa det här problemet exakt så.

Här är koden:

&På klientproceduren SetWaitingIE(IE, SecondCall=False) Om INTE IE.Busy Då D = CurrentDate() + 3; Medan D >= CurrentDate() Loop If IE.Busy Then Abort; endIf; EndCycle; endIf; Medan IE.Busy Loop EndLoop; Medan IE.ReadyState< 4 Цикл КонецЦикла; Попытка Если IE.Document.ReadyState = Null Тогда IE.Refresh(); УстановитьОжиданиеИЕ(IE); КонецЕсли; Пока IE.Document.ReadyState <>"fullständig" Cycle EndCycle; Undantag Om SecondCall Sedan Returnera; Else Link = IE.LocationURL; IE.Quit(); IE = GetCOM("InternetExplorer.Application"); IE.Navigera(länk); SetExpectIE(IE, True); endIf; Slutförsök; EndProcedure &OnClient Function PerformUserAuthorization(IE, Link, Login, Password, Authorized=False, SC=0) Attempt Elements = IE.Document.GetElementsByName("användarnamn"); Om Elements.Length = 1 Då För varje El Of Elements Loop El.Value = Logga in; EndCycle; endIf; Elements = IE.Document.GetElementsByName("lösenord"); Om Elements.Length = 1 Då För varje El Of Elements Loop El.Value = Lösenord; EndCycle; endIf; IE.Document.GetElementById("ID").Click(); SetWaitingIE(IE); Auktoriserad = Sant; Undantag Om CN > 3 Returnera False; endIf; IE.Quit(); IE.Navigera(länk); SetWaitingIE(IE); MF = MF + 1; Om PerformUserAuthorization(IE, Link, Login, Password, SCH) Returnera sedan True; endIf; Slutförsök; Retur godkänd; EndFunction &OnClient Procedur Upload(Command) SpTables = GetListTablesForUpload(); Om SpTables = False Returnera sedan; endIf; IE = GetCOM("InternetExplorer.Application"); För varje rad från SpTable.SOURCE_LIST Cykel RA = Rad.ID; Resurs = String.RESOURCE; IE.Navigate(Resource); SetWaitingIE(IE); Prova om Line.NEW_PAGE_IN_LOGIN = 1 Då Classes = IE.Document.GetElementsByClassName("Klassnamn"); Om Classes.Length = 1 Då för varje klass från klasser Loop Resource = Class.All(0).Href; Avbryta; EndCycle; Försöker IE.Quit(); IE = IE.Navigera(Resurs); SetWaitingIE(IE); Exception Report("Anslutning till webbplatsen "" +String.NAME + "" misslyckades!"); Avbryta; Slutförsök; Annars Report("Anslutning till webbplatsen "" +String.NAME + "" misslyckades!"); Avbryta; endIf; endIf; If NOT PerformUserAuthorization(IE, Resource, String.LOGIN, String.PASSWORD) Then Report("Användarbehörighet på webbplatsen "" + String.NAME + "" har inte slutförts!"); Avbryta; endIf; Resurs = IE.LocationURL; Lista över personer = SpTable.FACE_CODES.FindLines(New Structure("SOURCE", RA)); ListNotFound = Ny Array; För varje person från listan över personer Cycle PersonName = Person.NAME_IN_SITE; Detta är ryska = CharacterCode(PersonName, 1) >= 1040; TechResource = ?(Detta är ryska, StrReplace(Resource, "en_US", "ru_RU"), StrReplace(Resource, "ru_RU", "en_US")); Om TekResurs<>IE.LocationURL Sedan RootClasses = IE.Document.GetElementsByClassName("ClassName"); Om RootClasses.Length = 1 Då För varje RootClass Från RootClasses Loop Classes = RootClass.Children; Avbryta; EndCycle; AmGroup = False; RuGroup = Falskt; För varje klass från klasser Loop Om HPreg(Class.ClassName) = "dropdown-header" Då AmGroup = Find(Class.InnerText, "Americans") > 0; RuGroup = Find(Class.InnerText, "Europe") > 0; ElseIf HPreg(Class.ClassName)<>"selected" Then If AmGroup And Find(Class.All(0).InnerText, "English") > 0 OR RuGroup And Find(Class.All(0).InnerText, "Russia") > 0 Then IE.Navigate(Class) .All(1).Href); SetWaitingIE(IE); Avbryta; endIf; endIf; EndCycle; endIf; endIf; IE.Document.GetElementById("ID").Value = Personnamn; FindButton = IE.Document.GetElementById("ID"); FindButton.Focus(); FindButton.Click(); Försöker att SetExpect(IE); //Kring den mottagna datan ExceptionListNotFound.Add(Person); Fortsätta; Slutförsök; EndCycle; Exception Report("Fel:" + Symbols.PS + ErrorDescription()); Avbryta; Slutförsök; EndCycle; IE.Quit(); Slut på procedur

Svar:

Ämnet är väldigt intressant, men personligen har jag tyvärr varken erfarenhet eller ens möjlighet att på något sätt förstå detta problem. Om du kan hitta information om detta ämne, vänligen dela den.
--- En förening meddelanden, 29 april 2016 ---

Som jag förstår det finns det ingen tillgång till SQL-databasen?

--- Meddelande sammanslagning, 29 april 2016 ---

Tja, om man analyserar, vilken typ av åtkomst då?

Fråga: COM-anslutning 1C 8.3 - 1C 8.3 Är det möjligt att ange felsökaren i anslutningen


Jag ville fråga medlemmar i forumet om det överhuvudtaget är möjligt att felsöka när jag ansluter via en COM-anslutning med bearbetning från en databas på plattform 8.3.6 (BP 3.0) till den externa anslutningsmodulen i en självskriven databas (körs också på plattform 8.3.6) och anropa exporter från den procedurer med hjälp av bearbetning? Databaserna är för närvarande filbaserade och finns på en PC, men en serverversion är planerad. Fram till denna tid använde jag konstruktionerna nedan för att överföra godtycklig kod för exekvering över en COM-anslutning, samt för att logga fel. Här är fragment av procedurer i den självskrivna databasen i den externa anslutningsmodulen:

Funktion ExecuteIn(CodeExecute, Auxiliary Parameter = "") Export
Säkerhetskontroll(); // Skydd mot försök att exekvera skadlig kod vid extern uppkoppling på uppdrag av en annan användare Svar = "0" //Om inget behöver returneras, då om det inte finns några fel i koden  //returerar bara OK  //Därför att Den överförda koden kan innehålla fel, sedan avslutar vi dess exekvering i ett försök. Försök att Execute(CodeExecute); // Exekvera koden som en sträng på en annan dator via en COM-anslutning (Libra Base External Connection Module) Undantag   //om det finns ett fel, returnera sedan dess text Response = ErrorDetailView(ErrorInfo()); EndAttempt ; Returnera Svar; EndFunction Funktion TestConnection(InParameter, OutParameter) ExportSecurityCheck(); // Skydd mot försök att exekvera skadlig kod vid extern uppkoppling på uppdrag av en annan användare. OutParameter = "Det finns en anslutning till vågbasen via COM-anslutning!"; Returnera Sant ; EndFunction
Från BP 3.0 kör jag följande fragment:
Försök
Com = New COMObject("V83.COMConnector"); Connection = Com.Connect ("File=""C:\1 c\Base_1C\Libra""; Usr=""ComExchange""; Pwd=""1"";"); TellUser("Test godkänt! Det finns en anslutning till vågdatabasen"); Exception Error = ErrorDetailView(ErrorInfo()); TellUser("Det finns ingen COM-anslutning till Libra-basen! Detaljer"+Fel); Com=Odefinierad ; Lämna tillbaka ; EndAttempt ; Ut = ""; In = "1"; If Connection.Communication Test(In, Out) Then TellUser("Kommunikationstest med skalkonfiguration lyckats! Svar: "+Out); Annars TellUser("Kommunikationstestet med skalkonfigurationen misslyckades! Svar: "+Ut); EndIf ;
Jag förstår naturligtvis att det inte kommer att vara möjligt att gå in i Execute(CodeString1C8)-operatören, men finns det en sådan möjlighet när man anropar en fjärrmodulprocedur extern anslutning från huvuddatabasen Connection.TestConnections(In, Out) för att ange dess kod i samma felsökningssession i funktionen Security Check() i deras anropsprocedure?
Jag har redan tittat på dokumentationen som jag kunde hitta om det här problemet. Jag ställer in alternativen för att aktivera felsökning och brytpunkter överallt i båda konfigurationerna. Jag startade båda konfiguratorerna.
Är det ens möjligt i den här situationen att felsöka säkerhetskontrollen()-proceduren ytterligare på sidan av den externa anslutningsmodulen?

Fråga: Fel IP-adress i COM-anslutning


Det finns bearbetning som överför dokument via V83.ComConnector mellan servrar. Server 1 (1C version 8.2.19.90) ansluter alltid till Server 2 (version 8.3.8.2033). Anslutningslinjen innehöll IP-adressen till server 2 och allt fungerade bra. På själva server 1 såg jag också den installerade plattformen som på server 2, version 8.3.9.2033 (om detta är viktigt).

Problemet är att på Server 2 ändrades IP-adressen, behandlingen slutade förstås att fungera, och när jag skrev in en ny IP i anslutningsraden genererar bearbetningen ett fel, vars beskrivning fortfarande är den gamla IP-adressen (!) och texten "Ett försök att upprätta en anslutning misslyckades, eftersom det begärda svaret inte mottogs från en annan dator inom den krävda tiden, eller upprättad anslutning på grund av ett felaktigt svar från en redan ansluten dator."

De startade om allt, rensade cacher osv, admins svär att allt är ok från deras sida, man kan logga in från en server till en annan via RDP osv.

Vad kan vara fel, hur löser jag det? Jag letade över hela Internet och kunde inte hitta en sådan situation!

Svar:() 100% säker! Den andra dagen jag försöker, som jag skrev, tittar jag på det med en debugger, jag skapade till och med en dum encellsbehandling för ett anslutningstest, det felet dyker upp och det är det

Fråga: COM-anslutning till olika versioner


Hej alla.
Jag har en databas ala "Consolidation", som samlar olika data från olika databaser och samlar allt i en hög. Problemet är att du måste ansluta till dessa databaser via com, men de är olika versioner, så till slut får jag ett felmeddelande som
Anslutningsfel!(ExternalProcessing.TransferHistory.Form.Form.Form(12)) : Fel vid anrop av kontextmetoden (Connect) : Ett undantag inträffade (V83.COMConnector. 1 ): Missmatch mellan klient- och serverversioner 1 C:Enterprise Client versioner skiljer sig åt och server (8.3. 8.1964 - 8.3. 6.2332), klientapplikation: COM-anslutning

Jag satte upp en anslutning, en annan faller av...

Jag vet att du på något sätt, genom komponenttjänsten, kan skapa "dina egna klasser (anslutningar)" för varje version och sedan skapa ett nytt COM-objekt som motsvarar plattformsversionen av klassen... jag kanske har fel.

Hjälp mig att övervinna detta problem...

Svar: Det är det... Jag tar bort frågan..

Fråga: Com-fel vid bearbetning av fyllning


Hallå.
8.2 Detaljhandel 1.
Jag ansluter till 8.1 Inte en typisk konf.
Jag ansluter via com till databasen och försöker skapa ett dokument, men när jag anropar "CreateDocument()" eller "GetObject()" uppstår ett fel i proceduren BearbetningFyllning. se fig.

Jag försöker samma sak i själva 8.1-databasen, men det finns inget fel, och jag går inte heller in i Fyllningsbearbetning.
Vad kan vara fel?

Svar: turboq, en snett skriven dokumentmodul!

Tillsatt efter 5 minuter
Hon kallas inte! Hon försöker kompilera! Men eftersom dialogläget INTE FINNS när du ansluter via ComConnector, kan dokumentmodulen inte kompileras.
För sådana fall, när det är nödvändigt att implementera arbete med en dialog i en objektmodul, använd instruktioner till förprocessorn

Detta är inte ditt misstag, utan ett fel i dokumentmodulen i databasen du ansluter till.

I databasen exekveras koden på klienten och det finns ett dialogläge, så allt sker utan fel

Använd inte ComConnector, V8.Application för anslutning, då kommer gränssnittssaker att vara tillgängliga för dig

Tillsatt efter 5 minuter
=======================================================================================================================
från beskrivningen av den externa anslutningen (SP) Jag markerade med fet stil vad du bör läsa om ComConnections

Beskrivning:

I allmänhet liknar det att arbeta med 1C:Enterprise 8 via en extern anslutning som 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-applikation, och i fallet med en extern anslutning startas en relativt liten COM-server under process.
  • Ej tillgängligt när du arbetar via en extern anslutning funktionalitet, på ett eller annat sätt relaterat till organisationen av 1C:Enterprise 8-användargränssnittet;
  • När du kör en extern anslutning kan den hanterade applikationsmodulen (modul regelbunden tillämpning) konfiguration 1C:Enterprise 8. Dess roll när man arbetar med en extern anslutning spelas av den externa anslutningsmodulen.
När du använder en extern anslutning finns det följande fördelar jämfört med att använda en automationsserver:
  • Snabbare anslutningsinstallation eftersom ingen separat process behöver skapas operativ system, och alla åtgärder utförs inom anropsprocessen;
  • Snabbare åtkomst till egenskaperna och metoderna för 1C:Enterprise-objekt, eftersom att organisera en åtkomst inte kräver kommunikation mellan processer;
  • Mindre förbrukning av operativsystemresurser.
För att organisera åtkomst till 1C:Enterprise 8-data via en extern anslutning, utförs följande sekvens av åtgärder:
  • en COM-anslutningshanterare skapas, med hjälp av vilken anslutningen upprättas;
  • ett anrop görs till Connect-metoden för COM-anslutningshanteraren. Connect-metoden returnerar en yttre anslutning med informationsbas 1C:Företag 8;
  • genom en extern anslutning görs åtkomst till giltiga metoder, egenskaper och objekt för den infobas som anslutningen upprättas med.
Viktig! På grund av bristen på ett användargränssnitt kan inte alla objekt, egenskaper och metoder användas i en yttre anslutning.
Den yttre sammanfogningen ger full tillgång till sitt globala sammanhang. Därför kan en extern anslutning som dess metoder ha: systemkonstanter, värden för objekt specificerade i konfiguratorn, åtkomst till vilka utförs med hjälp av chefer (till exempel konstanter, uppräkningar, kataloger, dokument, dokumentloggar, rapporter , bearbetning, planer för egenskapstyper, kontoplaner, beräkningstypsplaner, register), samt variabler som deklareras i den externa anslutningsmodulen med nyckelordet Export.

Tillgänglighet:

Integration.

Fråga: COM-anslutning, egenskaper typplan


Uppgiften är att programmatiskt skapa ett nytt element i en känd plan av karaktäristiska typer via en COM-anslutning. Anslutningen är etablerad, allt är bra här.

Jag skriver så här:

TypeDescriptionTech = New TypeDescription("DirectoryLink. Motparter"); PurposeProperties = Anslutning. Planer för typer av egenskaper. Ändamål med egenskaper för kategorier av objekt. FindByName("Katalog "Enskilda personer""); NewElement = Anslutning. Planer för typer av egenskaper. Objektegenskaper. CreateItem(); NewElement. Namn = PropertyName; NewElement. PropertyAssignment = PropertyAssignment; NewElement. ValueType = DescriptionTypesTech;

Den sista raden fungerar inte. Och detta är förståeligt, den hittar en sådan typ för databasen där 1C körs, men jag behöver en typ för den bifogade databasen. Hur man får det?

I min version skapas helt enkelt ett element med värdetypen "Custom List". Det fungerar i princip, men är på något sätt fult.

Plattform 8.3. En COM-anslutning är en förutsättning. Lösningar utan användning är inte av intresse.

Svar:

Rullar. Tack, det fungerade.

Fråga: COM-anslutning. Fråga med parameterproblem


God dag.
Problem med begäran via COM-anslutning.

Perem TK; ArrayItems = COM.NewObject("Array"); För varje rad från TKNomenclature Cycle Nomenclature = COM.Directories.Nomenclature.GetLink(COM.NewObject("UniqueIdentifier", Abbr(String.Nomenclature.Identifier))); Nomenclature Array.Add(Nomenclature); EndCycle; If ArrayItems.Quantity()<>0 Då Request = COM.NewObject("Request"); Request.Text = "VÄLJ |PricesItemsSliceLast.Commodities AS Nomenclature, |PricesItemsSliceLast.SalePrice AS Price, |PricesItemsSliceLast.RateVAT, |PricesItemsSliceLast.RateNP |FROM |RegisterInformation.PriceDoc. Priser |Och Inventering Inventering B ( &Array of Nomenclature) |Och inventering och material.ThisGroup = FALSE |Och Registrar LINK Document.Ställa in försäljningspriser) AS NomenclaturePricesSliceLast"; Request.SetParameter("Item Array", Item Array); Request.SetParameter("DataDoc", EndDay(ParametersStructure.DataDoc)); Request.SetParameter("PriceType", COM.Directories.PriceTypes.GetRef(COM.NewObject("UniqueIdentifier", ParameterStructure.PriceType.Identifier))); TZ = COM.NewObject("Värdetabell"); TK = Request.Run().Upload(); Annars TK = New ValueTable; TK.Columns.Add("Nomenklatur"); TK.Columns.Add("Pris"); TK.Columns.Add("Procentandel"); TK.Columns.Add("momssats"); endIf;

Problemet är just med artikeln eller en array av artiklar; om du ställer in dem som en parameter returnerar begäran tomma priser; om du inte anger denna parameter alls, returnerar begäran korrekt data.
I frågekonsolen för samma externa databas bearbetas allt utan problem.
Vad kan vara fel?

Svar:

Försök att göra det genom VremTable. Skapa en värdetabell med kolumner resp. som, fyll i det, dra in det i begäran och tillämpa det sedan med en intern anslutning.

Fråga: Com-koppling från fildatabas till fildatabas


God morgon. Jag har en fildatabas 8.3, från vilken jag försöker ansluta till en annan fildatabas med en com-anslutning:

Directory = "C:\Users\1C\Workflow (test)"; Användare = "Administratör"; Lösenord = ""; Anslutningsparametrar = "File="+Katalog+";Usr="+Användare+";Pwd="+Lösenord+";"; V83 = New COMObject("V83.COMConnector"); Försök att ansluta = V83.Connect(ConnectionParameters); Exception Report("Kunde inte ansluta till dokumentflödet!"); Slutförsök;


Ett undantag kastas, utan en felbeskrivning.
Båda databaserna tvingas starta i 8.3. Katalogen och användaren är korrekt specificerade. Vad kan orsaken vara?

Svar:

Jag skriver raden med kod V82 = New COMObject(" V83.COMConnector"); och resten av koden är enligt nedan, utan ändringar.

När versionerna av käll- och målplattformarna är olika uppstår ett fel.

Det är inte klart vilken version av biblioteket som ska registreras och var det ska registreras?

Jag tror att jag måste registrera biblioteket, version 8.2.18.61, och jag gör detta via en bat-fil

regsvr32 /n /i:user "C:\Program Files (x86)\1cv82\8.2.18.61\bin\comcntr.dll"
paus

msk-test1c:1641 -- detta är server 8.3.5.1098
V82 = New COMObject("V82. COMConnector"); Rapport ("Anslut till redovisning 3.0..."); Anslutningsförsök = V82. Connect("srvr = ""msk- test1c:1641""; ref = ""db_test""; usr = ""Administratör""; pwd = ""123"""); Meddela ("Hurra anslutning upprättad!"); Exception Report("Ingen anslutning till databasen!"); Report(ErrorDescription()); // Info = InformationAboutError(); // Rapport("Beskrivning= "" + Info.Description + """); // Rapport ("Modulnamn= "" + Info.ModuleName + """); // Report ("LineNumber=" + Info.LineNumber); // Report ("SourceLine= "" + Info.SourceString + """); Return; EndAttempt;

Var registrerar man biblioteket, på klienten, på 8.2-servern, på 8.3-servern? Bild nedan.
(för klient-serverversionen och för filversionen av 1C-databasen)

Svar: Det fanns en uppgift att kommunicera med en terminal via en webbtjänst. Basen är, ja, låt oss säga lätt. Också 0,5 eller snabbare?

Det är svårt att säga – jag har inte tillräckligt med data. Vi var nöjda med 0,5 sekunder, minus den onödiga 1C-klienten på en tredjepartsmaskin, minus synkronisering av biblioteksversioner efter uppdatering av 1C-motorn, minus den förbannade comsafearrayen, normala namn och fälttyper... Han tänkte på oss från den andra sidan (ett system som integrerar med 1C) "de kommer inte att förstå" när det visar sig att de behöver skriva om sina 1C-anrop till en ny "systemkommunikationsmodell". Men efter att ha provat en funktion en gång i testdatabasen, retas vi nu med "låt oss byta till tjänsten så snart som möjligt."

Fråga: Hur använder man TypeContains för Com-objekt?


Om Attribute.Type.ContainsType(Type("DirectoryLink.Nomenclature")) Then There IsNomenclature = True; endIf;

"Props" togs emot från en com-anslutning med en annan 1c-databas. Ett fel uppstår när man jämför:

(ExternalProcessing.Coefficient Recalculation.Form.Form.Form(183)): Fel vid anrop av kontextmetoden (ContainsType)
Om Attribute.Type.ContainsType(Type("DirectoryLink.Nomenclature")) Då
Därför att:
Ett undantag inträffade (1C:Enterprise 8.3.8.1964): Typfel överensstämmer (parameternummer "1")

Jag misstänker att det ska jämföras med typen i com? Hur kontrollerar man typen korrekt?

Svar:

Den rullar inte. Jag löste problemet så här:
I mottagardatabasen i den allmänna modulen med kryssrutan för extern anslutning markerad är koden:

Funktion CheckAttributeType(Attribute, Type) Export Return Attribute.Type.ContainsType(Type(Type)); EndFunction

I databasen som jag ansluter från kallar jag proceduren via Com:

ComConnection.Avis_ExchangeProcedures.CheckAttributeType(Attribute, "DirectoryLink.Nomenclature")

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. Detta är ole-anslutningar V83.Ansökan och com-anslutningar V83.COMConnector . I fall att 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. I synnerhet att arbeta med formulär och vanliga moduler för vilka 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 = "Det gick inte att ansluta till databasen" + DescriptionErrors(); Meddelande . Att rapportera();
EndAttempt ;

Urkoppling

Anslutning = Odefinierad;
För objekt V83.Ansökan Det är nödvändigt att avsluta anslutningen, annars kvarstår en ofullständig session, som sedan måste raderas manuellt. I fall att V83.COMConnector anslutningen bryts automatiskt när proceduren som anslutningen gjordes i. 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:

För V83.COMConnector

RequestCOM = Anslutning. NewObject( "Begäran") ;
TableCOM = Anslutning. NewObject( "Värdetabell") ;
ArrayCOM = Anslutning. NewObject(“Array”) ;

ViewCOM =Anslutning.NewObject

För V83.Ansökan

RequestOLE = Anslutning. NewObject(“ Begär") ;
TableOLE = Anslutning. Nytt objekt("Värdetabell") ;
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. Springa();
Prov = Resultat. Välj () ;
Hejdå urval. Nästa()Cykel
EndCycle ;
Du kan också använda konfigurationsobjekthanterare:
DirectoryCOM = Anslutning. Kataloger. Katalognamn;
DocumentCOM = Anslutning. Dokumentation. Dokument namn;
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 enkel. 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 Sedan Report("EnumerationValue2");

endIf;

Hämta ett objekt via COM med identifierare

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

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

Ett sätt att överföra data från en 1C-konfiguration till en annan är en mjukvaruanslutning med 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. Detta problem kan lösas med hjälp av rutinuppgifter som utförs när det inte finns några aktiva användaranslutningar till informationsbasen.

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

  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"""; AnslutningsparametrarClientServerIB = "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", som du kommer att arbeta med för att erhålla nödvändiga 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 av en enkel typ - en sträng, och divisionen kommer att vara en länk till katalogelementet "Enterprise Structure". Resultatet av frågan är en tabell med de listade fälten av den typ som de finns i databasen till vilken COM-anslutningen skedde. Om du behöver konvertera dem till andra typer, använd standardplattformsfunktionerna:

  • Linje();
  • Siffra();
  • Datum för().
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>

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:

  1. Snabbare upprättande av anslutning, eftersom det inte finns något behov av att skapa en separat operativsystemprocess, och alla åtgärder utförs inom anropsprocessen;

  2. Snabbare åtkomst till egenskaperna och metoderna för 1C:Enterprise-objekt, eftersom att organisera en åtkomst inte kräver kommunikation mellan processer;
  3. 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:

  1. 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.

  2. När du arbetar via en COM-anslutning är funktionalitet på ett eller annat sätt relaterad till organisationen av 1C:Enterprise 8.0-användargränssnittet inte tillgänglig;
  3. När du använder en COM-anslutning används inte 1C:Enterprise 8.0-konfigurationsapplikationsmodulen. 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 länk till ett COM-anslutningsobjekt med infobasen 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 som definieras i en extern kopplingsmodul med nyckelordet 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 måste det omges av dubbla citattecken (").

Vanliga parametrar:

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

Följande parameter är definierad för filversionen:

Fil - infobaskatalog.

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

Srvr - 1C: Enterprise servernamn;
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

En COM-anslutning till 1C:Enterprise-infobasen ger full åtkomst till dess globala kontext (se "Kontext för programmodulexekvering"). 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 en NewObject-metod som kan användas för att skapa värden av vissa typer.

tk = 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. Detta objekt stöder rapportbyggarfunktionalitet som inte är relaterad till att mata ut en rapport till ett kalkylarksdokument och andra uppgifter relaterade till användargränssnitt. Detta objekt kan användas på 1C:Enterprise-servern och i en COM-anslutning.

Du kan använda 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.

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. I den här artikeln kommer vi att titta på exempel på denna typ av anslutning. Exemplen använder plattform 8.2.

Du kan skapa två typer av COM-objekt för 1C-applikationen. Detta V82.Ansökan Och V82.COMConnector. I fall att V82.Ansökan En nästan fullfjädrad kopia av 1C-applikationen lanseras. vid användning V82.COMConnector En liten serverdel lanseras.
Driftshastigheten i detta fall är högre, men vissa funktioner kanske inte är tillgängliga. I synnerhet att arbeta med formulär och vanliga moduler för vilka egenskapen att arbeta med externa anslutningar inte är inställd. För det mesta ska du använda V82.COMConnector och endast vid bristande funktionalitet V82.Ansökan. Skillnaden i driftshastighet kan vara särskilt märkbar på databaser med stora volymer.

Så låt oss börja

  1. Låt oss skapa ett COM-objekt
    • För V82.Ansökan Connection = New COMObject("V82.Application" ) ;
    • För V82.COMConnector Connection = New COMObject("V82.COMConnector" ) ;
  2. Låt oss skapa en anslutningssträng
    • för serverversionen av databasen ConnectionString = "Srvr = " "Servernamn" ";Ref = " "Basnamn" ;
    • för filversionen av databasen ConnectionString = "File = " "PathKBase" "; Usr = Användarnamn; Pwd = Lösenord";
  3. Ansluter till databasen Anslutningsförsök = Anslutning. Connect(ConnectionString) ; Exception Message = New MessageToUser; Meddelande. Text = + ErrorDescription() ; Meddelande. Att rapportera() ; EndAttempt ;
  4. Kopplar bort från databasen Anslutning = Odefinierad;

    För objekt V82.Ansökan Det är nödvändigt att avsluta anslutningen, annars kvarstår en ofullständig session, som sedan måste raderas manuellt. I fall att V82.COMConnector anslutningen bryts automatiskt när proceduren som anslutningen gjordes i. 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.

Låt oss nu lägga ihop all kod

Connection = New COMObject("V82.Application" ) ; //Anslutning = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "File = ""С:\MyBase""; Usr = Petya; Pwd = 123"; Anslutningsförsök = Anslutning. Connect(ConnectionString) ; Exception Message = New MessageToUser; Meddelande. Text = "Kunde inte ansluta till databasen"+ DescriptionError() ; Meddelande. Att rapportera() ; EndAttempt ; Anslutning = Odefinierad;

För anslutningstyp V82.Ansökan metoden används för COM-objektet som skapades initialt, och för V82.COMConnector metoden tillämpas på anslutningen. fortsatt arbete med begäran fortsätter standardmedel 1C. i koden ser det ut så här:

Begäran = Anslutning. NewObject("Request" ) ; // För V82.COMConnector Begäran = Anslutning. NewObject("Request" ) ; // För V82.Ansökan Begäran. Text = "VÄLJ | Organisationers positioner. Kod, | Organisationers positioner.Namn|FRÅN | Katalog. Positions of Organisations AS Positions of Organisations"; Resultat = Begäran. Springa(); Prov = Resultat. Välj() ; Hejdå urval. Next() Loop EndLoop ;

För version 1C:Enterprise 8.3 förblir allt oförändrat förutom att när du skapar COM-objekt måste du använda "V83.COMConnector" eller "V83.Applikation".




Topp