Primanje podataka putem com veze od 1s. Tri stupa rada s COM objektima. Rad preko COM veze lakši je nego što mislite. Uspostavite OLE vezu

Ispis (Ctrl+P)

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. 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 i com veze V83.COMKonektor . U slučaju V83.Primjena Pokrenuta je gotovo potpuna kopija aplikacije 1C. U slučaju korištenja V83.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 V83.COMKonektor i to samo u slučaju nedostatka funkcionalnosti V83.Primjena. 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

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

Uspostavite COM vezu

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

Niz veze

//Za opciju klijent-poslužitelj
Niz veze= “Srvr = ““Ime poslužitelja” “;Ref = “ “Bazno ime” ;
//Za opciju načina rada datoteke:
Niz veze= “Datoteka = ““PathKBase” “; Usr = Korisničko ime; Pwd = lozinka”;
Pokušaj
Veza = Veza . Spojiti(Niz veze) ;
Iznimka
Poruka = ​​Nova porukaKorisniku;
Poruka . Tekst = “Povezivanje s bazom podataka nije uspjelo” + DescriptionErrors(); Poruka . Prijaviti();
EndAttempt ;

Isključivanje

Veza = Nedefinirano;
Za objekt V83.Primjena Potrebno je prekinuti vezu jer će u protivnom ostati nedovršena sesija, koju je potrebno ručno obrisati. U slučaju V83.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.

NewObject() metoda

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

Za V83.COMKonektor

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

ViewCOM = Connection.NewObject

Za V83.Primjena

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

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

Proizlaziti = ZahtjevCOM. Trčanje();
Uzorak = Rezultat. Odaberite ();
Zbogom selekciji. 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 numerički ili vrsta niza. Možete pretvoriti vrijednost elementa nabrajanja u numerički tip ovako:

Enum Stavka = 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 Zatim Izvješće ("EnumerationValue2");

završi ako;

Dohvaćanje objekta putem COM-a prema identifikatoru

Preko upravitelja objekata konfiguracije 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);

Pozdrav Khabrachans!

U ovom članku želim govoriti o tome kako je integracija s 1C platformom uspostavljena u mojoj organizaciji. Ono što me na to ponukalo je gotovo potpuna odsutnost tehničke informacije 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, i informacijski sustavi, jezika i platformi - štoviše, 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), bogat standardna knjižnica(manja potreba za modulima trećih strana), više platformi - s velikom vjerojatnošću će kod napisan u Linix OS-u 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, s prelaskom na 1C, besplatno je završilo - više se nije bilo moguće izravno povezati s bazom podataka. Općenito, sama 1C platforma 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 prostor, trebalo je pronaći neko rješenje.

Glavni zadaci koji su stajali pred mnom bili su mogućnost brzog dobivanja podataka o određenom osobni račun- Ime i prezime, adresa, mjerni uređaji, očitanja brojila, 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. A 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 postoji dodatna prilika programska kontrola instanca 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 se pokreće u načinu rada "Vanjska veza". Inicijaliziranje globalnih varijabli (na primjer, definiranje trenutni korisnik i njegove postavke) moraju 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 sirovih 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): __nazivtablice__ = "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 - prikladniji je za pregled (ima ih mnogo besplatne komunalije, 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 kod ispod.

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. Divizija. Naziv AS psu, EXPRESS (Karakteristike osobnih računa Odsječak posljednjeg. Vrijednost AS imenika. Teritorijalne mrežne organizacije). Naziv AS tso, Osobni računi. Zgrada. Naseljeno mjesto. Naziv AS np, Osobni računi. Zgrada. Ulica. Naziv AS ulica, Osobni računi. Zgrada. Kuća AS kuća, Osobni račun a.MainRoom.RoomNumber AS stan , PersonalAccounts.Division.Parent.Name AS mro FROM Directory.PersonalAccounts AS PersonalAccounts LIJEVA VEZA 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 = 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 .street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.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 nazive latiničnim slovima; bit će im mnogo praktičnije 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 atributima veze pristupate 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 ispisani 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 dokumenti generiraju se u 1C u skladu s utvrđenim zahtjevima; njihova implementacija u Python će potrajati puno vremena. Stoga je bolje generirati dokumente u 1C i spremiti ih Excel format.

Dakle, dokument akta o usklađivanju generira se posebnim vanjska obrada. 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, povezuju se s bazom podataka razne skripte automatizirati rutinu.

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će načine interakcija 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!

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 krenimo

  1. Kreirajmo COM objekt
    • Za V82.Primjena Veza = Novi 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 je potrebno ručno obrisati. 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

Veza = Novi 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. dalje se radi sa zahtjevom standardnim sredstvima 1C. 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 Kodeks, | Položaji organizacija. Naziv|OD | Imenik. Položaji organizacija AS Položaji organizacija"; Rezultat = Zahtjev. 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".

) 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 ode početna stranica onda se već može naći samo po zahtjevu, a tako glasaju svi koji prolaze. I, koliko razumijem, stalni komentari = promocija članka omogućuju vam da ga zadržite na glavnoj stranici.
Upravo zato trgovine stavljaju na javne ulice - uostalom, često nije bitna kvaliteta i relevantnost robe, već prohodnost mjesta; ljudi koji hodaju često kupe nešto što će sutradan baciti, taman 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 zanimljivo drugi misle? 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. Pronađi po imenu("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 naznačiti 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 isplatit će se; nisu svi zainteresirani za čitanje ovog okršaja.

Jedan od načina za prijenos podataka iz jedne konfiguracije 1C u drugu je softverska veza koristeći COM. 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 komunikaciju informacijske baze. 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 pomoću rutinski poslovi izvršavanje kada nema aktivnih korisničkih veza s infobazom.

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 vas podaci zanimaju?

Od prve tri točke, da biste implementirali COM vezu, trebate stvoriti niz parametara. Ovisno o vrsti informacijske sigurnosti, ona će se razlikovati izgled. 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. Za ubrzanje otklanjanja pogrešaka i analize moguće greške bolje je spoj staviti u konstrukciju “Try”. 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 putem metode 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")); Zahtjev BPZO.SetParameter("Potrebni odjel", niz odjela); 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 uključuje 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 moći 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.