1c conectați-vă la conexiunea com existentă. Trei piloni ai lucrului cu obiecte COM

1c conectați-vă la conexiunea com existentă. Trei piloni ai lucrului cu obiecte COM

Una dintre opțiunile pentru schimbul de date între bazele de date 1C este schimbul printr-o conexiune COM.

Folosind o conexiune COM, vă puteți conecta de la o bază de date 1C la alta și puteți citi sau scrie date. Puteți utiliza această metodă atât în ​​versiunile client-server ale bazelor de date, cât și în baze de date de fișiere. În acest articol vom analiza exemple de acest tip de conexiune. Exemplele folosesc platforma 8.2.

Puteți crea două tipuri de obiecte COM pentru aplicația 1C. Acest V82.AplicațieŞi V82.COMConector. În cazul în care V82.Aplicație Este lansată o copie aproape completă a aplicației 1C. în caz de utilizare V82.COMConector Este lansată o mică parte de server.
Viteza de operare în acest caz este mai mare, dar este posibil ca unele funcții să nu fie disponibile. În special, lucrul cu formulare și module comune pentru care nu este setată proprietatea de a lucra cu conexiuni externe. În cea mai mare parte, ar trebui să utilizați V82.COMConectorși numai în caz de lipsă de funcționalitate V82.Aplicație. Diferența de viteză de operare poate fi vizibilă în special pe bazele de date cu volum mare.

Deci, să începem

  1. Să creăm un obiect COM
    • Pentru V82.Aplicație Conexiune = New COMObject("V82.Application" );
    • Pentru V82.COMConector Conexiune = New COMObject("V82.COMConnector");
  2. Să creăm un șir de conexiune
    • pentru versiunea de server a bazei de date ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • pentru versiunea de fișier a bazei de date ConnectionString = "File = " "PathKBase" "; Usr = Nume utilizator; Pwd = Parolă";
  3. Conectarea la baza de date Attempt Connection = Conexiune. Connect(ConnectionString) ;
  4. Mesaj de excepție = New MessageToUser; Mesaj. Text = + ErrorDescription() ;

    Mesaj. Raport () ; V82.Aplicație EndTempt ; V82.COMConector Se deconectează de la baza de date

    Pentru utilizatorul sub care se realizează conexiunea, caseta de selectare „Solicitare confirmare la închiderea programului” trebuie să fie dezactivată în setările acestuia.

Acum să punem tot codul împreună

Conexiune = New COMObject("V82.Application" ); //Conexiune = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "Fișier = ""C:\MyBase""; Usr = Petya; Pwd = 123"; Attempt Connection = Conexiune. Connect(ConnectionString) ; Mesaj de excepție = New MessageToUser; Mesaj. Text =

„Nu s-a putut conecta la baza de date” V82.Aplicație+ DescriereEroare() ; V82.COMConector Mesaj. Raport () ; EndTempt ; Conexiune = Nedefinit ;

Pentru tipul de conexiune metoda este folosită pentru obiectul COM care a fost creat inițial și pentru V82.COMConector metoda se aplică la conexiune. se lucrează în continuare cu cererea metoda este folosită pentru obiectul COM care a fost creat inițial și pentru V82.Aplicație mijloace standard 1C. in cod arata asa: Solicitare = Conexiune. NewObject("Solicitare");// Pentru Solicitare = Conexiune. NewObject("Solicitare"); Cerere. Text = „SELECT

| Pozițiile organizațiilor. | Funcțiile organizațiilor|DIN | Directorul de poziții ale organizațiilor AS..


;

Rezultat = Solicitare. Run();

  1. Eșantion = Rezultat. Alegeți() ; Pa selecție. Next() Loop EndLoop ; Pentru versiunea 1C:Enterprise 8.3 totul rămâne neschimbat, cu excepția faptului că atunci când creați obiecte COM trebuie să utilizați„V83.COMConnector” sau „V83.Aplicație” Cuvinte cheie: COM, conexiune, extern, OLE, Automatizare, Conectare, ComConnector, Srvr

  2. Când utilizați conexiuni COM 1C:Enterprise 8.0 pentru a accesa date, există următoarele avantaje în comparație cu utilizarea unui server Automation:
  3. Mai mult

instalare rapidă

  1. conexiuni, deoarece nu este nevoie să se creeze

  2. proces separat sistem de operare legat oarecum de organizarea interfeței de utilizator 1C:Enterprise 8.0;
  3. La lucru COM- conexiuni modulul aplicației de configurare 1C:Enterprise 8.0 nu este utilizat. Rolul său atunci când se lucrează cu o conexiune COM este jucat de modulul de conectare extern.

1.1 Procedura pentru stabilirea unei conexiuni COM

Pentru a organiza accesul la datele 1C:Enterprise 8.0 printr-o conexiune COM, se efectuează următoarea secvență de acțiuni:

  1. se creează un obiect COM cu identificatorul V8.COMConnector, cu ajutorul căruia se stabilește conexiunea;

  2. este apelată metoda Connect a obiectului V8.COMConnector creat anterior. Metoda Connect returnează o legătură către un obiect de conexiune COM cu baza de informații 1C:Enterprise 8.0;
  3. Prin obiectul de conexiune COM primit se accesează metodele, proprietățile și obiectele valide ale infobazei cu care se stabilește conexiunea.

Important! Din cauza lipsei unei interfețe cu utilizatorul într-o conexiune COM, nu toate obiectele, proprietățile și metodele pot fi utilizate într-o conexiune COM.

1C:Obiecte Enterprise accesibile extern printr-o conexiune COM:

  1. Variabilele exportate și procedurile/funcțiile modulului extern join

  2. Variabilele exportate și procedurile/funcțiile modulelor comune
  3. Includerea și excluderea modulelor întregi prin setarea proprietăților modulelor comune

  4. Includerea și excluderea fragmentelor de module comune folosind un preprocesor
  5. Context global 1C: Enterprise 8.0, cu excepția obiectelor strâns legate de aplicația client (TextDocument, TabularDocument, ...)

1.2 Modul de conectare extern

După cum sa menționat deja, responsabilitățile modulului de aplicație atunci când lucrează printr-o conexiune COM sunt îndeplinite de modulul de conexiune extern. Acest modul poate avea proceduri de gestionare a evenimentelor At SystemStart() și AtSystemComplete(), care pot conține acțiuni efectuate la inițializarea și, respectiv, terminarea conexiunii.

Proceduri, funcții și variabile globale definite în modulul de unire exterior cu cuvânt cheie Exporturile devin, ca și în cazul unui modul de aplicație, parte a contextului global.

1.3 Module comune

Proprietățile „Client”, „Server” și „Conexiune externă” au fost introduse pentru modulele comune. Acestea sunt destinate să determine în configurare utilizarea modulelor în versiunea client - server și în modul de conectare COM.

1.4 Obiect „V8.COMConnector”

Singura sarcină rezolvată de obiectul COM V8.COMConnector este stabilirea unei conexiuni COM cu baza de informații 1C:Enterprise 8.0. Un număr nelimitat de conexiuni poate fi stabilit folosind o instanță a obiectului V8.COMConnector. Obiectul V8.COMConnector are o singură metodă Connect, concepută pentru a stabili o conexiune COM cu baza de informații 1C:Enterprise 8.0.

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

Linia de legătură cu sistemul de securitate a informațiilor este un lanț de fragmente de forma Parametru=Valoare. Fragmentele sunt separate unele de altele prin „;”. Dacă valoarea conţine caractere cu spații albe, atunci trebuie să fie cuprins între ghilimele duble (").

Parametri generali:

Usr - nume de utilizator;
Pwd - parola.

Următorul parametru este definit pentru versiunea fișierului:

Fișier - directorul bazei de informații.

Următorii parametri sunt definiți pentru opțiunea client-server:

Srvr - 1C:Nume server Enterprise;
Ref - numele bazei de informații de pe server.

Metoda Connect stabilește o conexiune COM la baza de informații 1C:Enterprise 8.0 și returnează un link către obiectul conexiune COM.

// Este creat un obiect conector
V8 = New COMObject("V8.COMConnector");
// este creat un obiect de conexiune COM
Conexiune = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")

1.5 Obiect de conexiune COM

Conexiunea COM la baza de informații 1C:Enterprise este asigurată de acces complet la contextul său global (vezi „Contextul de execuție modul software"). Prin urmare, o conexiune COM poate avea ca metode: constante de sistem, valori specificate în configuratorul de obiecte care sunt accesate folosind manageri (de exemplu, constante, enumerari, directoare, documente, jurnalele de documente, rapoarte, procesări, planuri pentru tipuri). de caracteristici, planuri conturi, planuri de tipuri de calcul, registre), precum și variabile declarate în modulul de conectare externă cu cuvântul cheie Export.

În plus, conexiunea COM are o metodă suplimentară NewObject care poate fi folosită pentru a crea valori de anumite tipuri.

tk = Conexiune. NewObject(„Tabel cu valori”);

Metoda String Vă permite să obțineți reprezentări șir ale valorilor 1C:Enterprise.

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

1.6. Caracteristici de lucru cu o conexiune COM

În automatizare și într-o conexiune COM, TRUE și FALSE au următoarele valori: -1 (minus unu) și 0.

Este posibil să se organizeze un grup de conexiuni COM. În același timp, mai multe obiecte de conexiune COM sunt create ÎN AVANS pe serverul receptor 1C:Enterprise și este nevoie de și mai puțin timp pentru a stabili o conexiune, deoarece nu este nevoie să creați obiect nou.

A fost implementat un nou obiect Query Builder, conceput pentru a genera texte de interogare pe baza setărilor specificate. Acest obiect acceptă funcționalitatea generatorului de rapoarte care nu are legătură cu ieșirea raportului document foaie de calculși alte sarcini legate de interfata utilizator. Acest obiect poate fi folosit pe serverul 1C:Enterprise și într-o conexiune COM.

Puteți utiliza obiecte COM când rulați limbajul încorporat pe serverul 1C:Enterprise.

Erorile COM sunt convertite în excepții de limbaj încorporat.

Dacă configurația încearcă să creeze un obiect nevalid, cum ar fi un document de foaie de calcul, într-un modul de alăturare extern, într-un modul partajat sau într-un modul obiect, conexiunea COM poate să nu fie stabilită sau poate fi încheiată ca excepție.

Bună, Khabrachans!

În acest articol vreau să vorbesc despre modul în care se stabilește integrarea cu platforma 1C în organizația mea. Ceea ce m-a determinat să fac asta a fost absența aproape completă informatii tehnice pe acest subiect. Citind diverse articole și rapoarte pe tema conectării 1C cu orice sistem informațional, ești convins din nou și din nou că toate sunt de natură marketing, demonstrativă și niciodată tehnice, reflectând problema și esența soluției sale.

Vă avertizez că această metodă nu pretinde în niciun caz a fi universală. Deoarece există multe configurații 1C în sine și sisteme informatice, limbi și platforme - chiar mai mult, numărul de combinații posibile este enorm. Scopul meu este să demonstrez o soluție posibilă.


Am ales Python ca limbaj care va fi integrat cu 1C. Este foarte potrivit pentru automatizarea proceselor. Acest lucru este facilitat de minimalismul sintaxei (codul este tastat foarte repede), o bibliotecă standard bogată (mai puțină nevoie de module terțe), multi-platformă - cu o probabilitate mare, codul scris în Linix OS va funcționa cu succes pe Windows .

Pentru început, voi schița datele cu care vom lucra. Organizația este o companie de vânzări de energie din regiunea Orientului Îndepărtat - deservește aproximativ 400 de mii de abonați, baza de date 1C se bazează pe o configurație personalizată. Pentru fiecare abonat sunt stocate plățile, tarifele, serviciile consumate și schemele de calcul, contoarele, citirile și multe alte date.

Cândva, o organizație avea un program scris în Delphi și care folosea MSSQL/Firebird ca bază de date. În acele vremuri glorioase, puteți să vă conectați la baza de date folosind orice limbă și să efectuați multe acțiuni - selectați abonați debitori, postați plățile primite, înregistrați citirile instrumentelor. Nu este surprinzător faptul că colecția de scripturi care automatizează rutina a crescut constant. Programatorii puteau efectua orice acțiune fără a deschide programul în sine.

Din păcate, odată cu trecerea la 1C, freebie-ul s-a încheiat - nu mai era posibil să se conecteze direct la baza de date. În general, platforma 1C în sine este indivizibilă și nu se pretează bine pentru integrarea cu alte sisteme. Ea, după cum se spune, este un lucru în sine. Când încărcați date în 1C, ar trebui să vă amintiți că extragerea lor de acolo nu va fi atât de ușoară. Dar având în vedere faptul că organizația trebuia să implementeze sisteme de plată și cont personal, a fost necesar să se găsească o soluție.

Sarcinile principale cu care mă confruntau erau capacitatea de a obține rapid date despre un anume cont personal- Numele complet, adresa, dispozitivele de contorizare, citirile contoarelor, plățile, taxele. Plus generarea documentelor - raport de reconciliere, chitanta de plata. Deci, nu există nicio posibilitate de conectare directă la baza de date - oricine s-a uitat la o bază de date 1C pe un server SQL a văzut că este greu de înțeles masa de tabele precum aaa1, aaa2. Și construirea de interogări cu astfel de nume de tabele și câmpuri este pur și simplu nerealistă. În plus, multe tabele 1C (în special cele mai importante, cum ar fi o porțiune din cele mai recente, solduri și revoluții) sunt virtuale și împrăștiate pe diferite tabele fizice, colectate prin mai multe îmbinări. Această metodă nu este potrivită.

Platforma 1C oferă posibilitatea de a vă conecta la aceasta printr-o conexiune COM. La fel ca multe programe Windows, în timpul instalării 1C două obiecte COM sunt înregistrate în sistem - Automation Server și COM Connector. Ambele obiecte pot fi lucrate folosind un limbaj care acceptă tehnologia COM.

Obiectul Automation Server este o aplicație 1C, aproape deloc diferită de o aplicație client obișnuită. Diferența este că, în plus, este posibil să controlezi programatic o instanță de aplicație. Când lucrați cu un obiect COM Connector, este lansată o versiune ușoară a aplicației 1C, în care formularele, precum și funcțiile și metodele legate de interfață și efectele vizuale, nu sunt disponibile. Aplicația în sine pornește în modul „Conexiune externă”. Inițializarea variabilelor globale (de exemplu, definirea utilizator curentși setările acestuia) trebuie efectuate în modulul de conectare externă 1C. Dacă în modul conexiune externă codul apelează o funcție care nu este disponibilă în acest mod, se va arunca o excepție (care va fi transmisă scriptului nostru Python). Apelurile la funcții nesigure ar trebui să fie încadrate cu constructe ale formularului

#Dacă NU este un OuterJoin, atunci avertisment ("Bună ziua!"); #EndIf

Deoarece lucrul cu obiecte COM este o tehnologie exclusiv pentru Windows, nu este surprinzător că nu este inclusă în distribuția standard Python. Va trebui să instalați o extensie - un set de module care oferă toate funcționalitățile necesare pentru programare sub Windows în Python. Poate fi descărcat ca un program de instalare exe pre-construit. Extensia în sine oferă acces la registry, servicii, ODBC, obiecte COM etc. Ca alternativă, puteți instala imediat distribuția ActiveState Python, care vine cu o extensie Win32 din cutie.

De ceva timp am experimentat cu o conexiune COM în dezvoltarea de aplicații web, în ​​special, un cont personal. Au fost identificate următoarele dezavantaje:

Conexiunea COM este lentă. Performanța scăzută este un dezavantaj binecunoscut al tehnologiei COM.
- Procesul de stabilire a unei conexiuni cu 1C, în funcție de configurație, poate dura de la 1 la 8 secunde (în cazul meu - 6 secunde). Inutil să spun că stabilirea unei conexiuni pentru fiecare solicitare va duce la încărcarea fiecărei pagini în 8 secunde.
- Deoarece aplicațiile web din Python funcționează ca servere independente, punctul anterior poate fi compensat prin stocarea conexiunii într-o variabilă globală și restabilirea acesteia în cazul unei erori. Sincer să fiu, încă nu m-am gândit cum să mențin o conexiune în PHP.
- Se pierde funcționalitatea multiplatformă a aplicației web.

Pe baza punctelor enumerate mai sus, s-a decis să se schimbe principiul interacțiunii, împărțindu-l în 2 părți - prima dependentă de platformă (bazată pe fereastră), încărcarea datelor 1C în orice format convenabil și a doua, independentă de platformă, capabil să lucreze cu date fără a bănui nimic despre 1C în principiu.

Strategia de acțiune este următoarea: scriptul Python se conectează la 1C, execută interogările necesare și încarcă datele în baza de date SQLite. Vă puteți conecta la această bază de date din Python, PHP, Java. Majoritatea proiectelor noastre funcționează în Python și, din moment ce nu suport să scriu manual interogări SQL brute, toate lucrările cu baza de date SQLite se fac prin ORM SQLAlchemy. Tot ceea ce a fost necesar a fost să descriem structura de date a bazei de date într-un stil declarativ:

Din sqlalchemy.ext.declarative import declarative_base din sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column Adevărat) cont = Column(Unicode(32), index=True) cod = Column(Unicode(32)) adresa = Column(Unicode(512)) fio = Column(Unicode(256)) sursă = Column(Unicode(16) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) house = Column(Integer) flat = Column(Integer) mro = Clasa Coloană(Unicode(256)) Plată(Bază): __tablename__ = „plăți” # și așa mai departe...

Acum trebuie doar să importați acest modul în orice proiect Python și puteți lucra cu datele.

Vă prevăd întrebarea - „de ce SQLite”? Motivul principal este că baza de date este doar pentru citire, așa că problemele legate de scrierea în SQLite nu ar trebui să ne îngrijoreze. În al doilea rând, formatul acestui DBMS este convenabil - este mai convenabil de vizualizat (există multe utilitati gratuite, inclusiv o super extensie pentru FireFox). În al treilea rând, în unele cazuri a fost necesar să obțineți acces la abonații de pe mașini care nu au conexiune la serverul MySQL. În acest caz, este suficient să copiați fișierul bazei de date SQLite, iar această mașină va avea acces la toate informațiile.

Descărcarea are loc o dată pe zi, noaptea. Introducerea datelor în 1C poate fi automatizată în același mod. De exemplu, este necesară înregistrarea citirilor lăsate de abonați pe site-ul contului personal. În acest caz, ne conectăm din nou la 1C și metoda programatica Creăm și realizăm documentul „Act de luare a mărturiei”. Voi furniza codul mai jos.

Lucrul cu obiecte COM în Python este puțin neobișnuit. În primul rând, „Pythnicitatea” codului este pierdută - regulile de denumire a variabilelor și funcțiilor în 1C, pentru a le spune ușor, nu corespund cu Zen-ul Python. În al doilea rând, toată lumea știe că obiectele 1C sunt adesea denumite cu caractere chirilice, ceea ce va cauza probleme la dezvoltarea în Python... dar pot fi rezolvate. Vă sugerez să vă uitați la cod:

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").Connect(V82_CONN_STRING)

După cum se poate vedea din cod, clientul este inițializat să lucreze cu 1C. Un obiect COM este definit prin numele „V82.COMConnector”. Vă rugăm să rețineți că acest nume este valabil pentru platforma V8.2, dacă aveți versiunea 8.1, atunci numele va fi „V81.COMConnector”.

Apelăm metoda Connect() pe clientul inițializat, trecându-i șirul de conexiune. Șirul constă din numele serverului, baza de date, utilizator și parolă. Obiectul V82 rezultat stochează conexiunea la aplicația 1C. Nu are o metodă Disconnect() sau ceva de genul acesta. Pentru a vă deconecta de la baza de date, ștergeți obiectul din memorie folosind funcția del() sau atribuiți-l variabilei None.

Având un obiect, puteți accesa orice câmpuri și metode din contextul global 1C, puteți opera cu obiecte universale precum TabularDocument, ValueTable etc. Este important să rețineți că atunci când lucrați printr-o conexiune COM, 1C funcționează în modul „Conexiune externă”. Nu permite nicio funcționalitate interactivă, cum ar fi dialoguri pop-up, notificări și, cel mai important, formulare. Sunt sigur că veți blestema de mai multe ori pe dezvoltatorii de configurații care concluzionează cel mai mult funcționalitate importantăîn procedura Button1Press() din modulul formular document.

Să vorbim despre un lucru atât de important precum atributele chirilice. În ciuda faptului că 1C este un mediu bilingv și pentru fiecare metodă rusă există un analog în limba engleză, mai devreme sau mai târziu va trebui să apelați la atributul chirilic. Dacă este pornit limbi PHP sau VBSCript acest lucru nu va cauza probleme,

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Connection string") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account =... . .... AccountsRecord.Write()

Apoi codul Python se va bloca pur și simplu cu o eroare de sintaxă. Ce să fac? Editați configurația? Nu, este suficient să folosiți metodele getattr și setattr. Prin transmiterea unui obiect COM și a numelui chirilic al atributului acestor funcții, puteți obține și seta valori în mod corespunzător:

#coding=cp1251 catalog = getattr(V82.Catalogs, „Conturi personale”)

Următoarele sunt importante: numele detaliilor, precum și parametrii funcțiilor și metodelor, trebuie transmise în codificare cp1251. Prin urmare, pentru a evita confuzia cu codificări în prealabil, este logic să o declarați la începutul fișierului: #coding=cp1251. Apoi puteți trece șiruri fără să vă faceți griji cu privire la codificarea lor. Dar! Toate șirurile primite de la 1C (rezultate ale funcțiilor de apelare, interogări) vor fi în codificare UTF-8.

Un exemplu de cod care execută o interogare în mediul 1C, iterează rezultatul și salvează baza de date în SQLite:

#coding=cp1251 q = """ SELECTAȚI Conturi personale. Cod Cod AS, Conturi personale. Clădire. Decontare. Nume + ", " + Conturi personale. Adresă scurtă Adresă AS, Conturi personale. Abonat. Nume AS fio, Conturi personale. Denumire AS psu (Caracteristici ale Conturii Personale. Rețeaua teritorială. Denumire AS np str., Conturi personale Clădire Casă AS personal S, cuplu.MainRoom.RoomNumber AS flat , PersonalAccounts.Division.Parent.Name AS mro FROM Directory.PersonalAccounts AS PersonalAccounts LEFT CONNECTION RegisterInformation.CharacteristicsPersonalAccounts.SliceLast(, TypeCharacteristics. Tipuri de caracteristici. Organizație teritorială de rețea)) AS Caracteristici Conturi personale Slice of Ultimele conturi de software Legătură = Caracteristici ale conturilor personale Interogare """ = V82.NewObject("Interogare", q) selecție = interogare. Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = modele.Abonent() abonent.account = selection.code.strip( ) abonent.code = selecție.cod abonent.fio = selecție.fio abonent.address = selecție.adresă abonent.psu = selecție.psu abonent.tso = selecție tso abonent.source = u"ASRN" abonent.np = selecție. np abonent.street = selectie.strada abonent.house = selectie.casa abonent.flat = selectie.flat abonent.mro = selection.mro CONN.add(abonent) CONN.commit()

Aici CONN este sesiunea de conectare cu baza de date SQLite. Un obiect de interogare este creat și textul acestuia este completat. După cum s-a menționat mai sus, textul solicitării trebuie să fie în cp1251, pentru care codificarea este mai întâi declarată. După executarea cererii, toți abonații sunt șterși în baza de date pentru a nu adăuga duplicate, apoi sunt adăugați în buclă și urmează commit-ul final.

Când lucram cu solicitări, am descoperit următoarele reguli.

Când selectați câmpuri, atribuiți-le nume cu litere latine, va fi mult mai convenabil să le accesați printr-un selector (punct), în loc de getattr().
- Alegeți numai tipuri de date primitive: șiruri, numere, dată și boolean. Nu selectați niciodată link-uri către un obiect (document, carte de referință)! În acest context, absolut nu aveți nevoie de link-uri și sunt chiar dăunătoare, deoarece orice apel la un prop link sau o metodă va avea ca rezultat o solicitare printr-o conexiune COM. Dacă accesați atributele linkului într-o buclă, va fi extrem de lent.
- Dacă selectați un câmp de tip Date, acesta va fi returnat ca obiect PyTime. Acesta este un tip de date special pentru transmiterea datei-ora într-o conexiune COM. Nu este la fel de convenabil să lucrați cu data și ora obișnuită. Dacă transmiteți acest obiect la int(), acesta va returna un marcaj de timp, de la care puteți obține apoi data și ora folosind metoda fromtimestamp().

Acum să vedem cum se formează documentele tipărite. Faptul este că consumatorului trebuie să i se ofere posibilitatea de a descărca documente pregătite în prealabil, de exemplu, o chitanță de plată sau un raport de reconciliere. Aceste documente sunt generate în 1C în conformitate cu cerințele stabilite, implementarea lor în Python va dura mult. Prin urmare, este mai bine să generați documente în 1C și să le salvați în format Excel.

Astfel, actul de reconciliere este generat de o specială prelucrare externă. Pentru cei care nu sunt familiarizați cu terminologia 1C: procesarea este un program de sine stătător care are propriul său modul, formulare, șabloane, concepute pentru a rula în mediul 1C. Este necesar să inițializam procesarea, să completam detaliile acesteia și să apelăm la o funcție care ne va returna un document foaie de calcul destinat vizualizării în 1C. Acest document trebuie salvat în format Excel și copiat pe server sau înregistrat în baza de date.

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. Creați (nume) setattr(ExternalReport, "PersonalAccount", referință) table_doc = ExternalReport.GetDoc() cale = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) raport = modele.Report() report .account = reference.Code.strip() report.type = u"act" report.document = open(cale, "rb").read() CONN.add(raport)

Fragmentul de mai sus face următoarele: Procesarea care generează documentul este conectată. Procesarea poate fi încorporată în configurație, stocată pe disc sau într-o bază de date 1C (într-un director). Deoarece procesarea se modifică frecvent, pentru a nu actualiza configurația de fiecare dată, procesarea care se modifică cel mai frecvent este stocată în directorul „Rapoarte sistem”, într-un atribut „stocare valori” numit Report. Procesarea poate fi inițializată prin descărcarea acesteia din baza de date pe disc și încărcarea acesteia, sau folosind metoda GetURL(), la care trebuie să treceți un link către elementul director și numele atributului. Atribuim valorile detaliilor obiectului de procesare primit, apelăm funcția GetDoc() exportată și primim un document de foaie de calcul care este salvat într-un fișier Excel temporar. Conținutul acestui fișier este scris în baza de date SQLlite.

Ultimul lucru care rămâne de luat în considerare este introducerea programatică a datelor în 1C. Să presupunem că trebuie să introduceți mărturii de la abonați. Pentru a face acest lucru, este suficient să creați și să realizați documentul „Act de luare a mărturiei”:

#coding=cp1251 acts = getattr(V82.Documente, „Act de luare mărturie”) act = acts.CreateDocument() setattr(act, „Mărturie”, 1024.23) setattr(act, „Abonat”, „Ivanov”) # Completare în alte detalii .. act.Write()
Introducerea datelor este acum automatizată.

Așadar, am subliniat o metodă care se bazează pe încărcarea și descărcarea programatică a datelor folosind o conexiune COM. Această metodă funcționează cu succes în organizația mea de aproape un an. Baza de date, formată din 1C, deservește 3 sisteme de plată, achiziție prin Internet (plată prin carduri prin Internet), precum și un cont personal. În plus, diferite scripturi sunt conectate la baza de date pentru a automatiza rutina.

În ciuda deficiențelor metodei (viteză lentă a conexiunii COM), în general, funcționează stabil. Avem date într-o formă independentă de platformă (SQLite), cu care se poate lucra din orice limbă. Și partea principală a codului este scrisă în Python, ceea ce înseamnă că sunt disponibile multe instrumente și tehnici la care nici nu le poți visa în 1C.

Acesta este unul dintre moduri posibile interacțiunea cu 1C. Sunt sigur că nu este nou și probabil că a fost deja testat și optimizat de cineva. Cu toate acestea, am încercat să vă prezint cât mai multe detalii ale procesului pentru a vă proteja de capcanele pe care eu însumi am călcat.

Vă doresc tuturor noroc și amintiți-vă că 1C nu este atât de înfricoșător pe cât se crede!

) Asta e corect

În același timp, am văzut de mai multe ori când publicațiile care nu atingeau nici măcar 10 puncte pur și simplu „au decolat”.
De ce sa întâmplat asta? Aparent pentru că cuiva i-au plăcut clar.


Acesta este ceea ce spun, că ar fi bine să înțelegeți cât de mult aveți nevoie de el fără să citiți articolul de rating sau să îl evaluați nu atât de primitiv +/-. Cât despre ceea ce mi-a plăcut, l-aș corecta astfel: a câștigat atât de mult datorită faptului că stelele s-au aliniat și multă lume s-a adunat pe site și multora le-a plăcut, chiar tu înțelegi că este o chestiune de întâmplare pentru că de îndată ce articolul pleacă pagina de start atunci poate fi găsit deja doar la cerere, și deci toți trec prin voturi. Și, din câte am înțeles, comentariile constante = promovarea articolului vă permit să îl mențineți pe pagina principală.
Tocmai de aceea pun magazine pe străzile publice – până la urmă, ceea ce este deseori important nu este calitatea și relevanța mărfurilor, ci traficabilitatea locului cumpără de multe ori ceva pe care îl vor arunca a doua zi, doar de dragul procesului. Aceasta este o boală cunoscută de multă vreme de toată lumea - dependența de cumpărături. Sau pur și simplu creșterea fluxului crește probabilitatea cumpărătorului potrivit.

Și argumentele pro și contra... - acesta este doar un fel de „mulțumesc” pentru timpul și munca petrecută


Aceste. Un minus contează și ca „mulțumesc”? Am vrut să știu părerea dumneavoastră dacă ar trebui folosit în astfel de cazuri și cât de interesanți cred alții? Ar trebui să-l pui atunci când articolul este dăunător/rău sau când este pur și simplu inutil/gol pentru tine?
În opinia mea, articolul arată ca o simplă creștere a ratingului, deoarece:
1. Problema tipurilor pe care le-am citat a fost complet ignorată de autor, deși nu i-a fost prea lene să scrie o grămadă de comentarii.
2. Există o inexactitate evidentă în articol: se spune că aceasta este singura cale

V82 = New COMObject("V82.ComConnector"); Cod = AccountCOM.Code;


dar o pot face cu ușurință folosind o procesare ca aceasta:

Raport (bază. Directoare. Contrapărți. Căutare după nume ("LLC"). Cod);


si totul este bine! Și aleg conexiunea V82.ComConnector
Este cumva ciudat că autorului nu îi pasă deloc că articolul său conține problemele care au fost semnalate, dar nu reacționează în niciun fel.
3. Dar există încă o problemă când apare eroarea „Clasa nu există”.
4. Dar există o problemă când este instalat 8.2 și apoi este instalat 8.1 - încercați să faceți schimb prin OLE/COM cu un schimb standard UT-BP!
5. Ați putea indica principala procesare de pe site care vă permite să vă conectați universal prin OLE/COM pentru ca începătorii să nu piardă timpul, scrieți pentru ei! Apropo, dintr-un motiv oarecare, poza ei este pe ecranul tău, de ce? Și ca rezultat, 2 cuvinte pe fond și încă 6 în culise.

În general, nu arunc noroi, ci subliniez lacune specifice, dar nu există nicio reacție. Dacă aceasta este experiența pe care o împărtășiți, atunci este oarecum eronată și incompletă.
Ideea mea este că, dacă autorul ar fi dorit să colecteze toate erorile, ar putea măcar să asculte experiența altor oameni și să nu facă comentarii. Imediat apare o situație când cel care a citit-o știe mai multe decât autorul, îi spun (uneori greșit), și tot el ripostează. Ca urmare, toate informațiile nu sunt în articol, ci în comentarii! Amuzant! Acest lucru se întâmplă adesea, dar nu trebuie să vă concentrați asupra faptului că v-ați dorit ce este mai bun - eu arăt ce este mai bun, iar alții o arată! Includeți acest lucru în articol și va merita să citească această încăierare.

O modalitate de a transfera date de la o configurație 1C la alta este o conexiune software folosind COM. Multe companii folosesc mai multe baze de date diferite, între care trebuie să existe anumite conexiuniși dependențe. Dacă este necesar nu numai să transferați date, ci și să efectuați anumite procesări de date, atunci o conexiune COM va fi mecanismul optim. Capacitatea de a analiza date dintr-o altă bază de date 1C este utilă oricărui dezvoltator.

Ne conectăm prin COM la baza de date 1C

Pentru a implementa o conexiune COM în 1C, se folosește un mecanism special numit COMConnector. Acest obiect este instalat împreună cu platforma și este folosit pentru a conecta baze de informații. Trebuie remarcat faptul că pentru versiunile 8.2 și 8.3 sunt utilizate obiecte cu nume diferite - „V82.COMConnector” și respectiv „V83.COMConnector”.

Rețineți că durata conexiunii COM la baza de date costă o licență - nu vă lăsați dus de execuția simultană a mai multor conexiuni. Acest lucru este deosebit de important pentru organizațiile care au un număr limitat de licențe. Această problemă poate fi rezolvată folosind sarcini de rutină se execută atunci când nu există conexiuni de utilizator active la baza de informații.

Pentru a vă putea conecta la o altă bază de date și a solicita informațiile necesare, trebuie să cunoașteți următoarele date:

  1. Ce tip este - fișier sau client-server;
  2. Unde se află;
  3. Ce nume și ce parolă poți folosi pentru a te autentifica?
  4. Ce date te interesează?

Din primele trei puncte, pentru a implementa o conexiune COM, trebuie să creați un șir de parametri. În funcție de tipul de securitate a informațiilor, aceasta va diferi aspect. Folosind șirul primit, se realizează o conexiune, cu ajutorul căreia puteți colecta date dintr-o altă bază de date pentru analiză și prelucrare folosind orice metodă.

Parametri de conexiuneFileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Parolă"""; Parametri de conexiuneClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Parolă""";

Funcția de conectare este simplă și nu ar trebui să ridice întrebări dacă toți parametrii sunt specificați corect. Pentru a accelera depanarea și analiza posibile erori este mai bine să includeți conexiunea în construcția „Încercați”. Funcția va returna o valoare de tipul „Obiect COM”, cu care veți lucra pentru a obține datele necesare.

Funcția &OnServer ConnectToBase() exportConnectionIB Parametri = "Fișier=""E:\1c baza de date\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= New COMObject ("V83.COMConnector"); Încercați returnarea V83COMCon.Connect(Parametrii conexiunii IB); Raport de excepție(ErorDescription());

Returnare nedefinită; EndTempt; EndFunction

Printr-o conexiune COM puteți nu numai să selectați date, ci și să le adăugați la baza de date la care vă conectați. Amintiți-vă că putem transfera 4 tipuri de date primitive printr-un obiect COM. Alte tipuri vor trebui specificate folosind funcțiile de căutare încorporate ale platformei. Vă rugăm să rețineți că funcțiile globale ale platformei sunt apelate și printr-o conexiune COM.

Primim date din baza de date 1C

După ce ați primit obiectul dorit, trebuie să citiți datele dintr-o altă bază de date. Pentru a face acest lucru, folosim o solicitare printr-o conexiune COM în 1C 8.3 folosind valoarea primită de tipul „Obiect COM” din funcție. Este important să vă conectați mai întâi la baza de date și apoi să executați cererea. Execuția are loc prin metoda NewObject, specificând tipul obiectului sub formă de șir ca parametru - „Solicitare”.

De exemplu, pentru a obține informații despre utilizatorii unui anumit departament, vom stabili o condiție în cerere prin parametri. Un parametru va fi de tip simplu - un șir, iar diviziunea va fi o legătură către elementul de director „Structura întreprinderii”. Rezultatul interogării este un tabel cu câmpurile listate de tipul pe care acestea există în baza de date la care a avut loc conexiunea COM. Dacă trebuie să le convertiți în alte tipuri, utilizați funcțiile standard ale platformei:

  • Linia();
  • Număr();
  • Data().
RequestBPZO = Connection.NewObject("Solicitare"); RequestBPZO.Text = "SELECT first 15 | DirectoryUser.Name AS Nume |FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | Și DirectoryUser.Name ca ""%"" + &RequiredName+ ""%""" ; Solicitare BPZO.SetParameter(„Departamentul necesar”, Conexiune. Directoare. Structura întreprinderii. Găsire după cod(„00-000023”)); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); While Selection.next() loop Report(Selection.Name); EndCycle;

Dacă trebuie să transferați o matrice în baza de date pentru selecție pe baza mai multor parametri, de exemplu, departamente, este folosită și comanda NewObject. În mod similar, puteți trece o listă sau un tabel de valori, completându-le cu elemente ale unei alte baze de date printr-o conexiune. Toate metodele existente de obiecte și mecanisme ale platformei vă sunt disponibile pentru căutare.

RequestBPZO = Connection.NewObject.(„Solicitare”); RequestBPZO.Text = "SELECT first 15 | DirectoryUser.Name AS Nume | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | Și DirectoryUser.Name ca ""%"" + &NecessaryName+ ""%" " "; Array of Departments = Connection.NewObject("Matrice"); 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")); Solicitare BPZO.SetParameter(„Departamentul necesar”, Matrice de departamente); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); While Selection.next() loop Report(Selection.Name); EndCycle;

Când se transferă documente sau elemente de director, se pune întotdeauna problema controlului transferului unui anumit obiect. Cu ajutorul conexiunilor COM, astfel de probleme pot fi rezolvate printr-un identificator unic. Trebuie să găsiți un obiect în baza de date a plug-in-ului după identificator din securitatea informațiilor curente folosind funcția „GetLink”, folosind identificatorul ca șir. Dacă nu se găsește unul, îl puteți crea folosind o conexiune COM.

StrIdent = String(Directories.Users.FindByCode("00-0000313"). UniqueIdentifier()); Dacă NU este ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))), atunci NewUser = Connection.Directories.Users.CreateItem();

NewUser.Name = Directories.Users.FindByCode("00-0000313").Name;

NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual;

NewUser.Write(); endIf; De asemenea, o conexiune COM are dreptul de a utiliza proceduri și funcții din modulele comune 1C cu proprietatea „Conexiune externă” activată. Pe lângă această condiție, funcția sau procedura apelată trebuie să fie de export și să nu includă acțiuni interactive efectuate pe server. În caz contrar, veți vedea o eroare despre că operațiunea nu este validă. Compus..; VariableFunction = Conexiune...; apel de funcție>nume general modul>apel de procedură>nume general modul>