Lucrul printr-o conexiune COM este mai ușor decât credeți. Trei piloni ai lucrului cu obiecte COM. Lucrul printr-o conexiune COM este mai ușor decât credeți Conexiunea Com 1s 8.3 exemplu de server client

Imprimare (Ctrl+P)

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. Această metodă poate fi utilizată atât în ​​versiunile client-server ale bazelor de date, cât și în bazele de date de fișiere. Acest articol discută aceste tipuri de conexiuni pe platforma 8.3

conexiune com

Puteți crea două tipuri de obiecte COM pentru aplicația 1C. Acestea sunt conexiuni vechi V83.Aplicație și conexiuni com V83.COMConector . In caz de V83.Aplicație Este lansată o copie aproape completă a aplicației 1C. În caz de utilizare V83.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 V83.COMConectorși numai în caz de lipsă de funcționalitate V83.Aplicație. Diferența de viteză de operare poate fi vizibilă în special pe bazele de date cu volum mare. Pentru platforma 8.2 utilizată V82.Application sau V82.COMConnector

Stabiliți o conexiune OLE

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

Stabiliți o conexiune COM

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

Șir de conexiune

//Pentru opțiunea client-server
Șirul de conexiune= „Srvr = „“ServerName” „;Ref = „ „BaseName” ;
//Pentru opțiunea mod fișier:
Șirul de conexiune= „Fișier = „“PathKBase” „; Usr = Nume de utilizator; Pwd = Parolă”;
Atentat, încercare
Connection = Conexiune . Conectați(ConnectionString) ;
Excepție
Mesaj = New MessageToUser;
Mesaj . Text = „Nu s-a putut conecta la baza de date” + DescriereErori(); Mesaj . A raporta();
EndTempt ;

Deconectare

Conexiune = nedefinit ;
Pentru obiect V83.Aplicație Este necesar să opriți conexiunea, altfel va rămâne o sesiune incompletă, care va trebui apoi ștearsă manual. In caz de V83.COMConector conexiunea se întrerupe automat la finalizarea procedurii în care s-a realizat conexiunea.Și mai este un punct mic. Pentru utilizatorul sub care se realizează conexiunea, caseta de selectare „Solicitare confirmare la închiderea programului” trebuie să fie dezactivată în setările acestuia.

Metoda NewObject().

Pentru a crea un obiect nou, puteți utiliza metoda NewObject(), de exemplu:

Pentru V83.COMConector

SolicitațiCOM = Conexiune. NewObject( "Cerere ") ;
TableCOM = Conexiune. NewObject( „Tabelul valorilor”) ;
ArrayCOM = Conexiune. NewObject(„Matrice”);

ViewCOM =Conection.NewObject

Pentru V83.Aplicație

RequestOLE = Conexiune. NewObject(“ Cerere ") ;
TableOLE = Conexiune. NewObject(„Tabelul valorilor”) ;
ArrayOLE = Connection.NewObject(„Matrice”);
ViewCOM =Conection.NewObject(„UniqueIdentifier”, StringUID);

SolicitațiCOM . Text ="ALEGE
| Pozițiile organizațiilor. Cod,
| Funcțiile organizațiilor.Nume
|DIN | Director.Pozițiile organizațiilor
CUM PENTRU POZIȚII ALE ORGANIZAȚILOR”;

Rezultat = SolicitareCOM. Alerga();
Probă = Rezultat. Alegeți () ;
Pa selecție. Următorul()Ciclu
EndCycle ;
De asemenea, puteți utiliza manageri de obiecte de configurare:
DirectoryCOM = Conexiune. Directoare. DirectoryName;
DocumentCOM = Conexiune. Documentație. Numele documentului;
RegisterCOM = Conexiune. Registre de informații. RegisterName;

Primirea și compararea enumerației prin conexiune COM

Pentru a compara valorile elementelor de enumerare definite în configurație, este necesar să convertiți aceste elemente într-unul dintre tipurile primitive, a căror comparație este ușoară. Astfel de tipuri pot fi fie de tip numeric, fie de tip șir. Puteți converti valoarea unui element de enumerare într-un tip numeric astfel:

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

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

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

Dacă EnumerationItemNumber = 0, atunci Raportați( „Valoarea numărului 1”);

ElseIfEnumerationItemNumber = 1 Apoi Raport ("Valoarea Enumerării2");

endIf;

Preluarea unui obiect prin COM prin identificator

Prin managerii de obiecte de configurare obținem un obiect com, de exemplu:
DocumentCOM = Conexiune. Documentație. Numele documentului;

Apoi obținem un șir de identificare unic:

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

Identificator = U nou unicIdentifier(StringUID);
CU linkByIdentifier = Documente[DocumentName].GetLink(Identifier);

Dacă trebuie să găsiți un obiect com după document prin identificator, atunci trebuie să scrieți astfel:

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


Cuvinte cheie: COM, conexiune, extern, OLE, Automatizare, Conectare, ComConnector, Srvr

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:

  1. Stabilirea mai rapidă a conexiunii, deoarece nu este necesară crearea unui proces separat de sistem de operare și toate acțiunile sunt efectuate în cadrul procesului de apelare;

  2. Acces mai rapid la proprietățile și metodele obiectelor 1C:Enterprise, deoarece organizarea unui acces nu necesită comunicare între procese;
  3. Consum mai mic de resurse ale sistemului de operare.

În general, lucrul cu 1C:Enterprise 8.0 printr-o conexiune COM este similar cu lucrul cu 1C:Enterprise în modul de automatizare a serverului. Principalele diferențe sunt următoarele:

  1. În cazul unui server Automation, este lansată o aplicație completă 1C:Enterprise 8.0, iar în cazul unei conexiuni COM, este lansat un server COM în proces relativ mic.

  2. Când lucrați printr-o conexiune COM, funcționalitatea într-un fel sau altul legată de organizarea interfeței de utilizator 1C:Enterprise 8.0 nu este disponibilă;
  3. Când se operează o conexiune COM, 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 When SystemStarts() și WhenSystemCompletes(), care pot conține acțiuni efectuate la inițializarea și, respectiv, la terminarea conexiunii.

Procedurile, funcțiile și variabilele globale definite într-un modul de unire extern cu cuvântul cheie Export 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ă o valoare conține spații albe, aceasta trebuie să fie cuprinsă între ghilimele duble (").

Parametri comuni:

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

O conexiune COM la baza de informații 1C:Enterprise oferă acces deplin la contextul său global (consultați „Contextul de execuție al modulelor de program”). 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 de recepție 1C:Enterprise și este nevoie de și mai puțin timp pentru a stabili o conexiune, deoarece nu este nevoie să creați un nou obiect.

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 este legată de transmiterea raportului într-un document de foaie de calcul sau de alte sarcini legate de interfața cu utilizatorul. 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 conectare extern, într-un modul comun sau într-un modul obiect, conexiunea COM poate să nu fie stabilită sau să fie terminată ca excepție.

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. Această metodă poate fi utilizată atât în ​​versiunile client-server ale bazelor de date, cât și în bazele 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. In caz de 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.

Asadar, haideti sa î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) ; Mesaj de excepție = New MessageToUser; Mesaj. Text = + ErrorDescription() ; Mesaj. A raporta() ; EndTempt ;
  4. Se deconectează de la baza de date Conexiune = Nedefinit ;

    Pentru obiect V82.Aplicație Este necesar să opriți conexiunea, altfel va rămâne o sesiune incompletă, care va trebui apoi ștearsă manual. In caz de V82.COMConector conexiunea se întrerupe automat la finalizarea procedurii în care s-a realizat conexiunea.Și mai este un punct mic.

    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 = ""С:\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”+ DescriereEroare() ; Mesaj. A raporta() ; EndTempt ; Conexiune = Nedefinit ;

Pentru tipul de conexiune V82.Aplicație metoda este folosită pentru obiectul COM care a fost creat inițial și pentru V82.COMConector metoda se aplică la conexiune. Apoi cererea este procesată folosind instrumente standard 1C. in cod arata asa:

Solicitare = Conexiune. NewObject("Solicitare"); // Pentru V82.COMConector Solicitare = Conexiune. NewObject("Solicitare"); // Pentru V82.Aplicație Cerere. Text = „SELECT | Pozițiile organizațiilor. Cod, | Funcțiile organizațiilor.Nume|DIN | Director. Pozițiile organizațiilor AS Pozițiile organizațiilor"; Rezultat = Solicitare. Alerga(); 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”.

) 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 s-a î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 un articol părăsește pagina principală, acesta poate fi găsit doar la cerere și astfel 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 - la urma urmei, ceea ce este adesea important nu este calitatea și relevanța mărfurilor, ci traficabilitatea locului; oamenii care se plimbă cumpără adesea 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ă


Acestea. 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; nu toată lumea este interesată să citească această încăierare.

Când vrem să vedem date din mai multe tabele în același timp, de exemplu. pentru a aduna mai multe tabele într-unul singur, apare conceptul de conectare a tabelelor și a relațiilor dintre ele. Există patru tipuri de conexiuni:

  • stânga;
  • dreapta,
  • intern;
  • complet.

Vom analiza fiecare tip folosind un exemplu abstract. Există 2 tabele, în primul stocăm informații descriptive despre articol, în al doilea despre soldurile acestuia:

Pentru a obține unul din aceste tabele, trebuie să indicăm în mod explicit ce câmpuri ne vom conecta, prin ce condiție și tip. Acum va deveni mai clar.

Conexiune din stânga

Folosind o îmbinare stânga, spunem sistemului că, prin urmare, dorim să vedem toate înregistrările din tabelul din stânga și înregistrările din dreapta care satisfac condiția de conectare. Să presupunem că conectăm tabele după câmpul de produs cu condiția egală, atunci vom obține un tabel ca:

Cerere.Text =
"ALEGE
| Nomenclatură.Produs,
| Nomenclatură.Color AS ColorNomenclature,
| Remains.Color AS ColorRemains,
| Solduri.Cantitate
|DIN

";

Nu au existat potriviri pentru scaun din tabelul de resturi, așa că câmpurile au fost completate cu valori NULL, care trebuie procesate de funcția ISNULL, vezi 1C 8 Funcții limbaj de interogare.

Uniunea din stânga funcționează aproximativ ca o buclă într-o buclă - ia prima înregistrare din tabelul din stânga și rulează prin toate înregistrările din tabelul din dreapta pentru a se asigura că condiția de conectare este îndeplinită. Apoi a doua înregistrare este luată din tabelul din stânga și așa mai departe. Dacă brusc mai multe înregistrări din tabelul din dreapta satisfac condiția de conectare, atunci mai multe rânduri vor fi adăugate în tabelul rezultat (în funcție de numărul de conexiuni reușite).După cum putem vedea, tabelul rezultat nu este informativ, datele nu reflectă esența reală, deci este mai bine să conectăm aceste tabele prin două câmpuri: Produs și Culoare, doar că de această dată vom trata valorile NULL:

Cerere.Text =
"ALEGE
| Nomenclatură.Produs,
| Nomenclatură.Culoare,
| ISNULL(Remaining.Quantity, 0) AS Cantitate
|DIN
| Nomenclatură AS Nomenclatură
| LEFT JOIN Remains AS Remains
| Software Nomenclature.Product = Remaining.Product

Conexiune corectă

Conexiunea din dreapta nu este în esență diferită de cea din stânga. Dacă schimbați tabelele, îmbinarea din dreapta se va transforma într-o alăturare stângă; în plus, atunci când utilizați constructorul, sistemul însuși convertește toate îmbinările din dreapta în îmbinări din stânga.

Îmbinare interioară

Folosind o îmbinare internă, îi spunem sistemului că, prin urmare, dorim să vedem doar acele înregistrări care satisfac condiția de conectare atât din tabelul din dreapta cât și din cel din stânga. Astfel, numărul de înregistrări rezultate va fi mai mic sau egal cu numărul de înregistrări din cel mai scurt tabel participant la unire. Să aplicăm o îmbinare interioară câmpurilor Produs și Culoare ale tabelelor noastre:

Cerere.Text =
"ALEGE
| Nomenclatură.Produs,
| Nomenclatură.Culoare,
| Resturi.Cantitate AS Cantitate
|DIN
| Nomenclatură AS Nomenclatură
| INNER JOIN Remainders AS Remainders
| Software Nomenclature.Product = Remaining.Product
| Și Nomenclature.Color = Remaining.Color";

Conexiune completă

O îmbinare completă va avea ca rezultat toate înregistrările din ambele tabele, acele înregistrări care satisfac condiția de conectare vor fi conectate, acele înregistrări care nu satisfac condiția de conectare vor ajunge în continuare în rezultatul interogării, dar cu unele câmpuri NULL. Complete este ca conexiunile stânga și dreapta într-una singură.

Pot fi multe probleme pe această temă, să încercăm să rezolvăm una dintre ele. Organizația noastră este un dealer a 2 fabrici de mobilă: „Zarya” și „Rassvet”. Sortimentul cu costul fiecăreia dintre fabrici este stocat în tabele diferite. Este necesar să creați o singură listă de prețuri și să includeți produse la prețul minim:

Să aplicăm o alăturare completă cu o selecție a tuturor câmpurilor, ne vom conecta după produs:

Cerere.Text =
"ALEGE
| NomenclaturăZarya.Product AS ProductZarya,
| NomenclaturăZarya.Preț AS PrețZarya,
| Nomenclatură Rassvet. Produs AS Produs Rassvet,
| NomenclaturăRassvet.Preț AS PrețRassvet
|DIN

Nu este exact ceea ce avem nevoie, să combinăm câmpul de produs într-unul singur și să procesăm valorile NULL:

Cerere.Text =
"ALEGE
//construcția ISNULL a fost discutată în secțiunea de funcții ale limbajului de interogare
//dacă prețul nu este definit, atunci inițializați-l
//de ce 1000000 vezi explicația de mai jos
| ISNULL(NomenclatureZarya.Price, 1000000) AS PriceZarya,
| ISNULL(NomenclatureRassvet.Price, 1000000) AS PriceRassvet
|DIN
| NomenclaturăZarya AS NomenclaturăZarya
| CONEXIUNE COMPLETĂ NomenclatureDawn AS NomenclatureDawn
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Rămâne doar să alegeți prețul minim. Textul final al cererii va arăta astfel:

Cerere.Text =
"ALEGE
| ISNULL(NomenclatureZarya.Product, NomenclatureDawn.Product) AS produs,
| ALEGERE
| WHEN There ISSNULL(NomenclatureZarya.Price, 1000000) > ISNULL(NomenclatureRassvet.Price, 1000000)
| THEN ISNULL(NomenclatureRassvet.Price, 1000000)
| ELSE ISNULL(NomenclaturăZarya.Preț, 1000000)
| TERMINAT CA PRET
|DIN
| NomenclaturăZarya AS NomenclaturăZarya
| CONEXIUNE COMPLETĂ NomenclatureDawn AS NomenclatureDawn
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Dacă prețul nu este definit (NULL), atunci acesta trebuie inițializat cu o anumită valoare, altfel operația de comparare pentru mai mult/mai puțin va eșua cu o eroare. Inițializam prețul cu o sumă nerealist de mare astfel încât să „pierde” în operațiunea de comparare, deoarece în funcție de condițiile problemei selectăm cel mai mic preț.

← Funcțiile limbajului de interogare 1C 8 | Se alătură în 1C 8 interogări →