V8: COM veza. Tri stupa rada s COM objektima. Rad preko COM veze lakši je nego što mislite 1s 8.3 stvaranje novih COM objekata

Jedna od mogućnosti razmjene podataka između 1C baza podataka je razmjena putem COM veze.

Pomoću COM veze možete se povezati s jedne 1C baze podataka na drugu i čitati ili pisati podatke. Ova se metoda može koristiti i u klijent-poslužiteljskim verzijama baza podataka i u bazama podataka datoteka. U ovom članku ćemo pogledati primjere ove vrste veze. Primjeri koriste platformu 8.2.

Za aplikaciju 1C možete stvoriti dvije vrste COM objekata. Ovaj V82.Primjena I V82.COMKonektor. U slučaju V82.Primjena Pokrenuta je gotovo potpuna kopija aplikacije 1C. u slučaju upotrebe V82.COMKonektor Pokrenut je mali poslužiteljski dio.
Brzina rada u ovom slučaju je veća, ali neke funkcije možda neće biti dostupne. Konkretno, rad s obrascima i zajedničkim modulima za koje nije postavljeno svojstvo rada s vanjskim vezama. Uglavnom biste trebali koristiti V82.COMKonektor i to samo u slučaju nedostatka funkcionalnosti V82.Primjena. Razlika u brzini rada može biti posebno uočljiva na bazama podataka velikog volumena.

Pa počnimo

  1. Kreirajmo COM objekt
    • Za V82.Primjena Connection = New COMObject("V82.Application" ) ;
    • Za V82.COMKonektor Veza = Novi COMObject("V82.COMConnector" ) ;
  2. Kreirajmo niz veze
    • za poslužiteljsku verziju baze podataka ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • za verziju datoteke baze podataka ConnectionString = "File = " "PathKBase" "; Usr = Korisničko ime; Pwd = Lozinka";
  3. Povezivanje s bazom podataka Pokušaj povezivanja = Povezivanje. Poveži(Niz veze) ; Poruka o iznimci = Nova porukaKorisniku; Poruka. Tekst = + Opis greške() ; Poruka. Prijaviti() ; EndAttempt ;
  4. Prekid veze s bazom podataka Veza = Nedefinirano;

    Za objekt V82.Primjena Potrebno je prekinuti vezu jer će u protivnom ostati nedovršena sesija, koju ćete zatim morati ručno izbrisati. U slučaju V82.COMKonektor veza se automatski prekida kada se završi procedura u kojoj je veza napravljena. I postoji još jedna sitnica.

    Za korisnika pod kojim se uspostavlja veza, potvrdni okvir "Zatraži potvrdu pri zatvaranju programa" mora biti isključen u njegovim postavkama.

Sada spojimo sav kod

Connection = New COMObject("V82.Application" ) ; //Veza = Novi COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" "; Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "Datoteka = ""S:\MyBase""; Usr = Petya; Pwd = 123"; Pokušaj povezivanja = Povezivanje. Poveži(Niz veze) ; Poruka o iznimci = Nova porukaKorisniku; Poruka. Tekst = "Nije moguće povezati se s bazom podataka"+ OpisPogreška() ; Poruka. Prijaviti() ; EndAttempt ; Veza = Nedefinirano;

Za vrstu veze V82.Primjena metoda se koristi za COM objekt koji je inicijalno kreiran i za V82.COMKonektor metoda se primjenjuje na vezu. Zatim se zahtjev obrađuje pomoću standardnih 1C alata. u kodu to izgleda ovako:

Zahtjev = Veza. NewObject("Zahtjev" ); // Za V82.COMKonektor Zahtjev = Veza. NewObject("Zahtjev" ); // Za V82.Primjena Zahtjev. Tekst = "SELECT | Položaji organizacija, | Položaji organizacija. Naziv|OD | Adresar pozicija organizacija AS Položaji organizacija"; Rezultat = Upit. Trčanje();

Uzorak = rezultat. Odaberite() ; Zbogom selekciji. Next() Loop EndLoop ; Za verziju 1C:Enterprise 8.3 sve ostaje nepromijenjeno osim što prilikom kreiranja COM objekata morate koristiti "V83.COMConnector".

ili

"V83.Aplikacija"

Ispis (Ctrl+P)

Jedna od mogućnosti razmjene podataka između 1C baza podataka je razmjena putem COM veze. Koristeći COM vezu, možete se povezati s jedne 1C baze podataka na drugu i čitati ili pisati podatke. Ova se metoda može koristiti i u klijent-poslužiteljskim verzijama baza podataka i u bazama podataka datoteka. Ovaj članak govori o ovim vrstama veza na platformi 8.3 com veza Za aplikaciju 1C možete stvoriti dvije vrste COM objekata. Ovo su stare veze V83.Primjena . U slučaju com veza i com veze V83.Primjena V83.COMKonektor V83.Primjena i to samo u slučaju nedostatka funkcionalnosti com veza Pokrenuta je gotovo potpuna kopija aplikacije 1C. U slučaju korištenja Pokrenut je mali poslužiteljski dio. Brzina rada u ovom slučaju je veća, ali neke funkcije možda neće biti dostupne. Konkretno, rad s obrascima i zajedničkim modulima za koje nije postavljeno svojstvo rada s vanjskim vezama. Uglavnom biste trebali koristiti

. Razlika u brzini rada može biti posebno uočljiva na bazama podataka velikog volumena. Za platformu 8.2 korišteno

V82.Application ili V82.COMConnector

Uspostavite OLE vezu

Veza = Novi COMObject(“V83.Application” ) ;

Uspostavite COM vezu

Veza = Novi COMObject(“V83.COMConnector” ) ;
Niz veze//Za opciju klijent-poslužitelj
/Niz veze
Niz veze= “Datoteka = ““PathKBase” “; Usr = Korisničko ime; Pwd = lozinka”;
Pokušaj
Veza = Veza . Spojiti(Niz veze) ;
Iznimka
Poruka = ​​Nova porukaKorisniku;
Poruka . Tekst = "Nije moguće povezati se s bazom podataka" + DescriptionErrors(); Poruka . Prijaviti();
EndAttempt ;

Isključivanje

Veza = Nedefinirano;
Za objekt com veza Potrebno je prekinuti vezu jer će u protivnom ostati nedovršena sesija, koju ćete zatim morati ručno izbrisati. U slučaju V83.Primjena veza se automatski prekida kada se završi procedura u kojoj je veza napravljena. I postoji još jedna sitnica. Za korisnika pod kojim se uspostavlja veza, potvrdni okvir "Zatraži potvrdu pri zatvaranju programa" mora biti isključen u njegovim postavkama.

NewObject() metoda

Da biste stvorili novi objekt, možete koristiti metodu NewObject(), na primjer:

Za V83.Primjena

ZahtjevCOM = Veza. NewObject( "Zahtjev") ;
TableCOM = Veza. NewObject( “Tablica vrijednosti”) ;
ArrayCOM = Veza. NewObject(“Niz”);

ViewCOM = Connection.NewObject

Za com veza

ZahtjevOLE = Veza. NewObject(“ zahtjev ") ;
TableOLE = Veza. NewObject(“Tablica vrijednosti”) ;
ArrayOLE = Connection.NewObject("Niz");
ViewCOM = Connection.NewObject(“JedinstveniIdentifier”, StringUID);

ZahtjevCOM . Tekst =„IZABIRAJ
| Položaji organizacija,
| Položaji organizacija. Naziv
|OD | Imenik. Položaji organizacija
KAKO DO POZICIJA ORGANIZACIJA”;

Proizlaziti = ZahtjevCOM. Trčanje();
Uzorak = Rezultat. Odaberite ();
Zbogom odabiru. Sljedeći()Ciklus
Kraj ciklusa ;
Također možete koristiti upravitelje konfiguracijskih objekata:
ImenikCOM = Veza. Imenici. ime imenika;
DokumentCOM = Veza. Dokumentacija. Naziv dokumenta;
RegisterCOM = Veza. Informacijski registri. RegistarName ;

Primanje i uspoređivanje popisivanja putem COM veze

Za usporedbu vrijednosti elemenata enumeracije definiranih u konfiguraciji, potrebno je te elemente pretvoriti u jedan od primitivnih tipova čija je usporedba laka. Takvi tipovi mogu biti ili numerički tip ili tip niza. Možete pretvoriti vrijednost elementa nabrajanja u numerički tip ovako:

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

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

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

If EnumerationItemNumber = 0 Then Report( “EnumerationValue1”);

ElseIfEnumerationItemNumber = 1 Zatim Izvješće ("EnumerationValue2");

završi ako;

Dohvaćanje objekta putem COM-a prema identifikatoru

Preko upravitelja konfiguracijskih objekata dobivamo com objekt, na primjer:
DokumentCOM = Veza. Dokumentacija. Naziv dokumenta;

Tada dobivamo jedinstveni niz identifikatora:

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

Identifikator = New U jedinstveniIdentifier(StringUID);
S linkByIdentifier = Dokumenti[DocumentName].GetLink(Identifier);

Ako trebate pronaći com objekt prema dokumentu prema identifikatoru, tada morate pisati ovako:

WidCOM = Veza.NoviObjekt(“JedinstveniIdentifier”, StringUID);
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

Jedan od načina prijenosa podataka iz jedne konfiguracije 1C u drugu je softverska veza pomoću COM-a. Mnoge tvrtke koriste nekoliko različitih baza podataka, između kojih moraju postojati određene veze i ovisnosti. Ako je potrebno ne samo prenijeti podatke, već i izvršiti određenu obradu podataka, tada će COM veza biti optimalan mehanizam. Mogućnost analize podataka iz druge baze podataka 1C korisna je svakom programeru.

Povezujemo se putem COM-a s bazom podataka 1C

Za implementaciju COM veze u 1C koristi se poseban mehanizam nazvan COMConnector. Ovaj objekt je instaliran zajedno s platformom i služi za povezivanje infobaza. Treba napomenuti da se za verzije 8.2 i 8.3 koriste objekti s različitim nazivima - "V82.COMConnector" i "V83.COMConnector", respektivno.

Ne zaboravite da trajanje COM veze s bazom podataka košta licencu - nemojte se zanositi istovremenim izvođenjem nekoliko veza. Ovo je posebno važno za organizacije koje imaju ograničen broj licenci. Ovaj se problem može riješiti uz pomoć rutinskih zadataka koji se izvode kada nema aktivnih korisničkih veza s informacijskom bazom.

Da biste se mogli spojiti na drugu bazu podataka i zatražiti potrebne podatke, morate znati sljedeće podatke:

  1. Koja je to vrsta - datoteka ili klijent-poslužitelj;
  2. Gdje se nalazi;
  3. Koje ime i lozinku možete koristiti za prijavu?
  4. Koji podaci vas zanimaju?

Od prve tri točke, da biste implementirali COM vezu, trebate generirati niz parametara. Ovisno o vrsti informacijske sigurnosti, razlikovat će se po izgledu. Pomoću primljenog niza uspostavlja se veza pomoću koje možete prikupiti podatke iz druge baze podataka za analizu i obradu bilo kojim metodama.

Parametri vezeFileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Password"""; Parametri vezeClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Password""";

Funkcija povezivanja je jednostavna i ne bi trebala postavljati pitanja ako su svi parametri točno navedeni. Kako biste ubrzali otklanjanje pogrešaka i analizu mogućih pogrešaka, bolje je priložiti vezu u konstrukciju "Pokušaj". Funkcija će vratiti vrijednost tipa "COM object", s kojom ćete raditi na dobivanju potrebnih podataka.

&OnServer funkcija ConnectToBase() exportConnectionIB Parametri = "File=""E:\1c baza podataka\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Novi COMObject("V83.COMConnector"); Pokušaj povratka V83COMCon.Connect(IB Parametri veze); Izvješće o iznimci(Opis pogreške()); Povratak Nedefinirano; EndAttempt; EndFunction

Preko COM veze možete ne samo odabrati podatke, već ih i dodati u bazu podataka na koju se povezujete. Zapamtite da možemo prenijeti 4 primitivna tipa podataka putem COM objekta. Druge vrste morat će se specificirati pomoću funkcija pretraživanja ugrađenih u platformu. Imajte na umu da se funkcije globalne platforme također pozivaju putem COM veze.

Podatke primamo iz baze podataka 1C

Nakon što ste primili željeni objekt potrebno je očitati podatke iz druge baze podataka. Da bismo to učinili, koristimo zahtjev putem COM veze u 1C 8.3 koristeći primljenu vrijednost tipa "COM objekt" iz funkcije. Važno je prvo se spojiti na bazu podataka, a zatim izvršiti zahtjev. Izvršenje se odvija kroz metodu NewObject, specificirajući tip objekta u obliku niza kao parametar - "Zahtjev".

&OnServer postupak TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "SELECT prvih 15 | DirectoryUser.Name AS Name |FROM | Directory.users AS DirectoryUser"; Odaberite = RequestBPZO.Execute().select(); While Selection.next() petlja Report(Selection.Number); EndCycle; završi ako; Kraj postupka >

Na primjer, za dobivanje informacija o korisnicima određenog odjela, postavit ćemo uvjet u zahtjevu kroz parametre. Jedan parametar bit će jednostavnog tipa - niz, a odjeljak će biti poveznica na element imenika "Struktura poduzeća". Rezultat upita je tablica s navedenim poljima tipa da postoje u bazi podataka na koju je došlo do COM veze. Ako ih trebate pretvoriti u druge vrste, upotrijebite standardne funkcije platforme:

  • Crta();
  • Broj();
  • Datum od().
ZahtjevBPZO = Connection.NewObject("Zahtjev"); RequestBPZO.Text = "SELECT prvih 15 | DirectoryUser.Name AS Ime | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | I DirectoryUser.Name poput ""%"" + &RequiredName+ ""%""" ; Zahtjev BPZO.SetParameter("Potrebni odjel", Veza. Imenici. Struktura poduzeća. Traži po kodu("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Odaberite = RequestBPZO.Execute().select(); Dok Selection.next() petlja Report(Selection.Name); EndCycle;

Ako trebate prenijeti niz u bazu podataka za odabir na temelju nekoliko parametara, na primjer, odjela, također se koristi naredba NewObject. Slično, možete proslijediti popis ili tablicu vrijednosti, ispunjavajući ih elementima druge baze podataka putem veze. Sve postojeće metode objekata i mehanizama platforme dostupne su vam za pretraživanje.

RequestBPZO = Connection.NewObject.("Request"); RequestBPZO.Text = "SELECT prvih 15 | DirectoryUser.Name AS Ime | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | I DirectoryUser.Name kao ""%"" + &NecessaryName+ ""%" " "; Niz odjela = Connection.NewObject("Niz"); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000023")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000038")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000046")); RequestBPZO.SetParameter("RequiredDepartment", Array ofDepartments); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Odaberite = RequestBPZO.Execute().select(); Dok Selection.next() petlja Report(Selection.Name); EndCycle;

Prilikom prijenosa dokumenata ili elemenata imenika uvijek se postavlja pitanje kontrole prijenosa određenog objekta. Uz pomoć COM veza, takvi se problemi mogu riješiti jedinstvenim identifikatorom. Morate pronaći objekt u bazi podataka dodatka prema identifikatoru iz trenutne informacijske sigurnosti pomoću funkcije "GetLink", koristeći identifikator kao niz. Ako nije pronađen, možete ga stvoriti pomoću COM veze.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Ako NIJE ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) then NewUser = Connection.Directories.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Name; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual; NewUser.Write(); završi ako;

Također, COM veza ima pravo koristiti postupke i funkcije iz zajedničkih 1C modula s omogućenim svojstvom "Vanjska veza". Uz ovaj uvjet, pozvana funkcija ili procedura mora biti izvozna i ne mora uključivati ​​interaktivne radnje koje se izvode na poslužitelju. U protivnom ćete vidjeti pogrešku o nevažećoj operaciji.

Spoj..; VariableFunction = Veza..; poziv funkcije>opći naziv modula>poziv procedure>opći naziv modula>

Mogućnosti vanjske veze s drugom bazom podataka u 1C prilično su opsežne i mogu vam omogućiti obavljanje mnogih zadataka. Važno je znati ispravno procijeniti alate i odabrati optimalno rješenje. U većini slučajeva ova se vještina pojavljuje samo s iskustvom ili proučavanjem primjera rada iskusnih stručnjaka.

) Tako je

U isto vrijeme, vidio sam više puta kada su publikacije koje nisu dosegle ni 10 bodova jednostavno "poletjele".
Zašto se to dogodilo? Očito zato što su se nekome očito sviđali.


To je ono što govorim, da bi bilo lijepo shvatiti koliko vam je to potrebno bez čitanja članka o ocjeni ili ga ocijeniti ne tako primitivno +/-. Što se tiče onoga što mi se svidjelo, ispravio bih to ovako: dobio je toliko zbog toga što su se zvjezdice posložile i što se okupilo puno ljudi na stranici i mnogima se svidjelo, sami razumijete da je to stvar slučaja jer Čim članak napusti glavnu stranicu, može se pronaći samo na zahtjev, pa svi prolaznici glasaju. I, koliko ja razumijem, stalni komentari = promocija članka omogućuju vam da ga zadržite na glavnoj stranici.
Upravo zbog toga postavljaju trgovine na javne ulice - uostalom, ono što često nije bitna kvaliteta i relevantnost robe, već prohodnost mjesta, ljudi koji hodaju često kupe nešto što će sutradan baciti radi procesa. Riječ je o svima odavno poznatoj bolesti – ovisnosti o kupovini. Ili jednostavno povećanje protoka povećava vjerojatnost pravog kupca.

A prednosti i mane... - ovo je samo neka vrsta "zahvale" za utrošeno vrijeme i rad


Oni. Računa li se i minus kao "hvala"? Htjela sam znati vaše mišljenje o tome treba li ga koristiti u takvim slučajevima i koliko je zanimljivo mišljenje drugih? Trebate li ga staviti kada je članak štetan/loš ili kada vam je jednostavno beskoristan/prazan?
Po mom mišljenju, članak izgleda kao jednostavno povećanje ocjene, jer:
1. Problem s tipovima koji sam citirao autor je potpuno zanemario, iako nije bio previše lijen da napiše hrpu komentara.
2. U članku postoji očita netočnost: kaže se da je to jedini način

V82 = Novi COMObject("V82.ComConnector"); Kod = AccountCOM.Code;


ali to mogu lako učiniti koristeći ovu obradu:

Izvješće(Baza. Imenici. Ugovorne strane. Traži po nazivu("LLC"). Kod);


i sve je u redu! I biram vezu V82.ComConnector
Nekako je čudno da autora uopće nije briga što njegov članak sadrži probleme na koje je ukazano, ali ni na koji način ne reagira.
3. Ali i dalje postoji problem kada se pojavi pogreška "Klasa ne postoji".
4. Ali postoji problem kada se instalira 8.2, a zatim 8.1 - pokušajte razmjenu preko OLE/COM sa standardnom UT-BP razmjenom!
5. Možete li navesti glavnu obradu na stranici koja vam omogućuje univerzalno povezivanje putem OLE/COM tako da početnici ne gube vrijeme, vi pišete za njih! Usput, iz nekog razloga je njena slika na vašem ekranu, zašto? I kao rezultat, 2 riječi o meritumu, i još 6 iza scene.

Općenito, ne bacam blato, već ukazujem na određene nedostatke, ali reakcija je nula. Ako je to iskustvo koje dijelite, onda je ono na neki način pogrešno i nepotpuno.
Želim reći da ako je autor imao želju sakupiti sve kvarove, mogao je barem poslušati tuđa iskustva, a ne nabacivati ​​komentare. Odmah nastane situacija da onaj tko je pročitao zna više od autora, kažu mu (ponekad i netočno), a on uzvraća. Kao rezultat toga, sve informacije nisu u članku, već u komentarima! smiješno! To se često događa, ali ne trebate se fokusirati na to da ste željeli najbolje - ja pokažem što je najbolje, a drugi to pokažu! Uključite ovo u članak i bit će vrijedno; neće svi biti zainteresirani za čitanje ovog okršaja.

Pozdrav Khabrachans!

U ovom članku želim govoriti o tome kako je integracija s 1C platformom uspostavljena u mojoj organizaciji. Na to me potaknuo gotovo potpuni nedostatak tehničkih informacija o ovoj temi. Čitajući razne članke i izvješća na temu povezivanja 1C s bilo kojim informacijskim sustavom, iznova se uvjeravate da su svi oni marketinške, demonstracijske prirode, a nikada tehničke, odražavajući problem i bit njegovog rješenja.

Upozoravam vas da ova metoda ni na koji način ne tvrdi da je univerzalna. Budući da postoji mnogo samih 1C konfiguracija, a još više informacijskih sustava, jezika i platformi, broj mogućih kombinacija je ogroman. Moj cilj je pokazati jedno moguće rješenje.


Odabrao sam Python kao jezik koji će biti integriran s 1C. Vrlo je prikladan za automatizaciju procesa. To je olakšano minimalizmom sintakse (kod se upisuje vrlo brzo), bogatom standardnom bibliotekom (manja potreba za modulima trećih strana), više platformi - s velikom vjerojatnošću, kod napisan u Linix OS-u će uspješno raditi na Windowsima .

Za početak ću navesti podatke s kojima ćemo raditi. Organizacija je tvrtka za prodaju energije u regiji Dalekog istoka - opslužuje oko 400 tisuća pretplatnika, baza podataka 1C temelji se na prilagođenoj konfiguraciji. Za svakog pretplatnika pohranjuju se njegova plaćanja, naknade, potrošene usluge i sheme obračuna, brojila, očitanja i mnogi drugi podaci.

Jednom davno, organizacija je imala program napisan u Delphiju koji je koristio MSSQL/Firebird kao bazu podataka. U ta slavna vremena mogli ste se spojiti na bazu podataka koristeći bilo koji jezik i izvršiti mnoge radnje - odabrati pretplatnike dužnike, knjižiti primljene uplate, bilježiti očitanja instrumenata. Nije iznenađujuće da kolekcija skripti koje automatiziraju rutinu neprestano raste. Programeri mogu izvesti bilo koju radnju bez otvaranja samog programa.

Jao, prelaskom na 1C, besplatno je završilo - više se nije bilo moguće izravno povezati s bazom podataka. Općenito, sama platforma 1C je nedjeljiva i nije podložna integraciji s drugim sustavima. Ona je, kako kažu, stvar za sebe. Prilikom učitavanja podataka u 1C, trebali biste zapamtiti da njihovo izdvajanje od tamo neće biti tako lako. Ali s obzirom na činjenicu da je organizacija trebala implementirati sustave plaćanja i osobni račun, bilo je potrebno pronaći neko rješenje.

Glavni zadaci s kojima sam se suočavao bili su mogućnost brzog dobivanja podataka o određenom osobnom računu - puno ime, adresa, mjerni uređaji, očitanja instrumenata, plaćanja, naknade. Plus generiranje dokumenata - izvješće o usklađivanju, potvrda o uplati. Dakle, ne postoji mogućnost izravnog povezivanja s bazom podataka - svatko tko je pogledao 1C bazu podataka na SQL poslužitelju vidio je da je teško razumjeti masu tablica poput aaa1, aaa2. Ali izrada upita s takvim nazivima tablica i polja jednostavno je nerealna. Osim toga, mnoge 1C tablice (posebno one najvažnije, kao što je isječak najnovijih, stanja i okretaja) su virtualne i razbacane po različitim fizičkim tablicama, prikupljene višestrukim spajanjima. Ova metoda nije prikladna.

Platforma 1C pruža mogućnost povezivanja s njom putem COM veze. Kao i mnogi Windows programi, tijekom instalacije 1C u sustavu se registriraju dva COM objekta - Automation Server i COM Connector. S oba objekta se može raditi pomoću jezika koji podržava COM tehnologiju.

Objekt Automation Server je 1C aplikacija, gotovo se ne razlikuje od obične klijentske aplikacije. Razlika je u tome što je dodatno moguće programski kontrolirati instancu aplikacije. Kada radite s objektom COM konektora, pokreće se lagana verzija aplikacije 1C, u kojoj obrasci, kao i funkcije i metode povezane sa sučeljem i vizualnim efektima, nisu dostupni. Sama aplikacija pokreće se u načinu rada "Vanjska veza". Inicijalizacija globalnih varijabli (na primjer, određivanje trenutnog korisnika i njegovih postavki) mora se izvršiti u modulu vanjske veze 1C. Ako u načinu vanjskog povezivanja kod poziva funkciju koja nije dostupna u ovom načinu rada, izbacit će se iznimka (koja će biti proslijeđena našoj Python skripti). Pozivi nesigurnim funkcijama trebaju biti uokvireni konstruktima obrasca

#If NOT an OuterJoin Then Warning("Hello!"); #Završi ako

Budući da je rad s COM objektima isključivo Windows tehnologija, ne čudi što nije uključena u standardnu ​​distribuciju Pythona. Morat ćete instalirati proširenje - skup modula koji pružaju sve potrebne funkcije za programiranje pod Windowsima u Pythonu. Može se preuzeti kao unaprijed izgrađeni exe instalacijski program. Samo proširenje omogućuje pristup registru, uslugama, ODBC, COM objektima itd. Kao alternativu, možete odmah instalirati distribuciju ActiveState Python, koja dolazi s ekstenzijom Win32.

Neko sam vrijeme eksperimentirao s COM vezom u razvoju web aplikacija, posebno osobnog računa. Identificirani su sljedeći nedostaci:

COM veza je spora. Slaba izvedba dobro je poznata mana COM tehnologije.
- Proces uspostavljanja veze s 1C, ovisno o konfiguraciji, može trajati od 1 do 8 sekundi (u mom slučaju - 6 sekundi). Nepotrebno je reći da će uspostavljanje veze za svaki zahtjev rezultirati učitavanjem svake stranice 8 sekundi.
- Budući da web aplikacije u Pythonu rade kao neovisni poslužitelji, prethodna točka može se kompenzirati pohranjivanjem veze u neku globalnu varijablu i vraćanjem iste u slučaju pogreške. Da budem iskren, još nisam razmišljao o tome kako održati vezu u PHP-u.
- Izgubljena je multiplatformska funkcionalnost web aplikacije.

Na temelju gore navedenih točaka, odlučeno je promijeniti načelo interakcije, podijelivši ga u 2 dijela - prvi ovisan o platformi (temeljen na prozoru), učitavajući 1C podatke u bilo koji prikladan format, a drugi, neovisan o platformi, sposoban za rad s podacima ne sumnjajući ništa o 1C u načelu.

Strategija djelovanja je sljedeća: Python skripta povezuje se s 1C, izvršava potrebne upite i učitava podatke u SQLite bazu podataka. Možete se spojiti na ovu bazu podataka iz Pythona, PHP-a, Jave. Većina naših projekata radi u Pythonu, a budući da ne mogu podnijeti ručno pisanje neobrađenih SQL upita, sav rad sa SQLite bazom podataka obavlja se putem SQLAlchemy ORM-a. Sve što je bilo potrebno je opisati strukturu podataka baze podataka u deklarativnom stilu:

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 = Stupac(Unicode(32), index=True) code = Stupac(Unicode(32)) adresa = Stupac(Unicode(512)) fio = Stupac(Unicode(256)) izvor = Stupac(Unicode(16) ) psu = Kolona(Unicode(256)) tso = Kolona(Unicode(256)) np = Kolona(Unicode(256)) ulica = Kolona(Unicode(256)) kuća = Kolona(Integer) flat = Kolona(Integer) mro = Stupac(Unicode(256)) klasa Plaćanje(Baza): __tablename__ = "plaćanja" # i tako dalje...

Sada samo trebate uvesti ovaj modul u bilo koji Python projekt i možete raditi s podacima.

Predviđam vaše pitanje - "zašto SQLite"? Glavni razlog je taj što je baza podataka samo za čitanje, pa nas problemi s pisanjem u SQLite ne bi trebali brinuti. Drugo, format ovog DBMS-a je prikladan - lakše ga je pregledati (postoji mnogo besplatnih uslužnih programa, uključujući super proširenje za FireFox). Treće, u nekim slučajevima bilo je potrebno dobiti pristup pretplatnicima sa strojeva koji nemaju vezu s MySQL poslužiteljem. U ovom slučaju dovoljno je kopirati SQLite datoteku baze podataka i ovaj stroj će imati pristup svim informacijama.

Istovar se događa jednom dnevno noću. Unos podataka u 1C može se automatizirati na isti način. Na primjer, potrebno je zabilježiti očitanja koja su pretplatnici ostavili na web stranici osobnog računa. U ovom slučaju ponovno se povezujemo s 1C i programski stvaramo i knjižimo dokument „Akt očitanja“. Navest ću kôd u nastavku.

Rad s COM objektima u Pythonu pomalo je neobičan. Prvo, izgubljena je "Pythonicity" koda - pravila za imenovanje varijabli i funkcija u 1C, blago rečeno, ne odgovaraju zenu Pythona. Drugo, svi znaju da su 1C objekti često imenovani ćiriličnim znakovima, što će uzrokovati probleme pri razvoju u Pythonu... ali oni se mogu riješiti. Predlažem da pogledate kod:

Import pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=username;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Poveži(V82_CONN_STRING)

Kao što se može vidjeti iz koda, klijent je inicijaliziran za rad s 1C. COM objekt definiran je imenom “V82.COMConnector”. Imajte na umu da je ovo ime važeće za platformu V8.2, ako imate verziju 8.1, tada će naziv biti "V81.COMConnector".

Pozivamo Connect() metodu na inicijaliziranom klijentu, prosljeđujući mu niz veze. Niz se sastoji od imena poslužitelja, baze podataka, korisnika i lozinke. Rezultirajući objekt V82 pohranjuje vezu s aplikacijom 1C. Nema metodu Disconnect() ili nešto slično. Za prekid veze s bazom podataka jednostavno izbrišite objekt iz memorije pomoću funkcije del() ili ga dodijelite varijabli None.

Imajući objekt, možete pristupiti svim poljima i metodama globalnog konteksta 1C, raditi s univerzalnim objektima kao što su TabularDocument, ValueTable itd. Važno je napomenuti da kada radite putem COM veze, 1C radi u načinu rada "Vanjska veza". Ne dopušta nikakve interaktivne funkcije, kao što su skočni dijalozi, obavijesti i, što je najvažnije, obrasci. Siguran sam da ćete više puta proklinjati programere konfiguracije koji najvažniju funkcionalnost zatvaraju u proceduru Button1Press() u modulu obrasca dokumenta.

Razgovarajmo o tako važnoj stvari kao što su atributi ćirilice. Unatoč činjenici da je 1C dvojezično okruženje i za svaku rusku metodu postoji analog na engleskom jeziku, prije ili kasnije morat ćete se okrenuti atributu ćirilice. Ako to ne uzrokuje probleme u PHP ili VBSCript jezicima,

Postavi Con = CreateObject("v81.COMConnector") Postavi v8 =Con.Connect("Niz veze") Postavi AccountsManager = v8.Documents.Accounts.... Postavi AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... AccountsRecord.Write()

Tada će se Python kod jednostavno srušiti uz sintaktičku pogrešku. Što uraditi? Urediti konfiguraciju? Ne, dovoljno je koristiti metode getattr i setattr. Prosljeđivanjem COM objekta i ćiriličnog naziva atributa ovim funkcijama, možete dobiti i postaviti vrijednosti u skladu s tim:

#coding=cp1251 katalog = getattr(V82.Katalozi, "Osobni računi")

Važno je sljedeće: nazivi detalja, kao i parametri funkcija i metoda moraju se prenijeti u cp1251 kodiranju. Stoga, kako bi se unaprijed izbjegla zabuna s kodiranjem, ima smisla deklarirati ga na početku datoteke: #coding=cp1251. Zatim možete proslijediti nizove bez brige o njihovom kodiranju. Ali! Svi nizovi primljeni od 1C (rezultati pozivanja funkcija, upiti) bit će u UTF-8 kodiranju.

Primjer koda koji izvršava upit u 1C okruženju, ponavlja rezultat i sprema bazu podataka u SQLite:

#coding=cp1251 q = """ SELECT Osobni računi. Šifra AS kod, Osobni računi. Zgrada. Naselje. Ime + ", " + Osobni računi. Kratka adresa AS adresa, Osobni računi. Pretplatnik. Naziv AS fio, Osobni računi. Odjel AS EXPRESS (Karakteristike Posljednjih Računa. Naziv AS. Zgrada Osobnih Računa ulica, Osobni računi. Kuća AS personal S, couple.MainRoom.RoomNumber AS stan , PersonalAccounts.Division.Name AS mro FROM Directory.PersonalAccounts LEFT CONNECTION RegisterInformation.CharacteristicsPersonalAccounts.SliceLast(, TypeCharacteristics = VALUE(Directory. Vrste karakteristika.Geografski mrežna organizacija) AS Karakteristike Osobni računi Najnoviji osobni računi Veza = Karakteristike Osobni računi Najnoviji objekt """ query = V82.NewObject("Query", q) selection = query. Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() dok odabir.Next(): abonent = modeli.Abonent() abonent.account = selection.code.strip( ) abonent.code = selekcija.kod abonent.fio = selekcija.fio abonent.address = selekcija.adresa abonent.psu = selekcija.psu abonent.tso = selekcija.tso abonent.source = u"ASRN" abonent.np = selekcija. np abonent.street = selekcija.ulica abonent.house = selekcija.kuća abonent.flat = selekcija.stan abonent.mro = selekcija.mro CONN.add(abonent) CONN.commit()

Ovdje je CONN sesija povezivanja sa SQLite bazom podataka. Stvara se objekt upita i popunjava njegov tekst. Kao što je gore navedeno, tekst zahtjeva mora biti u cp1251, za koji se prvo deklarira kodiranje. Nakon izvršenja zahtjeva, svi pretplatnici se brišu u bazi kako se ne bi dodavali duplikati, zatim se dodaju u petlji i slijedi finalni commit.

U radu sa zahtjevima otkrio sam sljedeća pravila.

Kada birate polja, dodijelite im imena latiničnim slovima; bit će im mnogo prikladnije pristupiti putem selektora (točka), umjesto getattr().
- Odaberite samo primitivne tipove podataka: nizove, brojeve, datume i booleove. Nikada ne birajte poveznice na objekt (dokument, priručnik)! U ovom kontekstu, veze vam apsolutno nisu potrebne, a čak su i štetne, jer će svaki poziv poveznice ili metode rezultirati zahtjevom putem COM veze. Ako pristupite atributima veze u petlji, to će biti izuzetno sporo.
- Ako odaberete polje tipa Datum, ono će biti vraćeno kao PyTime objekt. Ovo je posebna vrsta podataka za prijenos datuma i vremena u COM vezi. Nije tako praktičan za rad kao s uobičajenim datumom i vremenom. Ako proslijedite ovaj objekt u int(), on će vratiti vremensku oznaku iz koje onda možete dobiti datum i vrijeme pomoću metode fromtimestamp().

Sada pogledajmo kako nastaju tiskani dokumenti. Činjenica je da se potrošaču mora dati mogućnost preuzimanja unaprijed pripremljenih dokumenata, na primjer, potvrde o plaćanju ili izvješća o usklađivanju. Ovi se dokumenti generiraju u 1C u skladu s utvrđenim zahtjevima; njihova implementacija u Python će oduzeti puno vremena. Stoga je bolje generirati dokumente u 1C i spremiti ih u Excel formatu.

Dakle, dokument izvješća o usklađenju generira se posebnom vanjskom obradom. Za one koji nisu upoznati s 1C terminologijom: obrada je samostalan program koji ima svoj modul, obrasce, predloške, dizajniran za rad u 1C okruženju. Potrebno je pokrenuti obradu, ispuniti njezine podatke i pozvati funkciju koja će nam vratiti tablični dokument namijenjen pregledu u 1C. Ovaj dokument potrebno je spremiti u Excel formatu i kopirati na poslužitelj ili zabilježiti u bazi podataka.

Link = getattr(V82.Catalogs, "System Reports").FindByDescription("Ellen Reconciliation Report") nav_url = V82.GetURL(link, "Report") 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() izvještaj .account = referenca.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

Gornji fragment čini sljedeće: Obrada koja generira dokument je povezana. Obrada se može ugraditi u konfiguraciju, pohraniti na disk ili u bazu podataka 1C (u nekom direktoriju). Budući da se obrada često mijenja, kako se konfiguracija ne bi ažurirala svaki put, obrada koja se najčešće mijenja pohranjuje se u direktorij "System Reports", u atributu "value storage" pod nazivom Report. Obrada se može inicijalizirati istovarom iz baze podataka na disk i učitavanjem ili uporabom metode GetURL(), kojoj je potrebno proslijediti poveznicu na element imenika i naziv atributa. Dodjeljujemo vrijednosti pojedinosti primljenom objektu obrade, pozivamo izvezenu funkciju GetDoc() i primamo dokument proračunske tablice koji se sprema u privremenu Excel datoteku. Sadržaj ove datoteke zapisuje se u SQlite bazu podataka.

Posljednja stvar koju treba razmotriti je programski unos podataka u 1C. Pretpostavimo da trebate unijeti svjedočanstva pretplatnika. Da biste to učinili, dovoljno je izraditi i provesti dokument "Akt uzimanja iskaza":

#coding=cp1251 acts = getattr(V82.Documents, "Act of Taking Testimony") act = acts.CreateDocument() setattr(act, "Testimony", 1024.23) setattr(act, "Subscriber", "Ivanov") # Ispunjavanje u ostalim detaljima .. act.Write()
Unos podataka sada je automatiziran.

Dakle, opisao sam metodu koja se temelji na programskom prijenosu i preuzimanju podataka pomoću COM veze. Ova metoda uspješno djeluje u mojoj organizaciji već gotovo godinu dana. Baza podataka, formirana od 1C, služi 3 sustava plaćanja, Internet Acquiring (plaćanje karticama putem Interneta), kao i osobni račun. Osim toga, različite skripte povezane su s bazom podataka za automatizaciju rutine.

Unatoč nedostacima metode (spora brzina COM veze), općenito funkcionira stabilno. Imamo podatke u obliku neovisnom o platformi (SQLite), s kojima se može raditi s bilo kojeg jezika. A glavni dio koda napisan je u Pythonu, što znači da su dostupni mnogi alati i tehnike o kojima u 1C ne možete ni sanjati.

Ovo je jedan od mogućih načina interakcije s 1C. Siguran sam da nije nov i vjerojatno ga je netko već testirao i optimizirao. Ipak, pokušao sam iznijeti što više detalja procesa kako bih vas zaštitio od zamki na koje sam i sam stao.

Želim vam svima puno sreće i zapamtite da 1C nije tako strašan kao što se predstavlja!