V8: povezava COM. Trije stebri dela s predmeti COM. Delo prek povezave COM je lažje, kot si mislite 1s 8.3 ustvarjanje novih objektov COM

Ena od možnosti za izmenjavo podatkov med zbirkami podatkov 1C je izmenjava prek COM povezave.

S povezavo COM se lahko povežete iz ene baze podatkov 1C v drugo in berete ali pišete podatke. Ta metoda se lahko uporablja tako v različicah baz podatkov odjemalec-strežnik kot tudi v datotečnih bazah podatkov. V tem članku si bomo ogledali primere te vrste povezave. Primeri uporabljajo platformo 8.2.

Za aplikacijo 1C lahko ustvarite dve vrsti objektov COM. to V82.Aplikacija in V82.COMConnector. V primeru V82.Aplikacija Zažene se skoraj popolna kopija aplikacije 1C. v primeru uporabe V82.COMConnector Zažene se majhen strežniški del.
Hitrost delovanja je v tem primeru višja, vendar nekatere funkcije morda ne bodo na voljo. Predvsem delo z obrazci in skupnimi moduli, za katere lastnost dela z zunanjimi povezavami ni nastavljena. Večinoma bi morali uporabiti V82.COMConnector in samo v primeru pomanjkanja funkcionalnosti V82.Aplikacija. Razlika v hitrosti delovanja je lahko še posebej opazna pri bazah podatkov velikega obsega.

Pa začnimo

  1. Ustvarimo objekt COM
    • Za V82.Aplikacija Connection = New COMObject("V82.Application" ) ;
    • Za V82.COMConnector Connection = New COMObject("V82.COMConnector" ) ;
  2. Ustvarimo povezovalni niz
    • za strežniško različico baze ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • za različico datoteke baze podatkov ConnectionString = "File = " "PathKBase" "; Usr = uporabniško ime; Pwd = geslo";
  3. Povezovanje z bazo podatkov Poskus povezave = Povezava. Connect(ConnectionString) ; Sporočilo o izjemi = Novo sporočiloUporabniku; Sporočilo. Text = + ErrorDescription() ; Sporočilo. Poročati() ; EndAttempt ;
  4. Prekinitev povezave z bazo podatkov Povezava = Nedefinirano;

    Za objekt V82.Aplikacija Povezavo je treba prekiniti, sicer ostane nepopolna seja, ki jo je treba nato ročno izbrisati. V primeru V82.COMConnector povezava se samodejno prekine, ko je postopek, v katerem je bila vzpostavljena povezava, končan.In še ena malenkost.

    Za uporabnika, pod katerim se vzpostavlja povezava, mora biti v nastavitvah onemogočeno potrditveno polje »Zahtevaj potrditev ob zapiranju programa«.

Zdaj pa sestavimo vso kodo

Connection = New COMObject("V82.Application" ) ; //Povezava = Nov COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" "; Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "Datoteka = ""С:\MyBase""; Usr = Petya; Pwd = 123"; Poskus povezave = Povezava. Connect(ConnectionString) ; Sporočilo o izjemi = Novo sporočiloUporabniku; Sporočilo. Besedilo = "Ni bilo mogoče vzpostaviti povezave z bazo podatkov"+ DescriptionError() ; Sporočilo. Poročati() ; EndAttempt ; Povezava = Nedefinirano;

Za vrsto povezave V82.Aplikacija metoda se uporablja za objekt COM, ki je bil prvotno ustvarjen, in za V82.COMConnector metoda se uporabi za povezavo. Nato se zahteva obdela s standardnimi orodji 1C. v kodi je videti takole:

Zahteva = Povezava. NewObject("Zahteva"); // Za V82.COMConnector Zahteva = Povezava. NewObject("Zahteva"); // Za V82.Aplikacija Prošnja. Besedilo = "IZBERI | Položaji Organizacij Kodeks, | Položaji organizacij. Ime|OD | Imenik. Položaji organizacij AS Položaji organizacij"; Rezultat = Zahteva. Zaženi(); Vzorec = rezultat. Izberite(); Adijo Izbor. Next() Loop EndLoop ;

Za različico 1C:Enterprise 8.3 vse ostane nespremenjeno, razen da morate pri ustvarjanju objektov COM uporabiti "V83.COMConnector" oz "V83.Aplikacija".

Natisni (Ctrl+P)

Ena od možnosti za izmenjavo podatkov med zbirkami podatkov 1C je izmenjava prek COM povezave. S povezavo COM se lahko povežete iz ene baze podatkov 1C v drugo in berete ali pišete podatke. Ta metoda se lahko uporablja tako v različicah baz podatkov odjemalec-strežnik kot tudi v datotečnih bazah podatkov. Ta članek obravnava te vrste povezav na platformi 8.3

com povezava

Za aplikacijo 1C lahko ustvarite dve vrsti objektov COM. To so stare povezave V83.Aplikacija in com povezave V83.COMConnector . V primeru V83.Aplikacija Zažene se skoraj popolna kopija aplikacije 1C. V primeru uporabe V83.COMConnector Zažene se majhen strežniški del. Hitrost delovanja je v tem primeru višja, vendar nekatere funkcije morda ne bodo na voljo. Predvsem delo z obrazci in skupnimi moduli, za katere lastnost dela z zunanjimi povezavami ni nastavljena. Večinoma bi morali uporabiti V83.COMConnector in samo v primeru pomanjkanja funkcionalnosti V83.Aplikacija. Razlika v hitrosti delovanja je lahko še posebej opazna pri bazah podatkov velikega obsega. Za platformo 8.2 uporabljeno V82.Application ali V82.COMConnector

Vzpostavite povezavo OLE

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

Vzpostavite povezavo COM

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

Povezovalni niz

//Za možnost odjemalec-strežnik
Povezavni niz= “Srvr = ““ServerName” “;Ref = “ “BaseName” ;
//Za možnost datotečnega načina:
Povezavni niz= “Datoteka = ““PathKBase” “; Usr = uporabniško ime; Pwd = geslo”;
Poskus
Povezava = Povezava . Povežite se(ConnectionString) ;
Izjema
Sporočilo = Novo sporočiloUporabniku;
Sporočilo . Besedilo = »Povezava z bazo podatkov ni uspela« + DescriptionErrors(); Sporočilo . Poročati();
EndAttempt ;

Prekinitev povezave

Povezava = Nedefinirano;
Za objekt V83.Aplikacija Povezavo je treba prekiniti, sicer ostane nepopolna seja, ki jo je treba nato ročno izbrisati. V primeru V83.COMConnector povezava se samodejno prekine, ko je postopek, v katerem je bila vzpostavljena povezava, končan.In še ena malenkost. Za uporabnika, pod katerim se vzpostavlja povezava, mora biti v nastavitvah onemogočeno potrditveno polje »Zahtevaj potrditev ob zapiranju programa«.

Metoda NewObject().

Če želite ustvariti nov predmet, lahko uporabite metodo NewObject(), na primer:

Za V83.COMConnector

ZahtevaCOM = Povezava. NewObject( "Prošnja ") ;
TableCOM = Povezava. NewObject( "Tabela vrednosti") ;
ArrayCOM = Povezava. NewObject(“Matrika”);

ViewCOM = Connection.NewObject

Za V83.Aplikacija

RequestOLE = Povezava. NewObject(" Prošnja ") ;
TableOLE = Povezava. NewObject("Tabela vrednosti") ;
ArrayOLE = Connection.NewObject("Matrika");
ViewCOM = Connection.NewObject(»UniqueIdentifier«, StringUID);

ZahtevaCOM . Besedilo ="IZBERI
| Položaji Organizacij Kodeks,
| Položaji organizacij. Ime
|OD | Imenik. Položaji organizacij
KAKO DO POLOŽAJEV ORGANIZACIJ”;

Rezultat = ZahtevaCOM. Zaženi();
Vzorec = Rezultat. Izberite ();
Adijo Izbor. Naslednji()Cikel
Končni cikel ;
Uporabite lahko tudi upravitelje konfiguracijskih objektov:
ImenikCOM = Povezava. Imeniki. ime imenika;
DokumentCOM = Povezava. Dokumentacija. ImeDokumenta;
RegisterCOM = Povezava. Informacijski registri. RegisterName ;

Prejem in primerjava enumeracije preko COM povezave

Za primerjavo vrednosti elementov oštevilčenja, definiranih v konfiguraciji, je potrebno te elemente pretvoriti v enega od primitivnih tipov, katerih primerjava je enostavna. Takšni tipi so lahko številski ali nizovni. Vrednost elementa oštevilčenja lahko pretvorite v številsko vrsto, kot je ta:

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

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

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

If EnumerationItemNumber = 0 Then Report( “Enumer value1”);

ElseIfEnumerationItemNumber = 1 Potem Poročilo ("EnumerationValue2");

endIf;

Pridobivanje predmeta prek COM po identifikatorju

Preko upraviteljev konfiguracijskih objektov pridobimo objekt com, na primer:
DokumentCOM = Povezava. Dokumentacija. ImeDokumenta;

Nato dobimo edinstven identifikatorski niz:

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

Identifikator = New U uniqueIdentifier(StringUID);
Z linkByIdentifier = Dokumenti[ImeDokumenta].GetLink(Identifikator);

Če morate poiskati predmet com po dokumentu po identifikatorju, morate napisati takole:

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

Eden od načinov za prenos podatkov iz ene konfiguracije 1C v drugo je programska povezava z uporabo COM. Mnoga podjetja uporabljajo več različnih baz podatkov, med katerimi morajo obstajati določene povezave in odvisnosti. Če ni potrebno samo prenašati podatkov, ampak tudi izvajati določeno obdelavo podatkov, bo povezava COM optimalen mehanizem. Možnost analize podatkov iz druge baze podatkov 1C je koristna za vsakega razvijalca.

Povezujemo se preko COM z bazo podatkov 1C

Za izvedbo povezave COM v 1C se uporablja poseben mehanizem, imenovan COMConnector. Ta objekt je nameščen skupaj s platformo in se uporablja za povezovanje informacijskih baz. Upoštevati je treba, da se za različici 8.2 in 8.3 uporabljajo predmeti z različnimi imeni - "V82.COMConnector" oziroma "V83.COMConnector".

Ne pozabite, da trajanje povezave COM z bazo podatkov stane licenco - ne nasedajte hkratnemu izvajanju več povezav. To je še posebej pomembno za organizacije, ki imajo omejeno število licenc. To težavo je mogoče rešiti s pomočjo rutinskih nalog, ki se izvajajo, ko ni aktivnih uporabniških povezav z informacijsko bazo.

Da se lahko povežete z drugo bazo podatkov in zahtevate potrebne informacije, morate poznati naslednje podatke:

  1. Katere vrste je - datoteka ali odjemalec-strežnik;
  2. Kje je;
  3. Katero ime in geslo lahko uporabite za prijavo?
  4. Kateri podatki vas zanimajo?

Iz prvih treh točk morate za izvedbo povezave COM ustvariti niz parametrov. Odvisno od vrste informacijske varnosti se bo razlikoval po videzu. Z uporabo prejetega niza se vzpostavi povezava, s pomočjo katere lahko zbirate podatke iz druge baze podatkov za analizo in obdelavo s poljubnimi metodami.

Parametri povezaveFileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Password"""; Parametri povezaveClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Password""";

Funkcija povezave je preprosta in ne bi smela povzročati vprašanj, če so vsi parametri pravilno določeni. Za pospešitev odpravljanja napak in analize morebitnih napak je bolje, da povezavo priložite v konstrukcijo »Poskusi«. Funkcija bo vrnila vrednost tipa "COM object", s katero boste delali za pridobitev potrebnih podatkov.

Funkcija &OnServer ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c database\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Nov COMObject("V83.COMConnector"); Poskus vrnitve V83COMCon.Connect(Parametri povezave IB); Poročilo o izjemi (Opis napake ()); Vrni Nedefinirano; EndAttempt; EndFunction

Prek povezave COM ne morete samo izbrati podatkov, ampak jih tudi dodati v bazo podatkov, s katero se povezujete. Ne pozabite, da lahko prek objekta COM prenesemo 4 primitivne vrste podatkov. Druge vrste bo treba določiti z uporabo vgrajenih iskalnih funkcij platforme. Upoštevajte, da se funkcije globalne platforme kličejo tudi prek povezave COM.

Podatke prejemamo iz baze podatkov 1C

Ko prejmete želeni objekt, morate prebrati podatke iz druge baze podatkov. Za to uporabimo zahtevo prek povezave COM v 1C 8.3 z uporabo prejete vrednosti tipa "COM object" iz funkcije. Pomembno je, da se najprej povežete z bazo podatkov in nato izvedete zahtevo. Izvedba se izvede z metodo NewObject, pri čemer se kot parameter določi vrsta objekta v obliki niza - "Zahteva".

&OnServer postopek TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "IZBERI prvih 15 | DirectoryUser.Name AS Ime |FROM | Directory.users AS DirectoryUser"; Izberite = RequestBPZO.Execute().select(); Medtem ko Selection.next() zanka Report(Selection.Number); EndCycle; endIf; Konec postopka >

Na primer, za pridobitev podatkov o uporabnikih določenega oddelka bomo v zahtevku postavili pogoj preko parametrov. En parameter bo preproste vrste - niz, delitev pa bo povezava do elementa imenika "Struktura podjetja". Rezultat poizvedbe je tabela z navedenimi polji vrste, ki obstaja v bazi podatkov, s katero je prišlo do povezave COM. Če jih morate pretvoriti v druge vrste, uporabite standardne funkcije platforme:

  • Črta();
  • Število ();
  • Datum().
RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "IZBERITE prvih 15 | DirectoryUser.Name AS Ime | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | In DirectoryUser.Name kot ""%"" + &RequiredName+ ""%""" ; Zahteva BPZO.SetParameter("Potreben oddelek", Povezava. Imeniki. Struktura podjetja. Iskanje po kodi("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Izberite = RequestBPZO.Execute().select(); Medtem ko Selection.next() zanka Report(Selection.Name); EndCycle;

Če morate prenesti matriko v bazo podatkov za izbiro na podlagi več parametrov, na primer oddelkov, se uporabi tudi ukaz NewObject. Podobno lahko posredujete seznam ali tabelo vrednosti in jih napolnite z elementi druge zbirke podatkov prek povezave. Vse obstoječe metode predmetov in mehanizmov platforme so vam na voljo za iskanje.

RequestBPZO = Connection.NewObject.("Request"); RequestBPZO.Text = "IZBERITE prvih 15 | DirectoryUser.Name AS Ime | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | In DirectoryUser.Name kot ""%"" + &NecessaryName+ ""%" " "; Niz oddelkov = 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")); Zahteva BPZO.SetParameter("Zahtevan oddelek", niz oddelkov); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Izberite = RequestBPZO.Execute().select(); Medtem ko Selection.next() zanka Report(Selection.Name); EndCycle;

Pri prenosu dokumentov ali elementov imenika se vedno pojavi vprašanje kontrole prenosa določenega objekta. S pomočjo povezav COM je takšne težave mogoče rešiti z enoličnim identifikatorjem. Predmet v bazi podatkov vtičnikov morate poiskati po identifikatorju iz trenutne informacijske varnosti s funkcijo »GetLink«, pri čemer uporabite identifikator kot niz. Če ga ne najdete, ga lahko ustvarite s povezavo COM.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Če NI ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) potem NewUser = Connection.Directories.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Ime; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual; NewUser.Write(); endIf;

Poleg tega ima povezava COM pravico do uporabe postopkov in funkcij iz običajnih modulov 1C z omogočeno lastnostjo »Zunanja povezava«. Poleg tega pogoja mora biti klicana funkcija ali postopek izvoz in ne sme vključevati interaktivnih dejanj, izvedenih na strežniku. V nasprotnem primeru boste videli napako o neveljavni operaciji.

Spojina..; VariableFunction = Povezava..; klic funkcije>splošno ime modula>klic postopka>splošno ime modula>

Možnosti zunanje povezave z drugo bazo podatkov v 1C so precej obsežne in vam lahko omogočajo opravljanje številnih nalog. Pomembno je, da znamo pravilno ovrednotiti orodja in izbrati optimalno rešitev. V večini primerov se ta veščina pojavi šele z izkušnjami ali s preučevanjem primerov dela izkušenih strokovnjakov.

) Tako je

Hkrati sem že več kot enkrat videl, ko so publikacije, ki niso dosegle niti 10 točk, preprosto "odletele".
Zakaj se je to zgodilo? Očitno zato, ker so bili nekomu očitno všeč.


To je tisto, kar pravim, da bi bilo lepo razumeti, koliko ga potrebujete, ne da bi prebrali ocenjevalni članek, ali da bi ga ocenili ne tako primitivno +/-. Glede tega, kaj mi je bilo všeč, bi to popravil takole: pridobilo je toliko zaradi dejstva, da so se zvezdice poravnale in se je na strani zbralo veliko ljudi in mnogim je bilo všeč, sami razumete, da je to stvar naključja, ker Takoj, ko članek zapusti glavno stran, ga je mogoče najti le na zahtevo in tako glasujejo vsi mimoidoči. In kolikor razumem, stalni komentarji = promocija članka vam omogočajo, da ga ohranite na glavni strani.
Ravno zato postavljajo trgovine na javne ulice – navsezadnje pogosto ni pomembna kakovost in ustreznost blaga, temveč prometnost kraja; sprehajalci pogosto kupijo nekaj, kar bodo naslednji dan vrgli stran, šele zavoljo procesa. To je že dolgo vsem znana bolezen – odvisnost od nakupovanja. Ali pa preprosto povečanje pretoka poveča verjetnost pravega kupca.

In prednosti in slabosti ... - to je samo nekakšna "hvala" za porabljen čas in delo


Tisti. Ali minus šteje tudi kot "hvala"? Zanima me vaše mnenje o tem, ali ga je treba uporabiti v takih primerih in kako zanimivo se vam zdijo drugi? Ali ga dati, ko je članek škodljiv/slab ali ko je za vas enostavno neuporaben/prazen?
Po mojem mnenju je članek videti kot preprosto zvišanje ocene, ker:
1. Težavo s tipi, ki sem jo navedel, je avtor popolnoma prezrl, čeprav ni bil preveč len, da bi napisal kopico komentarjev.
2. V članku je očitna netočnost: rečeno je, da je to edini način

V82 = Nov COMObject("V82.ComConnector"); Koda = AccountCOM.Code;


vendar lahko to enostavno storim z obdelavo, kot je ta:

Poročilo (Baza. Imeniki. Nasprotne stranke. Poišči po imenu ("LLC"). Koda);


in vse je v redu! In izberem povezavo V82.ComConnector
Nekako nenavadno je, da avtorja sploh ne zanima, da njegov članek vsebuje problematiko, na katero je opozoril, na to pa nikakor ne reagira.
3. Še vedno pa obstaja težava, ko se pojavi napaka »Razred ne obstaja«.
4. Težava pa je, ko je nameščen 8.2 in nato 8.1 - poskusite zamenjati prek OLE/COM s standardno izmenjavo UT-BP!
5. Ali lahko navedete glavno obdelavo na spletnem mestu, ki vam omogoča univerzalno povezavo prek OLE/COM, tako da začetniki ne izgubljajo časa, pišete namesto njih! Mimogrede, njena slika je iz nekega razloga na vašem zaslonu, zakaj? In kot rezultat, 2 besedi o utemeljenosti in še 6 v zakulisju.

Na splošno ne blatim, ampak opozarjam na določene vrzeli, vendar ni nobene reakcije. Če je to izkušnja, ki jo delite, potem je nekako napačna in nepopolna.
Mislim, da če bi imel avtor željo zbrati vse napake, bi lahko vsaj poslušal izkušnje drugih ljudi, ne pa se nabijal na komentarje. Takoj nastane situacija, ko tisti, ki jo bere, ve več kot avtor, mu rečejo (včasih napačno), on pa se tudi upre. Posledično vse informacije niso v članku, ampak v komentarjih! Smešno! To se pogosto zgodi, vendar se vam ni treba osredotočati na dejstvo, da ste želeli najboljše - jaz pokažem, kaj je najboljše, in drugi to pokažejo! Vključite to v članek in obrestovalo se bo; vseh ne zanima branje tega spopada.

Pozdravljeni Khabrachans!

V tem članku želim govoriti o tem, kako je integracija s platformo 1C vzpostavljena v moji organizaciji. K temu me je spodbudilo skoraj popolno pomanjkanje tehničnih informacij o tej temi. Ko berete različne članke in poročila na temo povezovanja 1C s katerim koli informacijskim sistemom, ste vedno znova prepričani, da so vsi marketinške, predstavitvene narave in nikoli tehnični, odražajo problem in bistvo njegove rešitve.

Opozarjam vas, da ta metoda nikakor ne trdi, da je univerzalna. Ker je samih konfiguracij 1C veliko, informacijskih sistemov, jezikov in platform pa še več, je možnih kombinacij ogromno. Moj cilj je pokazati eno možno rešitev.


Kot jezik, ki bo integriran v 1C, sem izbral Python. Zelo je primeren za avtomatizacijo procesov. To olajšuje minimalizem sintakse (koda se vtipka zelo hitro), bogata standardna knjižnica (manj potrebe po modulih drugih proizvajalcev), večplatformnost - z veliko verjetnostjo bo koda, napisana v OS Linix, uspešno delovala v sistemu Windows .

Za začetek bom orisal podatke, s katerimi bomo delali. Organizacija je podjetje za prodajo energije na Daljnem vzhodu - služi približno 400 tisoč naročnikom, baza podatkov 1C temelji na konfiguraciji po meri. Za vsakega naročnika so shranjena njegova plačila, dajatve, porabljene storitve in obračunske sheme, števci, odčitki in številni drugi podatki.

Nekoč je imela organizacija program, napisan v Delphiju, ki je kot bazo podatkov uporabljal MSSQL/Firebird. V tistih slavnih časih ste se lahko povezali z bazo podatkov v katerem koli jeziku in izvajali številna dejanja - izbirali naročnike dolžnike, knjižili prejeta plačila, beležili odčitke instrumentov. Ni presenetljivo, da zbirka skript, ki avtomatizirajo rutino, nenehno narašča. Programerji lahko izvajajo katero koli dejanje, ne da bi odprli sam program.

Žal, s prehodom na 1C se je brezplačna ponudba končala - neposredno povezovanje z bazo podatkov ni bilo več mogoče. Na splošno je sama platforma 1C nedeljiva in ni primerna za integracijo z drugimi sistemi. Ona, kot pravijo, je stvar sama po sebi. Pri nalaganju podatkov v 1C ne pozabite, da jih izvleči od tam ne bo tako enostavno. Toda glede na to, da je organizacija potrebovala uvedbo plačilnih sistemov in osebnega računa, je bilo treba najti neko rešitev.

Glavne naloge, s katerimi se soočam, so bile zmožnost hitrega pridobivanja podatkov o določenem osebnem računu - polno ime, naslov, merilne naprave, odčitki instrumentov, plačila, dajatve. Plus ustvarjanje dokumentov - poročilo o uskladitvi, potrdilo o plačilu. Torej ni možnosti neposredne povezave z bazo podatkov - vsak, ki je pogledal bazo podatkov 1C na strežniku SQL, je videl, da je težko razumeti množico tabel, kot so aaa1, aaa2. In ustvarjanje poizvedb s takimi imeni tabel in polj je preprosto nerealno. Poleg tega je veliko tabel 1C (zlasti tistih najpomembnejših, kot je rezina najnovejših, ravnovesij in vrtljajev) virtualnih in razpršenih po različnih fizičnih tabelah, zbranih z več združitvami. Ta metoda ni primerna.

Platforma 1C omogoča povezavo z njo preko COM povezave. Tako kot mnogi programi Windows sta med namestitvijo 1C v sistemu registrirana dva predmeta COM - Automation Server in COM Connector. Z obema predmetoma je mogoče delati z uporabo jezika, ki podpira tehnologijo COM.

Objekt Automation Server je aplikacija 1C, ki se skoraj ne razlikuje od običajne odjemalske aplikacije. Razlika je v tem, da je možno dodatno programsko nadzirati primerek aplikacije. Pri delu s predmetom COM Connector se zažene lahka različica aplikacije 1C, v kateri obrazci, pa tudi funkcije in metode, povezane z vmesnikom in vizualnimi učinki, niso na voljo. Sama aplikacija se zažene v načinu »Zunanja povezava«. Inicializacijo globalnih spremenljivk (na primer določitev trenutnega uporabnika in njegovih nastavitev) je treba izvesti v zunanjem povezovalnem modulu 1C. Če v načinu zunanje povezave koda pokliče funkcijo, ki v tem načinu ni na voljo, bo vržena izjema (ki bo posredovana našemu skriptu Python). Klici nevarnih funkcij morajo biti uokvirjeni s konstrukti obrazca

#If NOT an OuterJoin Then Warning("Pozdravljeni!"); #EndIf

Ker je delo s predmeti COM izključno tehnologija za Windows, ni presenetljivo, da ni vključena v standardno distribucijo Python. Namestiti boste morali razširitev - nabor modulov, ki zagotavljajo vse potrebne funkcije za programiranje pod Windows v Pythonu. Prenesete ga lahko kot vnaprej zgrajen namestitveni program exe. Sama razširitev omogoča dostop do registra, storitev, ODBC, COM objektov itd. Kot alternativo lahko takoj namestite distribucijo ActiveState Python, ki je takoj priložena razširitvi Win32.

Nekaj ​​časa sem eksperimentiral s povezavo COM pri razvoju spletnih aplikacij, zlasti osebnega računa. Ugotovljene so bile naslednje pomanjkljivosti:

Povezava COM je počasna. Nizka zmogljivost je dobro znana pomanjkljivost tehnologije COM.
- Postopek vzpostavitve povezave z 1C, odvisno od konfiguracije, lahko traja od 1 do 8 sekund (v mojem primeru - 6 sekund). Ni treba posebej poudarjati, da bo vzpostavitev povezave za vsako zahtevo povzročila, da se bo vsaka stran naložila 8 sekund.
- Ker spletne aplikacije v Pythonu delujejo kot neodvisni strežniki, je prejšnjo točko mogoče nadomestiti s shranjevanjem povezave v neko globalno spremenljivko in njeno obnovitvijo v primeru napake. Če sem iskren, še nisem razmišljal o tem, kako ohraniti povezavo v PHP.
- Izgubljena je večplatformska funkcionalnost spletne aplikacije.

Na podlagi zgoraj navedenih točk je bilo odločeno spremeniti načelo interakcije in ga razdeliti na 2 dela - prvega, ki je odvisen od platforme (na osnovi oken), nalaganje podatkov 1C v kateri koli primeren format, in drugi, neodvisen od platforme, sposoben delati s podatki, ne da bi načeloma kar koli sumil o 1C.

Strategija ukrepanja je naslednja: skript Python se poveže z 1C, izvede potrebne poizvedbe in naloži podatke v bazo podatkov SQLite. Na to bazo podatkov se lahko povežete iz Pythona, PHP, Jave. Večina naših projektov deluje v Pythonu in ker ne prenesem ročnega pisanja neobdelanih poizvedb SQL, vse delo z bazo podatkov SQLite poteka prek SQLAlchemy ORM. Vse, kar je bilo potrebno, je bilo opisati strukturo podatkov baze podatkov v deklarativnem slogu:

From sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer, primary_key= True) račun = Stolpec(Unicode(32), index=True) code = Stolpec(Unicode(32)) naslov = Stolpec(Unicode(512)) fio = Stolpec(Unicode(256)) vir = Stolpec(Unicode(16) ) psu = Stolpec(Unicode(256)) tso = Stolpec(Unicode(256)) np = Stolpec(Unicode(256)) ulica = Stolpec(Unicode(256)) hiša = Stolpec(celo število) flat = Stolpec(celo število) mro = Column(Unicode(256)) class Payment(Base): __tablename__ = "payments" # in tako naprej...

Zdaj morate samo uvoziti ta modul v kateri koli projekt Python in že lahko delate s podatki.

Predvidevam vaše vprašanje - "zakaj SQLite"? Glavni razlog je, da je baza podatkov samo za branje, zato nas težave s pisanjem v SQLite ne bi smele skrbeti. Drugič, oblika tega DBMS je priročna - lažja je za ogled (obstaja veliko brezplačnih pripomočkov, vključno s super razširitvijo za FireFox). Tretjič, v nekaterih primerih je bilo treba pridobiti dostop do naročnikov iz strojev, ki nimajo povezave s strežnikom MySQL. V tem primeru je dovolj, da kopirate datoteko baze podatkov SQLite, in ta stroj bo imel dostop do vseh informacij.

Razkladanje poteka enkrat na dan ponoči. Vnos podatkov v 1C je mogoče avtomatizirati na enak način. Na primer, potrebno je beležiti odčitke, ki so jih naročniki pustili na spletnem mestu osebnega računa. V tem primeru se ponovno povežemo z 1C in programsko ustvarimo in objavimo dokument »Akt odčitkov«. Spodaj bom posredoval kodo.

Delo s predmeti COM v Pythonu je nekoliko nenavadno. Prvič, izgubljena je "pitonskost" kode - pravila za poimenovanje spremenljivk in funkcij v 1C, milo rečeno, ne ustrezajo zenu Pythona. Drugič, vsi vedo, da so objekti 1C pogosto poimenovani s cirilskimi znaki, kar bo povzročalo težave pri razvoju v Pythonu ... vendar jih je mogoče rešiti. Predlagam, da pogledate kodo:

Import pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=uporabniško ime;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)

Kot je razvidno iz kode, je odjemalec inicializiran za delo z 1C. Objekt COM je definiran z imenom »V82.COMConnector«. Upoštevajte, da je to ime veljavno za platformo V8.2, če imate različico 8.1, bo ime "V81.COMConnector".

Na inicializiranem odjemalcu pokličemo metodo Connect() in ji posredujemo povezovalni niz. Niz je sestavljen iz imena strežnika, baze podatkov, uporabnika in gesla. Nastali objekt V82 shrani povezavo z aplikacijo 1C. Nima metode Disconnect() ali česa podobnega. Če želite prekiniti povezavo z bazo podatkov, preprosto izbrišite objekt iz pomnilnika s funkcijo del() ali ga dodelite spremenljivki None.

Če imate predmet, lahko dostopate do vseh polj in metod globalnega konteksta 1C, delujete z univerzalnimi predmeti, kot so TabularDocument, ValueTable itd. Pomembno je upoštevati, da pri delu prek povezave COM 1C deluje v načinu »Zunanja povezava«. Ne dovoljuje nobenih interaktivnih funkcij, kot so pojavna pogovorna okna, obvestila in, kar je najpomembneje, obrazci. Prepričan sem, da boste še večkrat preklinjali razvijalce konfiguracij, ki najpomembnejšo funkcionalnost vgradijo v proceduro Button1Press() v modul obrazca dokumenta.

Pogovorimo se o tako pomembni stvari, kot so atributi cirilice. Kljub dejstvu, da je 1C dvojezično okolje in za vsako rusko metodo obstaja analog v angleškem jeziku, se boste prej ali slej morali obrniti na atribut cirilice. Če to ne povzroča težav v jezikih PHP ali VBSCript,

Nastavi Con = CreateObject("v81.COMConnector") Nastavi v8 =Con.Connect("Povezavni niz") Nastavi AccountsManager = v8.Documents.Accounts.... Nastavi AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... . .... AccountsRecord.Write()

Potem se bo koda Python preprosto zrušila s sintaktično napako. Kaj storiti? Urediti konfiguracijo? Ne, dovolj je, da uporabite metodi getattr in setattr. Če tem funkcijam posredujete objekt COM in ime atributa v cirilici, lahko ustrezno dobite in nastavite vrednosti:

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

Pomembno je naslednje: imena podrobnosti, kot tudi parametri funkcij in metod, morajo biti posredovani v kodiranju cp1251. Zato, da bi se izognili zmedi s kodiranjem vnaprej, je smiselno, da ga deklarirate na začetku datoteke: #coding=cp1251. Nato lahko posredujete nize, ne da bi vas skrbelo njihovo kodiranje. Ampak! Vsi nizi, prejeti od 1C (rezultati klicnih funkcij, poizvedbe), bodo v kodiranju UTF-8.

Primer kode, ki izvede poizvedbo v okolju 1C, ponovi rezultat in shrani bazo podatkov v SQLite:

#coding=cp1251 q = """ IZBERI Osebni računi. Koda AS koda, Osebni računi. Zgradba. Naselje. Ime + ", " + Osebni računi. Kratek naslov AS naslov, Osebni računi. Naročnik. Ime AS fio, Osebni računi. Divizija. Ime AS psu, EXPRESS (Značilnosti osebnih računov. Del zadnjega. Vrednost imenika AS. Teritorialne mrežne organizacije). Ime AS tso, Osebni računi. Stavba. Naseljena točka. Ime AS np, Osebni računi. Stavba. Ulica. Ime AS ulica, Osebni računi. Stavba. Hiša AS hiša, Osebni račun a.MainRoom.RoomNumber AS stanovanje , PersonalAccounts.Division.Parent.Name AS mro FROM Imenik.PersonalAccounts AS PersonalAccounts LEVA POVEZAVA RegisterInformation.CharacteristicsPersonalAccounts.Slice of the Last(, TypeCharacteristics = VALUE(Directory.Types of Characteristics.Territorial Network Organization)) AS CharacteristicsL PersonalAccountsSliceLast software PersonalAccounts.Link = CharacteristicsPersonalAccountsSliceLast.Object """ query = V82.NewObject("Query", q) selection = query.Execute().Choose( ) CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = modeli.Abonent() abonent.account = selection.code.strip() abonent.code = selection .code abonent.fio = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = izbor. tso abonent.source = u"ASRN" abonent.np = selection.np abonent.street = izbor .street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add(abonent) CONN.commit()

Tukaj je CONN povezovalna seja z bazo podatkov SQLite. Poizvedbeni objekt je ustvarjen in njegovo besedilo je izpolnjeno. Kot je navedeno zgoraj, mora biti besedilo zahteve v cp1251, za katerega je najprej deklarirano kodiranje. Po izvedbi zahteve se vsi naročniki izbrišejo v bazi, da ne dodajajo dvojnikov, nato se dodajo v zanki in sledi končna potrditev.

Pri delu z zahtevami sem odkril naslednja pravila.

Ko izbirate polja, jim dodelite imena z latiničnimi črkami, veliko bolj priročno bo dostop do njih prek izbirnika (pika), namesto getattr().
- Izberite samo primitivne tipe podatkov: nize, številke, datum in logične vrednosti. Nikoli ne izberite povezav do predmeta (dokument, referenčna knjiga)! V tem kontekstu nikakor ne potrebujete povezav in ste celo škodljivi, saj bo vsak klic povezave ali metode povzročil zahtevo prek povezave COM. Če dostopate do atributov povezave v zanki, bo to izjemno počasno.
- Če izberete polje vrste Datum, bo vrnjeno kot objekt PyTime. To je posebna vrsta podatkov za prenos datuma in časa v povezavi COM. Delo z njim ni tako priročno kot z običajnim datumom in uro. Če ta predmet posredujete funkciji int(), bo vrnil časovni žig, iz katerega lahko nato z metodo fromtimestamp() pridobite datum in uro.

Zdaj pa poglejmo, kako nastanejo tiskani dokumenti. Dejstvo je, da mora imeti potrošnik možnost naložiti vnaprej pripravljene dokumente, na primer potrdilo o plačilu ali poročilo o uskladitvi. Ti dokumenti so ustvarjeni v 1C v skladu z uveljavljenimi zahtevami, njihova implementacija v Python pa bo trajala veliko časa. Zato je bolje ustvariti dokumente v 1C in jih shraniti v formatu Excel.

Dokument usklajevalnega poročila torej nastane s posebno zunanjo obdelavo. Za tiste, ki ne poznate terminologije 1C: obdelava je samostojen program, ki ima svoj modul, obrazce, predloge, zasnovane za delovanje v okolju 1C. Potrebno je inicializirati obdelavo, izpolniti njene podrobnosti in poklicati funkcijo, ki nam bo vrnila dokument preglednice, namenjen ogledu v 1C. Ta dokument je treba shraniti v formatu Excel in ga kopirati na strežnik ali zabeležiti v bazi podatkov.

Povezava = getattr(V82.Catalogs, "Sistemska poročila").FindByDescription("Poročilo o usklajevanju Ellen") nav_url = V82.GetURL(povezava, "Poročilo") name = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports. Create (name) setattr(ExternalReport, "PersonalAccount", reference) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report() report .account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

Zgornji fragment naredi naslednje: Obdelava, ki generira dokument, je povezana. Obdelava je lahko vgrajena v konfiguracijo, shranjena na disku ali v bazi podatkov 1C (v nekem imeniku). Ker se obdelava pogosto spreminja, je obdelava, ki se najpogosteje spreminja, shranjena v imeniku »Sistemska poročila«, v atributu »shramba vrednosti« z imenom Poročilo, da ne bi vsakič posodobili konfiguracije. Obdelavo lahko inicializirate tako, da jo razložite iz baze podatkov na disk in jo naložite ali uporabite metodo GetURL(), ki ji morate posredovati povezavo do elementa imenika in ime atributa. Prejetemu objektu obdelave dodelimo vrednosti podrobnosti, pokličemo izvoženo funkcijo GetDoc() in prejmemo dokument preglednice, ki se shrani v začasno datoteko Excel. Vsebina te datoteke je zapisana v bazo podatkov SQlite.

Zadnja stvar, ki jo je treba upoštevati, je programski vnos podatkov v 1C. Predpostavimo, da morate vnesti pričevanja naročnikov. Če želite to narediti, je dovolj, da ustvarite in izvedete dokument »Akt o jemanju pričevanja«:

#coding=cp1251 acts = getattr(V82.Documents, "Act of Taking Testimony") act = acts.CreateDocument() setattr(act, "Testimony", 1024.23) setattr(act, "Subscriber", "Ivanov") # Polnjenje v drugih podrobnostih... act.Write()
Vnos podatkov je zdaj avtomatiziran.

Tako sem orisal metodo, ki temelji na programskem nalaganju in prenosu podatkov prek povezave COM. Ta metoda v moji organizaciji uspešno deluje že skoraj eno leto. Baza podatkov, oblikovana iz 1C, služi 3 plačilnim sistemom, internetnemu pridobivanju (plačilo s karticami prek interneta), pa tudi osebnemu računu. Poleg tega so različni skripti povezani z bazo podatkov za avtomatizacijo rutine.

Kljub pomanjkljivostim metode (počasna hitrost povezave COM) na splošno deluje stabilno. Imamo podatke v obliki, neodvisni od platforme (SQLite), s katerimi je mogoče delati iz katerega koli jezika. In glavni del kode je napisan v Pythonu, kar pomeni, da je na voljo veliko orodij in tehnik, o katerih v 1C ne morete niti sanjati.

To je eden od možnih načinov interakcije z 1C. Prepričan sem, da ni nov in da ga je verjetno že kdo preizkusil in optimiziral. Vendar sem skušal predstaviti čim več podrobnosti postopka, da bi vas obvaroval pred pastmi, na katere sem stopil tudi sam.

Vsem vam želim veliko sreče in ne pozabite, da 1C ni tako strašljiv, kot se predstavlja!