Acest articol este destinat cititorilor care sunt familiarizați cu limbajul SQL.

Limbajul de interogare 1C, care a fost utilizat de la versiunea 8, a devenit astăzi un instrument util pentru lucrul cu baze de date, care vă permite să citiți din ele, dar să nu scrieți. Sintactic, limbajul de interogare este foarte asemănător cu limbajul SQL, dar în rusă.

Mai jos este un tabel de corespondență între principalii operatori ai limbajului de interogare și SQL:

Operatori de limbaj de interogare 1C

Instrucțiune SQL

VARIAT

COMPUS

ÎNCĂRCARE DE

COMBINA

FILTREAZĂ DUPĂ

Și aceasta nu este o listă completă. Informații de referință mai complete despre operatorii de limbaj de interogare disponibili pot fi găsiți în proiectantul de interogări, care va fi discutat mai jos.

Executarea cererii 1C din codul programului se realizează folosind obiectul limbajului încorporat „Cerere”. Un exemplu de scriere a unei interogări în baza de date utilizând limbajul de programare încorporat:

Cerere \u003d Cerere nouă; Request.Text \u003d "SELECT | Synonym.Link AS Link | FROM | Directory.Reference1 AS Sinonim"; Selection \u003d Query.Run (). Select (); În timp ce Selection.Next () Cycle // Insert process selection SelectionDetailedRecords End of Cycle;

Metoda „Run” execută interogarea, metoda „Select” returnează o valoare de tip „FetchFromQueryResult”. Alternativ, puteți utiliza metoda Unload, care returnează un tabel de valori.

Parametrii de interogare sunt stocați în proprietatea „Parametri” (în acest caz, este o structură, deci toate metodele de structură sunt aplicabile aici - inserare, ștergere etc.).

Un exemplu de setare a parametrului „Query.Parameters.Insert” („Reference”, ReferenceLink). Puteți consulta parametrii din cerere prin semnul „& Referință”. Mai jos este un exemplu de cerere care utilizează parametri:

Cerere \u003d Cerere nouă; Request.Text \u003d "SELECT | Users.Link AS Link, | Users.Parent AS Parent, | Users.Name AS Name | FROM | Directory.Users AS Users | WHERE | Users.Link \u003d & Directory"; Request.Parameters.Insert ("Director", DirectoryLink); Selection \u003d Query.Run (). Select (); În timp ce Selection.Next () Cycle // Insert process selection SelectionDetailedRecords End of Cycle;

Reamintim că limbajul de interogare este destinat numai citirii datelor dintr-o bază de date și, prin urmare, nu are analogi pentru instrucțiunile SQL, cum ar fi INS ERT și UPDATE. Datele pot fi modificate numai prin modelul obiect al limbajului de programare încorporat 1C. De asemenea, în limbajul de interogare 1C există operatori care nu au analogi în SQL, de exemplu:

  • ÎN IERARHIE
  • A plasa
  • INDICE DE

ÎN IERARHIE - vă permite să selectați toate elementele din directorul ierarhic care sunt incluse în ierarhia legăturii trecute. Exemplu de cerere folosind ÎN IERARHIE:

SELECȚIONEAZĂ Bunuri.Link, Bunuri.Artik DIN Directory.Bunuri CA MARFURI UNDE Bunuri.Link ÎN IERARHIE (și citrice) "

În acest caz, rezultatul va returna toate elementele subordonate din catalogul de nomenclatură „Citrus”, indiferent de câte niveluri de ierarhie are acest catalog.

De asemenea, de exemplu, sarcina este de a găsi un produs cu numele „Pen”. Elementul trebuie să fie inclus în ierarhia „Papetărie”. Bunuri ”, adică nu este nevoie să căutăm un clanș de ușă. Structura nomenclaturii în acest caz este următoarea:

Chancellery

| _ Stilouri stilografice | _ Stilou roșu | _ Stilou albastru | _ Stilouri cu cerneală | _ Conducători

Fitinguri

| _ Mânerele ușii | _ Mânerul ușii simplu | _ Mânerul ușii de lux

Scriem următoarea solicitare:

SELECTAȚI Produse.Link, Produse.Articul DIN Director.Produse AS PRODUSE UNDE Produse.Nume Ca „Pen%” ȘI Produse.Link ÎN IERARHIE (și birou)

Când utilizați designul ÎN IERARHIE trebuie avut în vedere că, dacă treceți un link gol către parametrul „Office”, interogarea va încetini, deoarece platforma va verifica fiecare element pentru apartenența la root.

A plasa - Această declarație plasează rezultatul într-un tabel temporar. Cerere de exemplu:

SELECTAȚI Utilizatori.Link AS Link, Users.Parent AS Parent, Users.Name AS Name POST Utilizatori selectați din Directory.Users AS Users WHERE Users.Link \u003d & Directory; SELECTați SelectedUsers.Link AS Link, SelectedUsers.Parent AS Parent, SelectedUsers.Name AS Name DIN Utilizatorii selectați AS SelectedUsers

Această interogare SQL va fi executată de mai multe interogări:

  • Crearea unui tabel temporar (platforma este capabilă să „reutilizeze” tabelele temporare create anterior, deci crearea nu se întâmplă întotdeauna);
  • Introducerea datelor într-un tabel temporar;
  • Executarea interogării principale, și anume SEL ECT din acest tabel temporar;
  • Distrugerea / ștergerea mesei temporare.

Tabelul temporar poate fi distrus în mod explicit, prin construcție DISTRUGE, sau implicit - la închiderea managerului temporar de masă.

Obiectul „Interogare” al limbajului de programare încorporat are o proprietate „TemporaryTablesManager”, care este destinat să lucreze cu tabele temporare. Cod simplu:

MVT \u003d New TemporaryTables Manager (); Cerere \u003d Cerere nouă; Request.TemporaryTables Manager \u003d MVT;

După executarea interogării, MBT poate fi utilizat a doua oară într-o altă interogare, ceea ce este, fără îndoială, un alt avantaj al utilizării tabelelor temporare. În acest caz, tabelul temporar va fi șters din baza de date atunci când se numește metoda „Închidere” ...

MVT.Close ();

... sau când ștergeți o variabilă din memorie, adică când executați metoda în care a fost declarată variabila. Tabelele temporare cresc sarcina pe subsistemul discului, deci nu ar trebui să creați prea multe subsisteme temporare (într-o buclă, de exemplu) sau subsisteme mari.

INDICE DE - acest operator este utilizat împreună cu operatorul LOC. Când creați o tabelă temporară, acest operator poate indexa tabelul creat, ceea ce accelerează semnificativ lucrul cu acesta (dar numai dacă indexul se potrivește interogării dvs.).

Consultare gratuită a experților

Vă mulțumim pentru cererea dvs!

Un specialist 1C vă va contacta în termen de 15 minute.

Caracteristici ale unor operatori ai limbajului de interogare

PENTRU SCHIMBARE - acest operator este destinat să blocheze un anumit tabel de interogare (sau toate tabelele care participă la interogare). Blocarea se realizează prin plasarea unei blocări U pe masă. În SQL, acest lucru este implementat prin sugestie UPDLOCK. Acest design este necesar pentru a preveni blocajele. Exemplu de cerere cu o construcție PENTRU SCHIMBARE:

Selectați Utilizatori.Link AS Link, Users.Parent AS Parent, Users.Name AS Name FROM Directory.Users AS Users LEFT CONNECTION Directory.RFK AS RFK ON Users.RFK \u003d RFK.Link TO CHANGE Directory.Users

În acest exemplu, blocarea U va fi setată pe tabela Utilizatori. Dacă nu specificați un tabel de blocat, acesta va fi suprapus pe toate tabelele care participă la interogare. Este important să rețineți că acest design funcționează numai în configurații în care controlul automat de interblocare este activat.



COMPUS - cererea acceptă conexiuni STÂNGA / DREAPTA, PLIN, INTERIOR,care corespunde îmbinărilor în SQL - STÂNGA / DREAPTA JOIN, OUTER JOIN, INNER JOIN.

Cu toate acestea, atunci când utilizați Query Designer, nu puteți face acest lucru CONEXIUNE DREPTĂ.Constructorul va schimba tabelele, dar operatorul va fi întotdeauna lăsat. Din acest motiv, în 1C nu veți vedea niciodată utilizarea conexiunii corecte.

Sintactic, conexiunea arată astfel:

SELECTAȚI Tabelul1.Ref AS Link FROM Reference.Reference1 AS Table1 LEFT JOIN Reference.Reference2 AS Table2 BY Table1.Attribute \u003d Table2.Attribute

În limbajul de interogare 1C, nu există un operator pentru aderarea la un produs cartezian (CROSS JOIN). Cu toate acestea, absența unui operator nu înseamnă că limbajul interogării nu acceptă o astfel de conexiune. Dacă este necesar, vă puteți alătura tabelelor în acest fel:

SELECTAȚI Tabelul 1.Ref AS Link FROM Reference.Ref1 AS Table1 LEFT JOIN Reference.Ref2 AS Table2 TRUE

După cum puteți vedea din exemplu, cheia de conectare este setată ADEVĂRATadică fiecare rând dintr-un tabel corespunde unui rând din altul. Tipul de asociere (STÂNGA, DREAPTA, COMPLET, INTERIOR) nu este important dacă aveți rânduri în ambele tabele, dar dacă nu există rânduri într-unul dintre tabele (eliberarea tabelului), rezultatul va fi diferit. De exemplu, când utilizați INTERN rezultatul conexiunii va fi gol. Folosind STANGA DREAPTA rezultatul va fi o asociere sau lipsă de date, în funcție de tabelul la care ne alăturăm - cu date sau nu. Folosind DEPLIN conexiunile de date vor fi întotdeauna (desigur, un singur tabel, deoarece există gol în celălalt), alegerea tipului de conexiune depinde de problema specifică a aplicației.

Un mic indiciu vizual despre modul în care funcționează diferitele tipuri de conexiuni:



CA.Spre deosebire de operatorul SQL similar LIKE, șablonul pentru CA poate fi setat folosind doar câteva caractere speciale:

  • % (procent): o secvență care conține orice număr de caractere arbitrare;
  • _ (subliniere): un caracter arbitrar;
  • / - Următorul caracter trebuie interpretat ca un caracter obișnuit.

REZULTATE PRIVINDechivalentul în SQL este operatorul ROLLUP. Exemplu de utilizare a operatorului REZULTATE:

SELECTAȚI Produsele. Preț AS Preț, Produse. Produs AS Produs din Director.Nomenclatură AS Produse MEDIE TOTALĂ (Preț) PE Produs

Rezultatul va fi așa:

Pat

9833,333

Fier

Un stilou

Adică se adaugă o linie suplimentară la rezultatul care conține valoarea câmpului prin care se realizează gruparea și valoarea funcției de agregare.

Lucrul cu solicitările de lot

1C vă permite să lucrați cu pachete de solicitări. Într-o cerere de lot, textele de interogare sunt separate printr-un punct și virgulă (;). Cererea de lot 1C este executată secvențial. Exemplu de text de solicitare a lotului:

SELECTAȚI Utilizatori. Link AS Link, Users. Parent AS Parent, Users. Name AS Name FROM Directory. Users AS Users;
SELECTAȚI ScheduleWork.User AS User, ScheduleWork.Date AS Date, ScheduleWork.Ore de lucru AS Ore de lucru DIN Registrul de informații.Work Schedule AS ScheduleWork

Pentru a obține rezultatul tuturor solicitărilor incluse în pachet, trebuie să utilizați metoda ExecuteBatch a obiectului cerere în loc de Executare. Această metodă execută toate cererile secvențial. Rezultatul unei interogări este o matrice de rezultate pentru fiecare interogare din pachet, iar secvența din matrice este aceeași cu secvența de cereri din textul pachetului.

Având în vedere limbajul de interogare, merită menționat o astfel de caracteristică ca tabelele virtuale. Nu există tabele virtuale în baza de date, este un fel de împachetare care se execută pe partea SGBD ca o interogare utilizând subinterogări. Un exemplu de interogare 1C folosind tabele virtuale:

SELECTAȚI Registrul pasivelor Cifrele de afaceri. Răspunderea AS Obligația din registrul de acumulare.

O astfel de interogare pentru un SGBD va arăta astfel:

SEL ECT T1.Fld25931RRef FR OM (SELECT T2._Fld25931RRef AS Fld25931RRef, CAST (SUM (T2._Fld25936) AS NUMERIC (38, 8)) AS Fld25936 Turnover_, CAST (SUM (T2._Fld25937) AS NUMIC) AS F ._AccumRgTn25938 T2 WH ERE ((T2._Fld949 \u003d @ P1)) ȘI ((T2._Fld25936 @ P2 SAU T2._Fld25937 @ P3)) GRUPARE PE T2._Fld25931RRef SUMF25 (CAST36) CA NUMERIC (38, 8))) 0.0 SAU (CAST (SUM (T2._Fld25937) AS NUMERIC (38, 8))) 0.0) T1 \u003e\u003e\u003e\u003e

Se poate vedea că nu arată ca SQL, deoarece există o subinterogare, grupare. Tabelele virtuale, în mare, sunt „zahăr sintactic”, adică sunt create, în general, pentru comoditatea dezvoltării interogărilor, astfel încât interogările să fie mai compacte și mai lizibile.

Numai registrele au tabele virtuale, dar care tabele virtuale sunt disponibile dintr-un registru pot fi văzute în proiectantul de interogări.



Când utilizați tabele virtuale, trebuie să dați întotdeauna o condiție de selecție. În caz contrar, pot apărea probleme de performanță.



În corpul solicitării, arată astfel:

Registrul de acumulare.Registrul pasivelor.Turnări (, Operațiune \u003d & Operațiune) AS ObligațieRegisterVooms

Pentru comoditate, scrierea interogărilor, adică crearea textelor de interogare, în 1C există un constructor care poate fi apelat prin meniul contextual (clic dreapta):



În proiectantul de interogări, puteți vedea o listă completă a funcțiilor și operatorilor suportați ai limbajului de interogare.


Query Builder este un instrument vizual foarte flexibil pentru crearea de interogări de orice complexitate. Este disponibil numai în modul configurator. În modul Enterprise există o așa-numită „Consolă de interogare” - aceasta este procesarea externă furnizată pe discul ITS. Pentru o aplicație gestionată, consola de interogare poate fi descărcată de pe its.1c.ru.

Descrierea muncii în constructorul interogării este dincolo de scopul acestui articol, prin urmare nu va fi luată în considerare în detaliu.

Motive pentru performanța interogării suboptimă

Mai jos este o listă cu principalele motive (dar nu toate) care duc la executarea mai lentă a interogării.

  • Utilizarea îmbinărilor cu subinterogări

Nu este recomandat să vă alăturați cu subinterogări; subinterogări trebuie înlocuite cu tabele temporare. Conectarea subinterogărilor poate duce la o pierdere semnificativă a performanței, în timp ce executarea unei interogări pe diferite SGBD poate varia semnificativ în ceea ce privește viteza. Viteza de execuție a acestor interogări este, de asemenea, sensibilă la statisticile din SGBD. Motivul acestui comportament este că optimizatorul SGBD nu poate determina întotdeauna corect planul optim de execuție a interogării, deoarece optimizatorul nu știe nimic despre câte rânduri va reveni o subinterogare după executarea sa.

  • Utilizarea tabelelor virtuale în interogările de interogare

Tabelele virtuale la nivelul SGBD sunt executate ca subinterogări, deci motivele sunt aceleași ca în primul paragraf.

  • Utilizarea condițiilor într-o interogare care nu se potrivesc cu indexurile existente

Dacă în condițiile de interogare (în operator UNDE sau în condițiile unui tabel virtual) sunt utilizate câmpuri care nu sunt toate incluse în index, această interogare va fi executată folosind scanarea tabelelor de construcție SQL sau scanarea indexului (în totalitate sau parțial). Acest lucru va afecta nu numai timpul de execuție al interogării, ci și blocările S excesive vor fi impuse pe rânduri suplimentare, care la rândul lor pot duce la escaladarea blocărilor, adică întreaga tabelă va fi blocată.

  • Folosind SAU în condiții de interogare

Folosind operatorul logic SAU in constructie UNDE poate duce, de asemenea, la o scanare a tabelului. Acest lucru se datorează faptului că SGBD nu poate utiliza indexul corect. In schimb SAUputeți aplica construcția COMBINAȚI TOATE.

  • Obținerea datelor printr-un punct pentru câmpuri de tip complex

Nu este recomandat să obțineți valori printr-un punct (în construcție ALEGE UNDE), deoarece dacă atributul obiect se dovedește a fi un tip compozit, îmbinarea va avea loc cu fiecare tabelă din acest tip compozit. Ca urmare, interogarea pe SGBD va fi semnificativ complicată; acest lucru poate împiedica optimizatorul să aleagă planul corect de execuție a interogării.

Interogările în lot completează în mod logic funcționalitatea tabelelor temporare și oferă mai multe opțiuni atunci când lucrați cu interogări.

Într-o interogare pe loturi, de fapt, puteți descrie mai multe interogări, ambele legate între ele folosind tabele temporare și nu legate (este posibil, dar nu este clar de ce?). Ca rezultat, puteți executa toate cererile secvențial și puteți accepta ca rezultat fie o matrice cu rezultatele fiecărei cereri, fie rezultatul ultimei. Pentru a obține o matrice cu rezultatele interogării, utilizați metoda RunPackage () cerere obiect și pentru a obține rezultatul ultimei cereri ExecuteRequest ().

În textul cererii, cererile de pachet sunt separate prin „;” (punct şi virgulă). O interogare batch are un spațiu de nume pentru tabele virtuale. Utilizarea unui manager de tabel temporar nu este necesară, dar este posibilă dacă doriți să transferați tabele temporare dintr-o interogare batch în alta.
Cod 1C v 8.x Procedura de procesare a înregistrării (Refuz, Mod de înregistrare)

Cerere \u003d Cerere nouă;
Request.Text \u003d "
| ALEGE
| Nomenclatură, SUM (Cantitate) AS Cantitate
| MEDIC POSTAL
| FROM
| UNDE
| Link \u003d & Link
| LOAD BY Nomenclatură
|;
| ALEGE DIFERITE
| Nomenclatură
| POST Lista de articole
| FROM
| Document.Income.Produse
| UNDE
| Link \u003d & Link
|;
| ALEGE
| Doc. Nomenclatură,
| Doc.Quantity AS Doc_Quantity,
| ESTE NUL (Reg.Amount Restaining, 0) AS Reg_Number
| FROM
| DOCTCH AS Doc
| ÎMBINĂRI STÂNGA
| Registrul de acumulare. Solduri de bunuri. Rămâne (,
| Nomenclatura B (SELECTARE DIVERSE
| Nomenclatură
| DE
| Lista de articole AS Lista de articole)) AS Reg
| DE
| Doc.Nomenclature \u003d Reg.Nomenclature ";

În timp ce Fetch.Next () Buclă
// Verificați dacă există reziduuri negative
// Glisați prin registru
Sfârșitul ciclului;
Sfârșitul procedurii

De fapt, am eliminat definiția obiectului de interogare și utilizarea managerului de tabel temporar, am combinat textele de interogare (notați separatorul ";" între texte). Ca urmare, textul interogării a devenit mai lizibil (iar lizibilitatea interogării este mult îmbunătățită atunci când se utilizează proiectantul interogării).

După executarea cererii către variabilă Matrice de rezultate vom avea 3 elemente. Primele două vor conține un număr care caracterizează numărul de înregistrări plasate în tabelele temporare DOCT și Lista articolelor, iar al treilea va conține o selecție cu câmpurile Nomenclatură, Doc_Number și Reg_Number.

Într-o variabilă Rezultatul cererii numai eșantionul va fi inclus.

Ei bine, asta este pentru solicitările de lot. Un mecanism foarte convenabil atât din punctul de vedere al scrierii interogărilor, cât și din punctul de vedere al citirii interogărilor complexe.

Informații preluate de pe site

Articolul descrie mecanismul cererilor de loturi implementate în platforma 1C: Enterprise. După ce citiți articolul, veți afla:

  • Ce sunt cererile de lot și la ce servesc?
  • Cum creez un pachet de interogări folosind Query Builder?
  • Cum returnez o serie de rezultate pentru fiecare interogare dintr-un lot?

Aplicabilitate

Materialul este relevant pentru versiunile actuale ale platformei 1C: Enterprise, versiunea 8.3

Scopul lotului de cerere

Platforma vă permite să lucrați cu cereri de lot. Avem ocazia să executăm mai multe cereri „simultan”. Într-o cerere de lot, textele cererii sunt separate prin „;” (punct şi virgulă).

Interogările sunt executate secvențial, în timp ce tabelele temporare care au fost create în timpul executării unei interogări vor exista până la sfârșitul execuției întregului lot de interogare sau până la executarea unei interogări în lotul care distruge acest tabel temporar. O diferență importantă față de o subinterogare este că rezultatele fiecărei cereri de loturi sunt disponibile separat.

Pachetele de interogare vă permit să realizați o execuție de interogare etapizată. Pentru a face acest lucru, într-o interogare în lot, sunt create mai întâi tabele temporare, apoi utilizarea lor comună (unire, unire, filtre) pentru a obține rezultatul final al interogării. De asemenea, este important să rețineți că utilizarea tabelelor temporare în interogările de tip lot poate îmbunătăți lizibilitatea textului interogării.

Interogările voluminoase cu interogări imbricate înfășurate una în alta sunt adesea destul de greu de înțeles. Dar dacă rescrieți o astfel de interogare folosind tabele temporare, vizibilitatea interogării poate fi îmbunătățită semnificativ. Utilizarea unui lot de interogări cu tabele temporare poate îmbunătăți, de asemenea, performanța interogării.

Există tehnici pentru optimizarea performanței interogării bazate pe înlocuirea interogărilor imbricate cu tabele temporare.

Un tabel temporar poate fi util atunci când trebuie să utilizați aceleași date de mai multe ori într-o interogare mare, de exemplu, alăturarea sau alăturarea cu alte tabele. Atunci când se utilizează interogări imbricate, astfel de date ar trebui recuperate de mai multe ori folosind aceleași interogări imbricate, ceea ce, desigur, ar afecta atât lizibilitatea textului, cât și performanța.

Construiți un pachet de interogări folosind Designer

Cererile individuale incluse în pachet sunt separate în text de „;” (punct şi virgulă). Pentru a evita împărțirea manuală a textului interogării, puteți utiliza Query Designer pentru a face acest lucru.
Generatorul de interogări are o filă separată pentru pachetele de interogare. Cererile pot fi adăugate la pachet folosind butonul corespunzător din bara de comandă și, de asemenea, mutate în sus sau în jos.

Afișarea vizuală a interogărilor individuale - file din partea dreaptă a proiectantului, cu care puteți merge la editarea textului unei interogări individuale. Pe aceste file, sunt afișate nume pentru tabele temporare, pentru cereri de recuperare a datelor - „Cerere pentru lotul 2” etc., pentru distrugere - „- NameBT”.

De asemenea, tabelele temporare create în cadrul acestui pachet apar în lista tabelelor bazei de date. Cu toate acestea, acest lucru nu înseamnă că tabelele temporare sunt stocate în baza de date împreună cu toate celelalte tabele infobază.

Efectuarea de cereri de pachete

Dacă obiectul Cerereexecutând interogarea lot, este instalat managerul temporar de tabele, tabelele temporare care nu au fost distruse în interogarea lot vor fi salvate în managerul instalat.

În textul unei cereri de loturi, este posibil să utilizați și să distrugeți tabelele temporare care existau în managerul de tabele temporare instalat în momentul lansării pachetului pentru execuție.

Pe lângă metodă A executa ()care execută secvențial toate cererile pachetului și returnează rezultatul ultimei cereri din pachet, există o altă metodă în platformă - RunPackage ().

Această metodă execută toate solicitările secvențial și returnează o serie de rezultate pentru fiecare cerere din pachet, în ordinea în care cererile apar în corpul pachetului.

Rezultatul executării unei interogări pentru distrugerea unui tabel temporar este valoarea Nedefinitcare este plasat și în matricea de rezultate.

Când interogarea mea a devenit atât de complexă încât a fost dincolo de înțelegerea mea, am decis să folosesc interogări în lot.

Dar m-am confruntat cu faptul că nu știu nimic despre ei. S-a dovedit că totul este foarte simplu. În 5 minute veți putea utiliza cererile de lot. Începeți să citiți.

După cum sa dovedit, totul este foarte simplu. Trebuie doar să scrieți mai multe interogări separate prin punct și virgulă. Rezultatul va fi returnat în ultima solicitare.

Cererile de loturi au apărut numai în versiunea 8.1.11.67.4.

Iată textul cererii:

SELECT T1.Zn POSIT VTLETTERS DIN (SELECT "A" AS KN COMBINE ALL SELECT "B") AS T1;

SELECT T1.Zn PLACE WTDigits FROM (SELECT "1" AS KN COMBINE ALL SELECT "2") AS T1;

ALEGEȚI TB.Zn, TC.Zn, TB.Zn + TC.Zn DIN VT Litere AS TB, VT Numere AS TC

Interogările în lot sunt acceptate în orice consolă de interogare obișnuită.

Figura arată un exemplu de execuție a interogării:

Și acum puțin din experiență. De ce avem nevoie de solicitări de lot.

Faptul este că puteți atașa un rezultat intermediar la tabelul temporar, care poate fi necesar în mai multe interogări ulterioare.

Anterior, când nu existau tabele temporare, trebuia să duplicați textul interogării.

Puteți, desigur, să renunțați la interogarea prin lot executând mai multe interogări secvențial și manipulând tabele imbricate. Dar solicitările de lot sunt mai convenabile. Scrieți doar o interogare și nu vă gândiți la plasarea tabelelor temporare. Totul se întâmplă de la sine.

În plus, dacă se utilizează un sistem de compunere a datelor (ACS), acesta selectează în mod inteligent câmpurile necesare și minimizează întregul lot de cereri.

Dacă solicitările aveau o metodă Request.Run () atunci acum există o metodă Request.RunPackage (), care returnează toate tabelele din pachet, ca matrice.

Anunțul cererilor de lot pe site-ul web 1c este aici: http://v8.1c.ru/overview/release_8_1_11/#Funcțional

Povestea vieții

Permiteți-mi să explic ce m-a determinat să fac cereri de lot.

Deci, imaginați-vă că există un document, are o secțiune tabelară. Într-o coloană " Eroare»Semnați dacă există o eroare la completarea documentului. Într-o coloană " TextErrors»Pot exista una sau mai multe propoziții cu texte de eroare. Tipurile de erori conținute în propuneri sunt cunoscute în prealabil.

Deci, introducem o listă cu toate erorile din tabel. Coduri de eroare - conține codul de eroare și șirul de căutare.

Primim una, două sau mai multe erori pentru fiecare linie. pentru că pot exista erori multiple pe o singură linie.

Dar este posibil ca eroarea să nu fie recunoscută, adică steag " Eroare„Stă, iar textul erorii nu ne-a dat un cod de eroare.

Facem unirea la stânga, unde codul de eroare este NULL, dăm codul de eroare " Alte erori» .

Însă problema a fost că existau aproximativ 200 de coduri de eroare, deci îmbinarea din stânga a funcționat foarte mult timp. A trebuit să-l înlocuiesc cu o conexiune internă care zbura. Dar, în același timp, liniile pentru care nu a fost găsită eroarea s-au pierdut. Nu am reușit niciodată să-mi dau seama cum să trag aceste linii în rezultat.

Cererea a fost scrisă pentru sistemul de layout, adică în principiu nu pot fi utilizate tabele de valori sau tabele temporare. Aici au venit cererile de lot.

Am concatenat încă o dată toate liniile cu erori cu toate liniile pentru care s-au găsit erori și am adăugat în continuare tipul de eroare „Alte erori”.

Să analizăm modul în care s-a schimbat (mai degrabă completat) sintaxa textelor de interogare cu un exemplu simplu: Consumabil conținând în secțiunea tabelară Produse lista produselor vândute și cantitatea. La realizarea unui astfel de document, este necesar să se asigure controlul soldurilor negative stocate în registrul de acumulare a soldurilor Balanțe de mărfuri.

Structura de configurare este prezentată în figură.

(16,22 kilobyți) Descărcări: 64

Să formăm o interogare pentru secțiunea tabelară a documentului și tabelul virtual Resturi registru de acumulare. Să luăm în considerare posibilele rânduri duplicate din document, pentru aceasta vom grupa înregistrările.

Cerere \u003d Cerere nouă;
Request.Text \u003d "
| ALEGE
| Doc. Nomenclatură,
| SUMA (Doc.Quantity) AS Doc_Number,
| MINIM (ESTE NUL (Reg. Cantitate rămasă, 0)) AS Reg_Number
| FROM
| Document.Consumabil.Bunuri AS Doc
| ARTICULAȚIA STÂNGA
| Registrul de acumulare. Solduri de bunuri. Rămâne () AS Reg
| DE
| Doc.Nomenclature \u003d Reg.Nomenclature
| UNDE
| Link \u003d & Link
| LOAD BY Doc.Nomenclature ";

// Glisați prin registru

Sfârșitul ciclului;

Sfârșitul procedurii

Bineînțeles, interogarea dată nu este absolut optimă. Cu ajutorul interogărilor imbricate, îl optimizăm: Să grupăm partea tabelară a documentului înainte de a-l alătura cu tabelul reziduurilor, trecem lista bunurilor la parametrii tabelului virtual ca valoare a condiției pentru calcularea reziduurilor. Ca urmare, solicitarea noastră va lua următoarea formă:

| ALEGE
| Doc. Nomenclatură,

| FROM
| (SELECTAȚI

| DE
| Document.Income.Produse
| UNDE
| Link \u003d & Link
| LOAD BY Nomenclature) AS Doc
| ARTICULAȚIA STÂNGA
Nomenclatura B
| (ALEGE DIFERITE
| Nomenclatură
| DE
| Document.Income.Produse
| UNDE
| Link \u003d & Link)) AS Reg
| DE

Dacă într-o interogare a fost necesar să obținem date din rămășițele diferitelor registre, atunci valoarea filtrului și, prin urmare, a doua noastră interogare, s-ar repeta în toți parametrii tabelelor virtuale, este firesc ca sistemul să acceseze din nou baza de date pentru fiecare subinterogare pentru a obține date.

Mese temporare

Nu-mi amintesc din ce versiune a devenit posibilă utilizarea tabelelor temporare în interogări. Pentru aceasta, se folosește obiectul "Temporary Table Manager". De fapt, managerul de tabele temporare descrie spațiul de nume al tabelelor temporare și este responsabil pentru crearea și distrugerea lor în baza de date.

Tabelele temporare în sine sunt într-adevăr create fizic în baza de date, deci ar trebui să le tratați cu atenție, deoarece subsistemul discului este în prezent cea mai lentă parte a tehnologiei, iar viteza de creare și distrugere a tabelelor depinde direct de aceasta.

Să rescriem interogarea pentru a utiliza tabele temporare. Plasați secțiunea tabelară grupată a documentului și lista produselor pentru filtrul tabelului virtual în tabele temporare:

Procedura de procesare a înregistrării (refuz, modul de înregistrare)

MVT \u003d New TemporaryTables Manager;

Cerere \u003d Cerere nouă;
Request.Text \u003d "
| ALEGE
| Nomenclatură, SUM (Cantitate) AS Cantitate
| MEDIC POSTAL
| FROM
| Document.Income.Produse
| UNDE
| Link \u003d & Link
| LOAD BY Nomenclature ";

Cerere \u003d Cerere nouă;
Request.TemporaryTables Manager \u003d MVT;
Request.Text \u003d "SELECT DIVERSE
| Nomenclatură
| POST Lista de articole
| FROM
| Document.Income.Produse
| UNDE
| Link \u003d & Link ";

Cerere \u003d Cerere nouă;
Request.TemporaryTables Manager \u003d MVT;
Request.Text \u003d "
| ALEGE
| Doc. Nomenclatură,
| Doc.Quantity AS Doc_Quantity,
| ESTE NUL (Reg.Amount Restaining, 0) AS Reg_Number
| FROM
| DOCTCH AS Doc
| ARTICULAȚIA STÂNGA
| Registrul de acumulare. Solduri de bunuri. Rămâne (,
| Nomenclatură
| DE
| DE
| Doc.Nomenclature \u003d Reg.Nomenclature ";

QueryResult \u003d Query.Run ();
Selection \u003d QueryResult.Select ();

While Sampling.Next () Buclă

// Verificați dacă există reziduuri negative

// Glisați prin registru

Sfârșitul ciclului;

Sfârșitul procedurii

Când utilizați tabele temporare în textul interogării, utilizați instrucțiunea Loc pentru a crea un nou tabel temporar, în acest caz sistemul nu transferă conținutul acestui tabel la rezultatul interogării (vezi nota 1 și exemplul 2 din textul de mai sus), dar numărul de înregistrări plasate în tabelul temporar, dacă doriți, nu puteți accepta această valoare.

De asemenea, este permisă utilizarea instrucțiunii Distruge în acest caz tabela temporară este distrusă, altfel tabelele temporare sunt distruse împreună cu obiectul temporar al managerului tabelelor.

În interogarea noastră principală, am folosit numele tabelelor temporare ca indicație a sursei de date (trebuie să li se atribuie un sinonim, pe care îl vedem în text). Puteți utiliza tabelele temporare ca sursă de mai multe ori, ceea ce, dacă este utilizat cu îndemânare, vă va permite să scurtați textul interogării (să îmbunătățiți lizibilitatea interogărilor complexe) și să măriți viteza (atunci când utilizați datele temporare ale tabelelor în mai multe locuri din interogare).

Cereri de lot

Interogările în lot completează în mod logic funcționalitatea tabelelor temporare și oferă mai multe opțiuni atunci când lucrați cu interogări.

Într-o interogare pe loturi, de fapt, puteți descrie mai multe interogări, ambele legate între ele folosind tabele temporare și nu legate (este posibil, dar nu este clar de ce?). Ca rezultat, puteți executa toate cererile secvențial și puteți accepta ca rezultat fie o matrice cu rezultatele fiecărei cereri, fie rezultatul ultimei. Pentru a obține o matrice cu rezultatele interogării, utilizați metoda RunPackage () cerere obiect și pentru a obține rezultatul ultimei cereri ExecuteRequest ().

În textul cererii, cererile de pachet sunt separate prin „;” (punct şi virgulă). O interogare batch are un spațiu de nume pentru tabel virtual. Utilizarea unui manager de tabel temporar nu este necesară, dar este posibilă dacă doriți să transferați tabele temporare dintr-o interogare batch în alta.

Să rescriem procedura de utilizare a cererilor de lot:

Procedura de procesare a înregistrării (refuz, modul de înregistrare)

Cerere \u003d Cerere nouă;
Request.Text \u003d "
| ALEGE
| Nomenclatură, SUM (Cantitate) AS Cantitate
| MEDIC POSTAL
| FROM
| Document.Income.Produse
| UNDE
| Link \u003d & Link
| LOAD BY Nomenclatură
|;
| ALEGE DIFERITE
| Nomenclatură
| POST Lista de articole
| FROM
| Document.Income.Produse
| UNDE
| Link \u003d & Link
|;
| ALEGE
| Doc. Nomenclatură,
| Doc.Quantity AS Doc_Quantity,
| ESTE NUL (Reg.Amount Restaining, 0) AS Reg_Number
| FROM
| DOCTCH AS Doc
| ARTICULAȚIA STÂNGA
| Registrul de acumulare. Solduri de bunuri. Rămâne (,
| Nomenclatura B (SELECTARE DIVERSE
| Nomenclatură
| DE
| Lista de articole AS Lista de articole)) AS Reg
| DE
| Doc.Nomenclature \u003d Reg.Nomenclature ";

While Sampling.Next () Buclă

// Verificați dacă există reziduuri negative

// Glisați prin registru

Sfârșitul ciclului;

Sfârșitul procedurii

De fapt, am eliminat definiția obiectului de interogare și utilizarea unui manager de tabel temporar, am combinat textele de interogare (rețineți separatorul ";" între texte). Ca urmare, textul interogării a devenit mai lizibil (iar lizibilitatea interogării este mult îmbunătățită atunci când se utilizează proiectantul interogării).

După executarea cererii către variabilă Matrice de rezultate vom avea 3 elemente. Primele două vor conține un număr care caracterizează numărul de înregistrări plasate în tabele temporare DOCT și Listă de obiecte, iar al treilea va conține o selecție cu câmpuri Nomenclatură, Doc_ număr și Reg_ număr.

Într-o variabilă Rezultatul cererii numai eșantionul va fi inclus.

Ei bine, asta este pentru solicitările de lot. Un mecanism foarte convenabil atât din punctul de vedere al scrierii interogărilor, cât și din punctul de vedere al citirii interogărilor complexe.