1c 8 com-tilkobling. V8: COM-tilkobling. Hvordan holder vi COM-tilkoblingen aktiv?


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

Når den brukes for å få tilgang til data 1C: Enterprise 8.0 COM-tilkobling, er det følgende fordeler sammenlignet med å bruke automatiseringsserveren:

  1. Raskere tilkoblingsetablering, siden det ikke er behov for å opprette en separat operativsystemprosess, og alle handlinger utføres i anropsprosessen;

  2. Raskere tilgang til egenskapene og metodene til 1C: Enterprise-objekter, siden organiseringen av samtalen ikke krever organisering av kommunikasjon mellom prosesser;
  3. Mindre forbruk av operativsystemressurser.

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

  1. Når det gjelder automatiseringsserveren, startes en fullverdig 1C: Enterprise 8.0-applikasjon, og i tilfelle en COM-tilkobling startes en relativt liten COM-server i prosessen.

  2. Når du arbeider via en COM-tilkobling, er funksjonalitet ikke tilgjengelig på en eller annen måte relatert til organiseringen av brukergrensesnittet til 1C: Enterprise 8.0;
  3. Når COM-tilkoblingen fungerer, brukes ikke 1C: Enterprise 8.0-konfigurasjonsmodulen. Dens rolle når du arbeider med en COM-tilkobling spilles av en ekstern tilkoblingsmodul.

1.1 Prosedyre for å etablere en COM-forbindelse

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

  1. et COM-objekt med V8.COMConnector-identifikatoren opprettes, ved hjelp av hvilken forbindelsen opprettes;

  2. Connect-metoden til det tidligere opprettede V8.COMConnector-objektet kalles. Connect-metoden returnerer en referanse til et COM-tilkoblingsobjekt med en 1C: Enterprise 8.0 infobase;
  3. det oppnådde COM-tilkoblingsobjektet brukes til å få tilgang til de tillatte metodene, egenskapene og objektene til infobasen som tilkoblingen er etablert med.

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 tilgjengelig fra utsiden via en COM-tilkobling:

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

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

  4. Inkluderer og ekskluderer fragmenter av vanlige moduler som bruker forprosessoren
  5. Den globale konteksten til 1C: Enterprise 8.0, bortsett fra objekter som er strengt 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 prosedyrebehandlere for hendelsene EventsSystemStarting () og SystemCompletion (), der handlingene som utføres under henholdsvis initialisering og avslutning av tilkobling kan plasseres.

Prosedyrer, funksjoner og globale variabler definert i den eksterne koblingsmodulen med eksportnøkkelordet blir, som i tilfellet med applikasjonsmodulen, en del av den globale konteksten.

1.3 Vanlige moduler

For vanlige moduler introduseres egenskapene "Client", "Server" og "ExternalConnection". De er ment å definere 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-infobasen. Et ubegrenset antall tilkoblinger kan opprettes med en enkelt 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.

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

IB-forbindelsesstrengen er en kjede av fragmenter av formen Parameter = Verdi. Fragmenter er atskilt fra hverandre med ";"-symboler. Hvis verdien inneholder mellomrom, må den være omgitt av doble anførselstegn (").

Vanlige parametere:

Usr - brukernavn;
Pwd - passord.

Parameteren er definert for filvarianten:

Fil - infobasekatalog.

For klient-serverversjonen er parametrene definert:

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

Connect-metoden etablerer en COM-forbindelse med 1C: Enterprise 8.0-infobasen og returnerer en referanse til COM-tilkoblingsobjektet.

// Oppretter et koblingsobjekt
V8 = Nytt COMObject ("V8.COMConnector");
// opprett et COM-tilkoblingsobjekt
Connection = V8.Connect ("File =" "c: \ InfoBases \ Trade" "; Usr =" "Director" ";")

1.5 Objekt "COM-tilkobling"

COM-tilkobling med 1C: Enterprise infobase gir full tilgang til sin globale kontekst (se "Kontekst for utførelse av programmodul"). Derfor kan en COM-forbindelse ha som sine metoder: systemkonstanter, verdier av objekter spesifisert i konfiguratoren, tilgang til disse utføres ved hjelp av ledere (for eksempel konstanter, oppregninger, oppslagsbøker, dokumenter, dokumentjournaler, rapporter, behandling, diagram over karakteristiske typer, plankontoer, diagrammer over beregningstyper, registre), samt variabler deklarert i den eksterne koblingsmodulen med Eksporter nøkkelordet.

I tillegg har COM-tilkoblingen en ekstra NewObject-metode som du kan bruke til å lage verdier av spesifikke typer.

tz = Tilkobling. NewObject ("verditabell");

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

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

1.6. Funksjoner ved å jobbe med COM-tilkobling

I automatisering og i COM-forbindelsen har TRUE og FALSE verdiene ​​hhv -1 (minus en) og 0.

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

Et nytt QueryBuilder-objekt er implementert, designet for å generere spørringstekster basert på de angitte innstillingene. Dette objektet støtter funksjonaliteten til rapportbyggeren, som ikke er relatert til utdata fra en rapport til et regnearkdokument og andre oppgaver relatert til brukergrensesnittet. Dette objektet kan brukes på 1C: Enterprise-serveren og i en COM-forbindelse.

Bruk av COM-objekter er tilgjengelig når det innebygde språket kjører på 1C: Enterprise-serveren.

COM-feil konverteres til innebygde språkunntak.

Hvis konfigurasjonen prøver å opprette et ugyldig objekt, for eksempel et regnearkdokument, i en ekstern tilkoblingsmodul, i en fellesmodul eller i en objektmodul, kan det hende at COM-forbindelsen ikke opprettes eller kan bli avbrutt som et unntak.

Skriv ut (Ctrl + P)

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

com-tilkobling

Du kan lage to typer COM-objekter for en 1C-applikasjon. Det er en oleforbindelse V83.Søknad og com-tilkoblinger V83.COMConnector ... I tilfelle V83.Søknad nesten en fullverdig forekomst av 1C-applikasjonen lanseres. Ved bruk V83.COMConnector en liten serverdel starter opp. Driftshastigheten er høyere i dette tilfellet, men noen funksjoner er kanskje ikke tilgjengelige. Arbeid spesielt med skjemaer og med vanlige moduler der egenskapen til å arbeide med eksterne skjøter ikke er satt. Stort sett må du bruke V83.COMConnector og kun ved manglende funksjonalitet V83.Søknad... Forskjellen i hastighet kan være spesielt merkbar på store databaser. For plattform brukes 8.2 V82.Application eller V82.COMConnector

Etabler OLE-forbindelse

Tilkobling = Nytt COMObject ("V83.Application");

Etabler COM-forbindelse

Tilkobling = Nytt COMObject ("V83.COMConnector");

Tilkoblingsstreng

// For klient-server-alternativ
StringConnection= “Srvr =“ “ServerName” “; Ref =“ “BaseName”;
// For filmodusalternativet:
StringConnection= "Fil =" "Bi til base" "; Usr = Brukernavn; Pwd = Passord ";
Forsøk
Tilkobling = Tilkobling ... Koble(ConnectionString);
Et unntak
Melding = Ny melding til bruker;
Beskjed ... Tekst = "Kunne ikke koble til basen" + Beskrivelsesfeil (); Beskjed ... Å melde();
Slutt på forsøk;

Koble fra

Tilkobling = Udefinert;
For objekt V83.Søknad det er viktig å avslutte forbindelsen, ellers vil en uferdig økt henge, som deretter må slettes manuelt. I tilfelle V83.COMConnector tilkoblingen avsluttes automatisk på slutten av prosedyren som tilkoblingen ble opprettet i. Og det er et lite øyeblikk til. For brukeren som tilkoblingen gjøres under, må avkrysningsboksen "Be om bekreftelse ved lukking av programmet" i innstillingene være deaktivert.

NewObject () metode

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

til V83.COMConnector

RequestCOM = Tilkobling. NewObject ( "Forespørsel") ;
TableCOM = Tilkobling. NewObject ( "Verditabell") ;
ArrayCOM = Tilkobling. NewObject ("Array");

WidCOM = Connection.NewObject

til V83.Søknad

RequestOLE = Tilkobling. NewObject (" Forespørsel") ;
Tabell OLE = Tilkobling. Nytt objekt("Verditabell") ;
ArrayOLE = Connection.NewObject("Array");
WidCOM = Connection.NewObject("UniqueIdentifier", StringUID);

RequestCOM ... Tekst ="PLUKKE UT
| Organisasjoners posisjoner. Kode,
| Organisasjoners posisjoner.
| FRA | Directory.Organisasjoners posisjoner
AS-posisjoner for organisasjoner ”;

Resultat = RequestCOM. Løpe ();
Prøve = Resultat. Plukke ut () ;
Under prøvetaking. Neste()Syklus
Slutt på syklus;
Du kan også bruke konfigurasjonsobjektbehandlerne:
ReferenceCOM = Tilkobling. Referanse bøker. Katalognavn;
DocumentCOM = Tilkobling. Dokumentasjon. Dokumentnavn;
Registrer COM = Tilkobling. Informasjonsregistre... Registernavn;

Hente og sammenligne en enum over en COM-tilkobling

For å sammenligne verdiene til oppregningselementer definert i konfigurasjonen, er det nødvendig å konvertere disse elementene til en av de primitive typene, hvis sammenligning ikke er vanskelig. Disse typene kan være enten numeriske eller strengtyper. Du kan konvertere verdien av et oppregningselement til en numerisk type som dette

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

PossibleValues ​​= EnumerationElement.Metadata (). EnumerationValues;

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

Hvis EnumerationElementNumber = 0 Rapporter ( "EnumerationValue1");

ElseIf EnumerationElementNumber = 1 Deretter Rapport ("EnumerationValue2");

Slutt om;

Få et objekt via COM etter identifikator

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

Da får vi den unike identifikatorstrengen:

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

ID = Ny U unik ID (StringUID);
MED linkBy ID = Dokumenter [Dokumentnavn] .GetLink (ID);

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

WidCOM = Connection.NewObject("UniqueIdentifier", StringUID);
ReferenceById = Connection.Dokumenty [Dokumentnavn] .GetLink (UIDCOM);

For utveksling av informasjon mellom to infobaser uten uvedkommende opplastinger og utvekslingsfiler, er det ingenting bedre enn en COM-forbindelse. Og det er vanskelig å argumentere med dette, fordi bruk av denne typen tilkobling er ganske enkel og stabil. Men i og i denne mekanismen er det en flaskehals og et ubehagelig sted - tiden for å etablere en forbindelse med en annen base. I noen tilfeller kan den nå tilstrekkelig store verdier, dvs. være veldig lang.

Hva er i veien?

I øyeblikket for tilkobling via en COM-forbindelse, laster basen som skal tilkobles fullstendig konfigurasjonen til basen som vi kobler til. Etter å ha prøvd for eksempel å koble til "Enterprise Accounting"-databasen, ville trykket på ventetiden ha vart lenge nok, siden volumet av konfigurasjonen utgjør hundrevis av megabyte. Det blir klart at alle tilkoblinger må bufres og vedlikeholdes for raskere ytelse.

Ytelsesanalyse

La oss spørre oss selv om det i det hele tatt er nødvendig å cache tilkoblinger og om det vil bære frukter med intensivt brukerarbeid med en COM-tilkobling. La oss måle tilkoblingstiden til en 20 KB konfigurasjon.

Vi kan se at det tok 3,5 sekunder å koble til en liten database. Ved tilkobling til en større database vil tiden øke flere ganger.

Når du lagrer en støttet tilkobling, vil disse trinnene ta flere størrelsesordener kortere tid.

Hvordan holder vi COM-tilkoblingen aktiv?

Problemet er at 1C-plattformen ikke gir standard midler for lagring av COM-forbindelser i informasjonssikkerhet. Det gir ingen mening å bevare sammenhengen i oppslagsverk og dokumenter, siden den ofte kan endre seg. Det mest lovende alternativet er å lagre tilkoblingen i en sesjonsparameter. Men selv her er ikke alt så glatt. Tross alt er det ingen passende datatype for å lagre en COM-tilkobling.

Disse betraktningene fører til det faktum at lagring kun er mulig på klienten i en eller annen variabel. La oss vurdere alternativet for et administrert skjema. Det er nødvendig å initialisere i form av en variabel med & OnClient-direktivet, hvor vi vil lagre tilkoblingsverdiene. Følgelig kan denne forbindelsen også kalles bare på klienten, siden du ikke kan overføre et COM-objekt fra klienten til serveren. For vanlige skjemaer er det ingen skille mellom server og klient, og denne mekanismen blir enda enklere. Husk å koble fra før du lukker skjemaet du bruker for å forhindre minnelekkasjer.

I stedet for utgang

Selv om denne ordningen løser noen ytelsesproblemer, er den langt fra ideell. Hvert skjema, der det vil være nødvendig å opprettholde en COM-forbindelse, vil opprette en ny sesjon i mottakerens infobase, og følgelig vil flere lisenser være nødvendig. En av hovedulempene er også utelukkelsen av støtte for tilkoblingen på serveren

Den neste artikkelen vil se på en bedre måte som eliminerer disse problemene (tilkobling via webtjenester).

Hei Habravchans!

I denne artikkelen ønsker jeg å snakke om hvordan integrasjonen med 1C-plattformen etableres i min organisasjon. Den nesten fullstendige mangelen på teknisk informasjon om dette emnet fikk meg til å gjøre dette. Når du leser forskjellige artikler og rapporter om emnet å koble 1C til et hvilket som helst informasjonssystem, blir du om og om igjen overbevist om at de alle er markedsførings-, demonstrasjons- og aldri tekniske, og gjenspeiler problemet og essensen av løsningen.

Jeg advarer deg om at metoden på ingen måte hevder å være universell. Siden det er mange 1C-konfigurasjoner selv, og det er enda flere informasjonssystemer, språk og plattformer, er antallet mulige kombinasjoner enormt. Målet mitt er å demonstrere en av de mulige løsningene.


Jeg valgte Python som språket som skal integreres med 1C. Den egner seg veldig godt for prosessautomatisering. Dette tilrettelegges av den minimalistiske syntaksen (koden skrives veldig raskt), det rike standardbiblioteket (mindre behov for tredjepartsmoduler), på tvers av plattformer - med høy sannsynlighet vil koden skrevet i Linix OS fungere vellykket på Windows.

Til å begynne med vil jeg skissere dataene vi skal jobbe med. Organisasjonen - et energisalgsselskap i Fjernøsten-regionen - betjener omtrent 400 tusen abonnenter, 1C basert på en selvskrevet konfigurasjon. For hver abonnent lagres hans betalinger, gebyrer, forbrukte tjenester og beregningsordninger, måleenheter, avlesninger og mange andre data.

En gang i organisasjonen var det et program skrevet i Delphi og brukte MSSQL / Firebird som database. I disse strålende tider var det mulig å koble til databasen ved å bruke et hvilket som helst språk og utføre mange handlinger - velg debitorabonnenter, post betalinger mottatt, registrer instrumentavlesninger. Ikke overraskende vokste samlingen av skript som automatiserer rutinen jevnt og trutt. Programmerere kan utføre enhver handling uten å åpne selve programmet.

Dessverre, med overgangen til 1C, tok freebie-en slutt - det var ikke lenger mulig å koble til basen direkte. Generelt er selve 1C-plattformen udelelig og passer dårlig for integrasjon med andre systemer. Hun, som de sier, er en ting for seg selv. Når du laster data inn i 1C, bør det huskes at det ikke vil være så lett å trekke dem ut derfra. Men med tanke på at organisasjonen trengte å implementere betalingssystemer og en personlig konto, var det nødvendig å finne en slags løsning.

De viktigste oppgavene jeg sto overfor var muligheten til raskt å skaffe data på en spesifikk personlig konto - navn, adresse, måleenheter, instrumentavlesninger, betalinger, gebyrer. Pluss dannelsen av dokumenter - en forsoningshandling, en betalingskvittering. Så det er ingen direkte forbindelse til databasen - alle som så på 1C-databasen på SQL-serveren så at det var vanskelig å forstå massen av tabeller i formen aaa1, aaa2. Og å bygge spørringer med slike navn på tabeller og felt er rett og slett urealistisk. I tillegg er mange 1C-tabeller (spesielt de viktigste, for eksempel et kutt av sistnevnte, rester og omdreininger) virtuelle og spredt over forskjellige fysiske tabeller, samlet av flere sammenføyninger. Denne metoden er ikke egnet.

1C-plattformen gir muligheten til å koble til den via en COM-tilkobling. Som mange Windows-programmer, under installasjonen av 1C, er to COM-objekter registrert i systemet - Automation Server og COM Connector. Du kan arbeide med begge objektene ved å bruke et språk som støtter COM-teknologi.

Automation Server-objektet er en 1C-applikasjon som nesten ikke er forskjellig fra en vanlig klientapplikasjon. Forskjellen er at det i tillegg blir mulig å programmere styre applikasjonsforekomsten. Når du arbeider med COM Connector-objektet, lanseres en lett versjon av 1C-applikasjonen, der skjemaer, samt funksjoner og metoder knyttet til grensesnittet og visuelle effekter, ikke er tilgjengelige. Selve applikasjonen startes i modusen "Ekstern tilkobling". Initialisering av globale variabler (for eksempel å definere gjeldende bruker og hans innstillinger) bør utføres i den eksterne tilkoblingsmodulen 1C. Hvis det i ekstern tilkoblingsmodus i koden kalles en funksjon som ikke er tilgjengelig i denne modusen, vil det oppstå et unntak (som vil bli sendt til python-skriptet vårt). Anrop av usikre funksjoner bør være omgitt av konstruksjoner som

# Hvis IKKE OuterConnection Så Advarsel ("Hallo!"); #Slutt om

Siden arbeid med COM-objekter er en teknologi som utelukkende kun er for Windows, er det ikke overraskende at den er fraværende i standard Python-pakken. Du må installere en utvidelse - et sett med moduler som gir all nødvendig funksjonalitet for programmering under Windows i Python. Det kan lastes ned som et allerede montert exe-installasjonsprogram. Selve utvidelsen gir tilgang til registeret, tjenester, ODBC, COM-objekter, etc. Alternativt kan du umiddelbart installere ActiveState Python-distribusjonen, som kommer med Win32-utvidelsen ut av esken.

I noen tid eksperimenterte jeg med COM-tilkobling i utviklingen av webapplikasjoner, spesielt min personlige konto. Følgende ulemper ble identifisert:

COM-tilkoblingen er treg. Dårlig ytelse er en kjent ulempe ved COM-teknologi.
- Prosessen med å etablere en forbindelse med 1C, avhengig av konfigurasjonen, kan ta fra 1 til 8 sekunder (i mitt tilfelle, 6 sekunder). Unødvendig å si at etablering av en tilkobling for hver forespørsel vil resultere i at hver side lastes inn i 8 sekunder.
– Siden nettapplikasjoner i Python fungerer som uavhengige servere, kan det forrige punktet kompenseres for ved å lagre tilkoblingen i en eller annen global variabel og, i tilfelle feil, gjenopprette den. For å være ærlig har jeg ikke tenkt på hvordan jeg kan opprettholde en tilkobling i PHP.
– Tverrplattformfunksjonaliteten til webapplikasjonen går tapt.

Basert på punktene som er oppført ovenfor, ble det besluttet å endre samhandlingsprinsippet, dele det inn i 2 deler - den første plattformavhengig (Windows), lossing av 1C-data i et praktisk format, og den andre, plattformuavhengig, i stand til å jobber med data uten å mistenke noe om 1C i prinsippet.

Handlingsstrategien er som følger: python-skriptet kobles til 1C, utfører de nødvendige spørringene og laster opp dataene til SQLite-databasen. Du kan koble til denne databasen fra Python, PHP, Java. De fleste av prosjektene våre fungerer i python, og siden jeg hater å skrive rå SQL-spørringer for hånd, gjøres alt arbeid med SQLite-databasen gjennom SQLAlchemy ORM. Det var bare nødvendig å beskrive databasens datastruktur i en deklarativ stil:

Fra sqlalchemy.ext.declarative import declarative_base fra sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeB, ForeignKey Base = declarative_base () klasse Abonent (Base): __tablename__ = "abonents"_ (nøkkel-id = primære kolonne,_ True) konto = Kolonne (Unicode (32), indeks = True) kode = Kolonne (Unicode (32)) adresse = Kolonne (Unicode (512)) fio = Kolonne (Unicode (256)) kilde = Kolonne (Unicode (16) ) psu = Kolonne (Unicode (256)) tso = Kolonne (Unicode (256)) np = Kolonne (Unicode (256)) street = Kolonne (Unicode (256)) hus = Kolonne (heltall) flat = Kolonne (heltall) mro = Kolonne (Unicode (256)) klasse Betaling (Basis): __tabellnavn__ = "betalinger" # og så videre ...

Nå er det nok å importere denne modulen til et hvilket som helst python-prosjekt, og du kan jobbe med data.

Jeg forutser spørsmålet ditt - "hvorfor SQLite"? Hovedårsaken er at databasen er skrivebeskyttet, så problemer med å skrive til SQLite bør ikke bekymre oss. For det andre er formatet til denne DBMS praktisk - det er mer praktisk å se det (det er mange gratis verktøy, inkludert en super-utvidelse for FireFox). For det tredje var det i noen tilfeller nødvendig å få tilgang til abonnenter fra de maskinene som ikke har forbindelse til MySQL-serveren. I dette tilfellet er det nok å kopiere SQLite-databasefilen, og denne maskinen vil ha tilgang til all informasjon.

Lossing skjer en gang om dagen om natten. Å legge inn data i 1C kan automatiseres på samme måte. For eksempel er det påkrevd å registrere målingene som er igjen av abonnenter på nettstedet til deres personlige konto. I dette tilfellet kobler vi oss til 1C igjen, og ved hjelp av programmetoden oppretter og utfører vi dokumentet "Akt av avlesninger". Jeg vil gi koden nedenfor.

Å jobbe med COM-objekter i Python er litt uvanlig. For det første går "pytonisiteten" til koden tapt - reglene for å navngi variabler og funksjoner i 1C, for å si det mildt, samsvarer ikke med Zen of Python. For det andre vet alle at 1C-objekter ofte kalles kyrilliske symboler, som vil skape problemer ved utvikling i Python ... men de kan løses. Jeg foreslår at du leser koden:

Importer pythoncom import win32com.client V82_CONN_STRING = "Srvr = v8_server; Ref = v8_db; Usr = brukernavn; Pwd = megapass;" pythoncom.CoInitialize () V82 = win32com.client.Dispatch ("V82.COMConnector"). Koble til (V82_CONN_STRING)

Som du kan se av koden, er klienten initialisert til å fungere med 1C. Definisjonen av et COM-objekt kalles "V82.COMConnector". Vær oppmerksom på at dette navnet er gyldig for V8.2-plattformen, hvis du har versjon 8.1 vil navnet være "V81.COMConnector".

På en initialisert klient kaller vi Connect ()-metoden, og sender den en tilkoblingsstreng. Strengen består av servernavn, base, bruker og passord. Det resulterende V82-objektet lagrer forbindelsen med 1C-applikasjonen. Den har ikke en frakoblingsmetode () eller noe sånt. For å koble fra basen er det nok å slette objektet fra minnet ved å bruke del ()-funksjonen eller tilordne det til variabelen Ingen.

Når du har et objekt, kan du få tilgang til alle felt og metoder i den globale 1C-konteksten, operere med universelle objekter som TabularDocument, ValuesTable, etc. Det er viktig å ta i betraktning at når du arbeider gjennom en COM-tilkobling, fungerer 1C i modusen "Ekstern tilkobling". Eventuelle funksjoner for interaktivt arbeid er ikke tilgjengelig i den, for eksempel popup-dialoger, varsler og, viktigst, skjemaer. Jeg er sikker på at du vil forbanne konfigurasjonsutviklerne mer enn en gang, som legger ved den viktigste funksjonaliteten i Button1Click ()-prosedyren i dokumentskjemamodulen.

La oss snakke om en så viktig ting som kyrilliske attributter. Til tross for at 1C er et tospråklig miljø og for hver russisk metode er det en engelskspråklig analog, vil det før eller senere være nødvendig å vende seg til det kyrilliske attributtet. Hvis dette ikke forårsaker noen problemer i PHP eller VBSCript-språk,

Sett Con = CreateObject ("v81.COMConnector") Sett v8 = Connect ("ConnectionString") Set AccountsManager = v8.Documents.Invoices .... Set AccountsRecord = AccountsManager.CreateElement () AccountsRecord.Contractor = .... .... AccountsWrite.Write ()

Da vil Python-koden ganske enkelt krasje med en syntaksfeil. Hva å gjøre? Redigere konfigurasjonen? Nei, det er nok å bruke metodene getattr og setattr. Ved å sende COM-objektet og det kyrilliske navnet på attributtet til disse funksjonene, kan du få og angi verdiene i henhold til følgende:

# coding = cp1251 catalog = getattr (V82.Catalogs, "Personlige kontoer")

Følgende er viktig: Navnene på attributtene, samt parameterne til funksjoner og metoder må sendes i cp1251-koding. Derfor, for å unngå kodingsbanen på forhånd, er det fornuftig å erklære den i begynnelsen av filen: # coding = cp1251. Etter det kan du overføre strenger uten å bekymre deg for kodingen. Men! Alle strenger mottatt fra 1C (resultater av funksjonsanrop, forespørsler) vil bli kodet i UTF-8.

Et eksempel på kode som utfører en spørring i et 1C-miljø, itererer over resultatet og lagrer databasen til SQLite:

# coding = cp1251 q = "" "SELECT Personal Accounts.Code AS-kode, Personal Accounts.Structure.PopulatedPart.Name +", "+ Personal Accounts.ShortAddress AS-adresse, Personal Accounts.Subscriber.Name AS fio, Personal Accounts.CA Divisjon psu.Number EXPRESS (CharacteristicsPersonalAccountsSliceLast.Value AS Directory.TerritoriallyNetworkOrganizations) .Name AS tso, PersonalAccounts.Structure.PopulatedPart.Name AS np, PersonalAccounts.Street.Room.Room.Account.Dis.Account. Parent.Name AS mro FRA Directory.PersonalAccounts AS PersonalAccounts LEFT JOIN Data Register.CharacteristicsPersonalAccounts.CutLast (, TypeCharacteristics = VALUE (Directory.TypesCharacteristics. = V82.NewObject ( "Query", q) selection = query.Execute (). Velg () CONN = db.connect () CONN.query (models.Abonent) .delete () mens selection.Next (): abonent = models.Abonent () abonent.account = selection.code.strip () abonent.code = selection.code abonent.fio = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = selection.tso abonent.source = u "ASRN" abonent.np = selection.np abonent.street = selection.street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add (abonent) CONN.commit ()

Her er CONN en økt for å koble til SQLite-databasen. Spørreobjektet opprettes, teksten er fylt ut. Som nevnt ovenfor, må forespørselsteksten være i cp1251, for hvilken kodingen er deklarert først. Etter å ha utført forespørselen slettes alle abonnenter i databasen for ikke å legge til duplikater, deretter legges de til i en løkke og den endelige commit følger.

Når jeg jobbet med søk, fant jeg følgende regler.

Når du velger felt, gi dem navn med latinske bokstaver, det vil være mye mer praktisk å referere til dem gjennom en velger (prikk), i stedet for getattr ().
- Velg kun primitive datatyper: strenger, tall, dato og boolsk. Velg aldri referanser til et objekt (dokument, referanse)! I denne sammenhengen er koblinger helt unødvendige for deg og til og med skadelige, fordi ethvert kall til en rekvisita eller en lenkemetode vil føre til en forespørsel via en COM-forbindelse. Hvis du får tilgang til lenkeattributtene i en løkke, vil det gå ekstremt sakte.
- Hvis du velger et Dato-felt, vil det bli returnert som et PyTime-objekt. Det er en spesiell datatype for å sende dato/klokkeslett i en COM-forbindelse. Det er ikke så praktisk å jobbe med det som med vanlig dato og klokkeslett. Hvis du sender dette objektet til int (), vil tidsstemplet bli returnert, hvorfra du kan hente datetime ved å bruke fromtimestamp ()-metoden.

La oss nå se på hvordan trykte dokumenter dannes. Faktum er at forbrukeren må gis muligheten til å laste ned ferdiglagde dokumenter, for eksempel en betalingskvittering eller en avstemmingserklæring. Disse dokumentene genereres i 1C i samsvar med de etablerte kravene; implementeringen av dem i Python vil ta lang tid. Derfor er det bedre å generere dokumenter i 1C og lagre dem i Excel-format.

Så dokumentet til forsoningsloven genereres av en spesiell ekstern behandling. For de som ikke er kjent med 1C-terminologi: behandling er et frittstående program som har sin egen modul, skjemaer, maler, designet for å kjøre i et 1C-miljø. Det er nødvendig å initialisere behandlingen, fylle ut detaljene og kalle en funksjon som vil returnere oss et regnearkdokument beregnet for visning i 1C. Dette dokumentet må lagres i Excel-format og kopieres til serveren eller skrives til databasen.

Link = getattr (V82.Catalogs, "SystemReports"). FindByDescription ("Elaine Reconciliation Act") nav_url = V82.GetURL (link, "Report") navn = V82.ExternalReports.Connect (nav_url) ExternalReport = V82.Creports.Creport (navn) setattr (ExternalReport, "Personal Account", referanse) table_doc = ExternalReport.GetDoc () path = V82.GetTempFileName ("xls") table_doc.Write (bane, V82 .SpreadsheetDocumentFileType.XLS) rapport = modeller.Rapport () rapport .account = reference.Code.strip () report.type = u "act" report.document = åpen (bane, "rb"). les () CONN.add (rapport)

Utdraget ovenfor gjør følgende. Behandlingen som utgjør dokumentet henger sammen. Behandling kan bygges inn i konfigurasjonen, lagres på disk eller i 1C-databasen (i en slags oppslagsbok). Siden behandlingen endres ofte, slik at hver gang konfigurasjonen ikke oppdateres, lagres den hyppigst endrede behandlingen i systemrapportkatalogen, i attributtet til "verdilager"-typen kalt Rapport. Behandlingen kan initialiseres ved å laste den ut fra databasen til disken og laste den, eller ved å bruke GetURL ()-metoden, der du må sende en kobling til et katalogelement og navnet på et attributt. Vi tildeler attributtverdiene til det mottatte behandlingsobjektet, kaller den eksporterte funksjonen GetDoc (), får et regnearkdokument som er lagret i en midlertidig Excel-fil. Innholdet i denne filen er skrevet til SQLite-databasen.

Det siste som gjenstår å vurdere er programvareregistrering av data i 1C. Anta at du vil legge inn avlesninger fra abonnenter. For å gjøre dette er det nok å lage og utføre dokumentet "Erklæring om avlesninger":

# coding = cp1251 acts = getattr (V82.Documents, "Acceptance Act") act = acts.CreateDocument () setattr (act, "Indication", 1024.23) setattr (act, "Subscriber", "Ivanov") # Fylle ut annet detaljer ... handle.Skriv ()
Nå er dataregistrering automatisert.

Så jeg har skissert en metode som er basert på programmatisk lossing og lasting av data ved hjelp av en COM-tilkobling. Denne metoden har fungert vellykket i organisasjonen min i nesten et år. Basen, dannet av 1C, betjener 3 betalingssystemer, Internett-innhenting (betaling med kort via Internett), samt en personlig konto. I tillegg er ulike script koblet til databasen for å automatisere rutinen.

Til tross for manglene ved metoden (langsom hastighet på COM-forbindelsen), fungerer den generelt stabilt. Vi har data i en plattformuavhengig form (SQLite) som kan arbeides med fra alle språk. Og hoveddelen av koden er skrevet i Python, noe som betyr at det er mange verktøy og teknikker tilgjengelig som man ikke engang kan drømme om i 1C.

Dette er en av de mulige måtene å samhandle med 1C. Jeg er sikker på at det ikke er nytt og sannsynligvis allerede har blitt testet og optimalisert av noen. Jeg prøvde imidlertid å sette ut så mange detaljer om prosessen som mulig for å redde deg fra fallgruvene jeg selv tråkket på.

Jeg ønsker dere alle lykke til, og husk at 1C ikke er så skummelt som den er malt!

) Alt er riktig

Samtidig så jeg mer enn én gang når publikasjoner som ikke trakk engang med 10 poeng bare "tok av".
Hvorfor skjedde dette? Angivelig fordi noen tydelig likte dem.


Jeg mener dette og sier at det ville vært fint å ikke lese artikkelen om vurderingen for å forstå hvor mye du trenger den, eller å vurdere den ikke så primitivt +/-. Når det gjelder hva jeg likte, ville jeg korrigert det slik: hun scoret så mye på grunn av det faktum at stjernene ble dannet på denne måten og mange mennesker samlet seg på nettstedet og mange likte det, du forstår selv at dette er et spørsmål om sjanse, tk. så snart artikkelen forlater hovedsiden, kan den allerede finnes bare på forespørsel, og så alle som passerer ved å stemme. Og for å opprettholde på hovedsiden, så vidt jeg forstår, er det bare konstante kommentarer = promotering av artikkelen som tillater.
Det er for dette at butikkene blir satt på gata - det er tross alt ofte ikke kvaliteten og relevansen til varene som er viktig, men fremkommeligheten til stedet, folk som går rundt kjøper ofte det de kaster ut dagen etter. , bare for prosessens skyld. Dette er en sykdom kjent for alle i lang tid - shopomania. Eller ganske enkelt å øke flyten øker sannsynligheten for den rette kjøperen.

Og fordelene og ulempene ... er bare en slags "takk" for tiden og arbeidet som er brukt


De. minus regnes også som et "takk"? Så jeg ville vite din holdning til om det er nødvendig å si det i slike tilfeller, og hvor interessant synes andre? Om du skal si det når artikkelen er skadelig / dårlig eller når den rett og slett er ubrukelig / tom for deg.
Etter min mening ser artikkelen ut som en enkel økning i vurderingen, fordi:
1. Problemet med typer sitert av meg ble generelt ignorert av forfatteren, selv om han ikke var for lat til å skrive en haug med kommentarer.
2. Det er en klar unøyaktighet i artikkelen: den sier at dette er den eneste måten

V82 = Nytt COM-objekt ("V82.ComConnector"); Kode = MotpartSOM.Code;


men jeg gjør det rolig ved å bruke prosessering som dette:

Rapport (Base. Referansebøker. Contractors. FindByName ("LLC"). Kode);


og alt er bra! Og jeg velger tilkoblingen V82.ComConnector
Det er liksom merkelig at forfatteren ikke bryr seg om at artikkelen hans inneholder slike problemer som antydet, men han reagerer ikke på noen måte.
3. Men det er fortsatt et problem når feilen "Klasse eksisterer ikke" dukker opp
4. Og det er et problem når 8.2 er installert, og deretter 8.1 er installert - prøv å bytte ut OLE / COM med en typisk UT-BP-sentral!
5. Du kan angi hovedbehandlingen på nettstedet som lar deg koble til universelt via OLE / COM slik at nybegynnere ikke kaster bort tid, du skriver for dem! Det samme forresten bildet hennes av en eller annen grunn du flaunt, hvorfor skulle?. Som et resultat, 2 ord i hovedsak, og 6 mer bak kulissene.

Generelt kaster jeg ikke gjørme, men indikerer spesifikke hull, men reaksjonene er null. Hvis dette er opplevelsen du deler, så er den en slags feilaktig og ufullstendig.
Jeg mener, hvis forfatteren hadde et ønske om å samle alle feilene, så kunne han i det minste lytte til andres opplevelse, og ikke knipse på kommentarene. Umiddelbart oppstår det en situasjon når den som leser den vet mer enn forfatteren, forteller de ham (noen ganger feil), og han kjemper også tilbake. Som et resultat er all informasjon ikke i artikkelen, men i kommentarene! Det er morsomt! Dette skjer ofte, men samtidig er det ingen grunn til å hvile på det du ville være best – jeg viser det best, og andre viser! Inkluder dette i artikkelen, og det vil være verdt det, ikke alle er interessert i å lese denne trefningen.