Internet Windows Android

Descrierea tabelului temporar din cererea 1s.

43
NULL – valori lipsă. A nu se confunda cu valoarea zero! NULL nu este un număr, nu este egal cu un spațiu, o referință goală sau nedefinit. NULL este o valoare de formare a tipului, adică există un tip NULL și o singură valoare de acest tip. NUL... 26
Pentru a genera și executa interogări către tabelele bazei de date în platforma 1C, este utilizat un obiect special al limbajului de programare Query. Acest obiect este creat prin apelarea constructului New Request. Cerere convenabilă... 18
Articolul oferă tehnici utile atunci când lucrați cu interogări 1C v.8.2, precum și informații care nu sunt atât de bine cunoscute despre limbajul de interogare. Nu încerc să ofer o descriere completă a limbajului de interogare, dar vreau să mă opresc doar asupra... 13
LIKE - Operator pentru verificarea asemănării unui șir cu un model. Analog de LIKE în SQL. Operatorul SIMILAR vă permite să comparați valoarea expresiei specificate în stânga acesteia cu șirul de model specificat în dreapta. Sensul expresiei...

Limbajul de interogare 1C:Enterprise 8 vă permite să utilizați tabele temporare în interogări. Utilizarea tabelelor temporare ajută la îmbunătățirea performanței interogărilor și face interogările complexe mai ușor de citit.

Lucrul cu tabele temporare este asigurat de două componente:

Un obiect al limbajului încorporat, Temporary Table Manager, care stochează date din tabele temporare;
sintaxa limbajului de interogare care vă permite să creați noi tabele temporare și să utilizați tabele temporare existente.
Manager temporar de masă
Managerul de tabele temporare este conceput pentru a gestiona durata de viață a tabelelor temporare create în timpul funcționării unei soluții de aplicație.

Într-o soluție de aplicație, poate fi creat un număr arbitrar de instanțe temporare de manager de tabele, fiecare dintre acestea stochând propriul set de tabele temporare. Fiecare tabel temporar este identificat în mod unic prin numele său, iar în cadrul unui singur manager de tabel temporar, toate tabelele temporare trebuie să aibă nume unice.

O instanță temporară de manager de tabel poate fi creată folosind constructorul New. De exemplu:

Toate tabelele temporare create într-o anumită instanță de manager există atâta timp cât există instanța temporară de manager de tabel în sine. Când o instanță de manager este distrusă, toate tabelele temporare conținute în ea sunt, de asemenea, șterse.

Managerul de tabel temporar poate fi închis cu forța folosind metoda Close(). Aceasta va șterge toate tabelele create în el. Lucrul în continuare cu această instanță a managerului va fi imposibil.

Crearea tabelelor temporare
Tabelele temporare sunt create folosind obiectul Request din limbajul încorporat 1C:Enterprise 8.

Conexiunea dintre o interogare și un manager de tabel temporar se realizează folosind proprietatea queryTemporaryTableManager, care specifică instanța managerului în care ar trebui create tabelele temporare. De exemplu:

TemporaryTableManager = TemporaryTableManager nou;
Solicitare = Solicitare nouă;
Query.TemporaryTableManager = TemporaryTableManager;

Un tabel temporar poate fi creat din datele bazei de date sau dintr-o sursă de date externă (cum ar fi un tabel de valori).

Pentru a crea un tabel temporar din datele bazei de date, setați obiectul Interogare la un manager de tabel temporar și apoi executați o interogare a bazei de date folosind cuvântul cheie PLACE urmat de numele tabelului temporar de creat. Cuvântul cheie PUT este situat după lista de selecție a interogărilor. De exemplu:

ALEGE
Cod,
Nume
PLACE Tabel temporar
DIN Director.Nomenclatură

Rezultatul executării unei astfel de interogări va conține un rând cu o coloană numită „Cantitate”, care va conține numărul de înregistrări plasate în tabelul creat.

Dacă managerul temporar de tabelă nu este instalat sau managerul a fost închis, va fi generată o eroare.

Dacă un tabel cu numele specificat există deja în managerul de tabel temporar instalat, va fi generată o eroare.

Dacă trebuie să creați un index pentru un tabel temporar, trebuie să specificați cuvântul cheie INDEX BY în interogare, urmat de o listă a câmpurilor pe care doriți să construiți indexul.

De exemplu:

ALEGE
Cod,
Nume
PLACE Tabel temporar
DIN Director.Nomenclatură
INDEX DUPĂ Cod

Câmpurile după care are loc indexarea trebuie să fie în lista de selecție.

Pentru a crea un tabel temporar și a bloca datele tabelelor pe baza cărora este creat cel temporar, trebuie să folosiți construcția FOR CHANGE, ar trebui să folosiți construcția FOR CHANGE.

De exemplu:

ALEGE
Invoice.Link,
Număr de factură,
Data facturii
PLACE Tabel temporar
DIN
Document. Factură AS
UNDE
Factură.Link B(&Documente)

PENTRU SCHIMBARE

Pentru a crea un tabel temporar pe baza unei surse externe, în textul de interogare din lista de surse, specificați numele parametrului în care va fi plasată sursa externă. Restul sintaxei este identică cu crearea normală de tabel temporar. Următoarele pot acționa ca sursă externă:

Tabel de valori;
parte tabulară;
rezultatul interogării.
Mai jos este un exemplu de creare a unui tabel temporar bazat pe o sursă externă:

ALEGE
Cod,
Nume
PLACE Tabel temporar
FROM &ExternalSource AS ExternalSource

În acest exemplu, conținutul coloanelor „Cod” și „Nume” dintr-o sursă externă, de exemplu, un tabel de valori transmis ca parametru „ExternalSource”, va fi plasat în tabelul temporar „TemporaryTable”.

Dacă un tabel temporar este creat pe baza unei surse externe, îmbinările și îmbinările nu pot fi utilizate în interogare. De asemenea, nu puteți utiliza câmpuri care sunt detalii ale elementelor de tabel pe baza cărora este creat un tabel temporar.

Utilizarea tabelelor temporare
Pentru a utiliza tabelele temporare existente într-o interogare, trebuie să setați obiectul Interogare la un manager de tabel temporar, iar apoi tabelele temporare conținute în acel manager de tabel temporar pot fi accesate după nume, la fel ca tabelele de interogare obișnuite.

Eliminarea tabelelor temporare
Pentru a șterge un tabel temporar din managerul de tabel temporar, utilizați cuvântul cheie în limbajul de interogare DISTRUGERE, urmat de numele tabelului care urmează să fie distrus. De exemplu:

DISTROY TemporaryTable

Dacă tabela care este distrusă nu există, va fi aruncată o eroare.

Foarte des, acest lucru dă naștere la o eroare comună - o interogare într-o buclă. Adică, dezvoltatorul nu știe cum să includă un tabel de valori într-o interogare și, prin urmare, începe să îl parcurgă într-o buclă și să facă propria interogare pentru fiecare iterație. Să ne uităm la un exemplu simplu despre cum să faceți acest lucru.

Exemplu

Ca exemplu de plasare a unui tabel de valori într-o interogare 1C 8.3, să luăm o situație simplă - există, care conține o listă de articole. Este necesar să se obțină date despre soldurile de depozit pentru fiecare articol.

Obțineți 267 de lecții video pe 1C gratuit:

Pot exista două situații în care este creat un tabel de valori - în mod programatic și deja primit de undeva (de exemplu, PM-ul unui document). Dacă tabelul este creat programatic, trebuie setați tipul de coloană, este ușor de făcut

Acestea. Când adăugați o coloană, trebuie să specificați tipurile de date ca al doilea parametru folosind constructorul de obiect „Descriere tip”.

Să trecem la construirea interogării. Un tabel de valori poate fi trecut într-o interogare folosind un &Parametru simplu.

O avertizare obligatorie este că tabelul creat trebuie plasat într-un tabel temporar, altfel sistemul va afișa mesajul: „Eroare la apelarea metodei context (Run): Conținutul unui obiect de date poate fi preluat doar într-un tabel temporar».

Astfel, plasăm prima interogare într-un tabel temporar, apoi o conectăm la registrul de bilanț al stocurilor.

Gata, problema rezolvata.

Când construiți interogări, în limbajul 1c este posibil să obțineți rezultatul executării unei interogări folosind comanda: „Place<ИмяВременнойТаблицы>", Unde<ИмяВременнойТаблицы>- numele „tabelului temporar”, care este o proprietate a obiectului „Query” și este un obiect de tip TemporaryTableManager, care descrie spațiul de nume al tabelelor temporare și este responsabil pentru crearea și distrugerea acestora în baza de date. Acest mecanism este utilizat pentru a obține date intermediare de interogare pentru utilizare ulterioară în alte interogări, ceea ce face mai convenabil să le depanați, să optimizați codul și să faceți interogările mai lizibile.

Să presupunem că aveți o interogare cu mai multe tabele temporare și trebuie să depanați conținutul fiecăruia dintre ele. De obicei, astfel de sarcini sunt rezolvate folosind consola de interogări, dar dacă acest lucru nu este posibil (de exemplu, liste de valori, tabele etc. sunt transmise la interogare), utilizați metoda de mai jos.

Adăugăm următoarea funcție la modulul nostru (funcția de server, dacă aceasta este o aplicație gestionată):

Funcție Date VT (Interogare, Nume VT) Date Table = Interogare nouă; DataTables. Text = "Selectați * | Din " + NameVT+ " |" ; ReturnTableData. A executa ( ). Descărcați() ; EndFunction

Să-l numim după textul solicitării, de exemplu:

Solicitare = Solicitare nouă; Cerere. Text = „SELECT |TZItotal.Name |PLACE Final |FROM |&TZItotal AS TZItotal |; |//////////////////////////////// /////////////////////// |SELECT |* |LOC Nr. |DIN |Directoar.Nomenclator AS Nomenclator |; ///////////////////////////////////////// |SELECTARE |* |Din |Final AS Total |. LEFT JOIN Nom AS Nom | BY Total.Name = Nom.Name"; Cerere. TemporaryTableManager = nou TemporalTableManager; Cerere. a executa ( ) ; Tabel = DataVT(Interogare, „Final” );

Acum variabila Tabel conține tabelul temporar Total, care poate fi vizualizat în depanare sau poate fi afișat într-un document foaie de calcul.

Durata de viață

Când se execută o interogare, platforma distruge toate tabelele temporare care au fost create ca parte a execuției sale. Adică, durata de viață a tabelelor temporare create în cadrul unei cereri din platforma 1C:Enterprise începe din momentul în care tabelul este creat în cerere și se termină când este executat.

În acest caz, este posibil să distrugi un tabel temporar în mod programatic prin executarea instrucțiunii „DISTRUGERE” într-unul dintre pachetele de interogare.<ИмяВременнойТаблицы>". Apoi platforma execută comanda SQL "TRUNCATE" pentru a distruge tabelul temporar.

Când utilizați un manager de tabel temporar, dacă tabelele nu au fost distruse în mod explicit de către dezvoltator (instrucțiunea de interogare „DISTRUGERE”, resetarea managerului de tabel temporar la „Nedefinit” sau folosind metoda „Închidere()”), atunci platforma le distruge independent după ce a fost distrus contextul în care s-au format. Cu alte cuvinte, obiectul va fi distrus când se încheie procedura sau funcția în care a fost creat.

Impactul asupra performanței

Utilizarea tabelelor temporare poate reduce semnificativ încărcarea pe serverul SQL prin reutilizarea unui eșantion generat anterior din tabel în alte interogări. Desigur, crearea și stocarea tabelelor temporare necesită resurse suplimentare, dar în comparație cu irosirea resurselor pe interogări repetate la tabele, această opțiune este mai optimă.

Crearea tabelelor temporare pe baza tabelului de valori poate avea un impact negativ asupra performanței, deoarece transferul tabelului de valori și popularea tabelului temporar pe serverul SQL pe baza acestuia poate dura mult timp și poate crea încărcare suplimentară pe sistem. Ar trebui să utilizați această caracteristică numai dacă interogările viitoare folosesc intens date din tabelul de valori. În caz contrar, un pas mai optim ar fi procesarea acestui tabel în mod programatic după executarea interogării bazei de date. Răspunsul exact depinde de problema specifică.

Concluzie

Suportul pentru tabele temporare de către platforma 1C:Enterprise vă permite să scrieți interogări mai optime în baza de date, în timp ce textul interogării în sine este, de asemenea, simplificat și devine mai lizibil.

Cel mai important argument în favoarea utilizării tabelelor temporare este că utilizarea lor permite serverului SQL să construiască planuri de interogare mai optime.

Mecanismul de interogare, care a apărut în versiunea 7 a programului 1C, a devenit din ce în ce mai răspândit și a crescut constant în popularitate odată cu lansarea primelor versiuni ale platformei 8. Apariția formularelor gestionate și a sistemelor de compunere a datelor a mărit semnificativ domeniul de aplicare al acestui instrument. Cu toate acestea, multor programatori începători le este destul de dificil să-l stăpânească.

Utilizarea unui obiect numit „Manager tabel temporar” vă permite să:

  • Simplificați semnificativ textul cererii;
  • Împărțiți-l în blocuri mai simple;
  • Creșteți lizibilitatea și structura acestuia.

Câteva cuvinte despre cum funcționează

În principiu, munca unui manager temporar de masă poate fi împărțită în patru etape de utilizare:

  1. Crearea unui manager;
  2. Completarea acestuia;
  3. Citirea datelor din tabele;
  4. Distrugerea managerului și curățarea meselor.

Să vorbim despre fiecare etapă mai detaliat.

Crearea unui manager temporar de tabel

Pentru a defini acest obiect, trebuie să executați codul prezentat în Fig. 1

Aici trebuie remarcat că definiția managerului temporar de tabelă este dată înaintea operatorului Execute(), în caz contrar execuția codului este garantată a fi întreruptă de o eroare, a cărei fereastră de informare este indicată în Fig. 2.

Fig.2

Completarea managerului

În aceeași figură 1, există o linie care transferă selecția într-un tabel temporar. Începe cu operatorul „Loc”. Destinația este numele tabelului de destinație.

Folosind „Query Builder”, această linie poate fi creată în fila „Advanced” Fig. 3.

Fig.3

Pentru a face acest lucru aveți nevoie de:

  1. Setați comutatorul „Tip de interogare” în poziția „Creare tabel temporar”;
  2. Specificați numele receptorului.

Dacă utilizați un depanator pentru a verifica secvența de completare a managerului, veți descoperi că datele vor apărea în el numai după executarea metodei de solicitare Execute().

Puteți determina dacă un manager este plin folosind operatorul Cantitate(). Exemplu de rând: MVT.Tables.Quantity().

Citirea tabelelor managerului

Următorul pas este să citiți datele din tabelele existente într-o altă interogare. Există o problemă aici: noua interogare care este creată nu știe despre existența tabelului populat, așa că nu va apărea în fereastra „Bază de date” a consolei.

Acesta trebuie să fie înregistrat și creat manual.

Pentru a face acest lucru, în fila „Tabele și câmpuri” (Fig. 4), trebuie să efectuați o anumită secvență de acțiuni:

Fig.4

  1. În meniul ferestrei „Tabele” din această filă, faceți clic pe butonul „Creați o descriere temporară a tabelului”;
  2. În fereastra care se deschide, trebuie să specificați numele câmpului și descrierea acestuia (tipul câmpului), așa cum este specificat în tabelul existent;
  3. Câmpurile sau funcțiile necesare cu acestea trebuie mutate în a treia fereastră a filei.

Pe parcursul întregului timp de execuție, tabelele temporare sunt stocate în memoria RAM a computerului utilizatorului atunci când se lucrează în modul fișier sau înfunda memoria serverului în modul client-server până când funcția sau procedura care a chemat managerul este complet finalizată. Volumele mari de date pot reduce semnificativ performanța chiar și a celui mai slab hardware.

Îndepărtarea meselor

În general, specialiștii cu experiență, pentru a nu înfunda prea mult memoria, recomandă ștergerea tabelelor temporare imediat după ce le folosesc, dacă nu vor fi apelate altundeva.

Eliminarea tabelelor din manager se poate face în două moduri principale:

  • Prin specificarea cuvântului cheie Distruge direct în textul cererii;
  • Folosind metoda Close() aplicată direct managerului.

În al doilea caz, toate tabelele create de diverse interogări vor fi distruse forțat.

Utilizarea primei opțiuni pentru ștergerea datelor poate fi specificată în mod explicit prin scrierea unei linii precum „Destroy TableName” în textul interogării sau folosind fila „Advanced” (Fig. 2) a ferestrei „Query Designer”.

Trecând comutatorul în poziția „Distrugere” și specificând numele obiectului care trebuie șters, puteți finaliza această acțiune fără probleme.

Transfer (TK) la cerere

Una dintre cele mai frecvente utilizări ale acestui manager este trecerea unui tabel de valori ca una dintre sursele de date la o interogare. După cum știți, utilizarea directă a acestei colecții într-o solicitare în 1C nu este furnizată.

Pentru a face acest lucru, textul solicitării trebuie să conțină o linie precum „Selectați * Place MVT din &Tz ca filă”. Prin trecerea unui tabel de valori existent ca parametru „TZ” la cerere, vom primi un obiect potrivit pentru procesarea ulterioară în alte solicitări.

Singura condiție care împiedică trecerea unui TK ca parametru sunt tipurile declarate implicit ale coloanelor sale. Adică, atunci când creați coloane TK, trebuie să completați al doilea parametru cu o linie precum „New TypeDescription(“”).