Acasă / Ştiri / Tabele virtuale ale limbajului de interogare 1c. Fila Lot de interogări

Tabele virtuale ale limbajului de interogare 1c. Fila Lot de interogări

Să apelăm dialogul pentru introducerea parametrilor tabelului virtual PriceSliceLast și să indicăm că perioada va fi trecută în parametrul ReportDate. Pentru a face acest lucru, selectați acest tabel din lista Tabele și faceți clic pe butonul Opțiuni masă virtuală. Apoi selectați următoarele câmpuri din tabele:

    SprNomenclatura.

    Mamă,

PreturiSlice of Latest.Price.

- Alăturarea mesei din stânga Pe marcaj Conexiuni

: în câmpul Condiție link, valoarea dimensiunii Nomenclatură a registrului de informații trebuie să fie egală cu referința la elementul director Nomenclatură. De asemenea, debifați caseta de selectare Toate pentru tabelul de înregistrare și verificați-o pentru tabelul de căutare, setând astfel tipul de conexiune ca conexiune din stânga pentru tabelul de căutare:

- Alăturarea mesei din stânga Orez. 13.15. Relația dintre tabelele dintr-o interogare Termeni

să setăm condiția de selectare a elementelor din directorul Nomenclatură - elementele selectate trebuie să corespundă tipului de nomenclatură trecut în parametrul de solicitare Tip de nomenclatură:

- Alăturarea mesei din stânga Orez. 13.16. Conditii de selectare a elementelor Sindicate/Alias-uri: specificați alias-ul câmpului Parent = Service Group și al câmpului Link = Service.

- Faceți clic pe OK– După aceasta, trebuie să editați schema de aspect al datelor, pentru a face acest lucru în filă Resurse , faceți clic pe butonul adăuga și selectați o resursă -

- Alăturarea mesei din stânga Preţ Opțiuni

setați valoarea parametrului Nomenclature Type - Enumeration.Nomenclature Types.Service. În plus, vom elimina restricția de disponibilitate pentru parametrul ReportDate. În câmpul Tipul acestui parametru, setați compoziția datei - Data. Pentru parametrul Perioada, dimpotrivă, vom stabili o restricție de disponibilitate:

Orez. 13.17. Opțiuni de schemă de aspect

- Setări Să mergem la marcaj Setări:

Să creăm o grupare bazată pe câmpul Grup de servicii, specificând tipul de grupare Ierarhie. Fără ierarhie - numai înregistrările non-ierarhice sunt afișate în grupare. Ierarhie - atât înregistrările neierarhice, cât și cele ierarhice sunt afișate în grupare. Numai ierarhie - numai înregistrările ierarhice (părinte) sunt afișate în grupare. În cadrul acestui grup vom crea altul, fără a specifica câmpul grupului. Pe sub-fila Câmpuri selectate:

specificați câmpurile de ieșire Serviciu și Preț:

Orez. 13.18. Structura și câmpurile raportului Pe sub-fila Alte

setări vom efectua următorii pași:

Orez. 13.19. Setări pentru afișarea totalurilor generale pentru gruparea „Grup de servicii”.

Orez. 13.20. Configurarea și afișarea totalurilor pentru un raport global

    În cele din urmă, să includem parametrul Data raportului în setările utilizatorului și să setăm modul său de editare la Acces rapid. Să închidem designerul schemei de compoziție a datelor și în fereastra de editare a obiectului Listă de servicii, mergeți la fila Subsisteme. În lista subsistemelor de configurare, notați subsistemele Furnizare de servicii și Contabilitate.

În 1C: modul Enterprise Sa lansam 1C:Enterprise in modul depanare si in primul rand deschidem registrul periodic Preturi.

Apoi vom testa raportul.

Folosind acest raport ca exemplu, am studiat modul în care sistemul de compunere a datelor obține cele mai recente valori din registrul periodic de informații și cum sunt afișate grupările în funcție de ierarhia directoarelor.

Am decis să-mi aduc contribuția și să descriu acele trăsături ale limbajului care nu au fost discutate în articolele de mai sus. Articolul se adresează dezvoltatorilor începători.

1. Design „IZ”.
Pentru a obține date din baza de date nu este deloc necesară utilizarea construcției „FROM”.
Exemplu: Trebuie să selectăm toate informațiile despre bănci din directorul băncilor.

Cerere:

SELECT Directory.Bănci.*

Selectează toate câmpurile din directorul Bănci. Și este similar cu cererea:

SELECT Bănci.* FROM Directory.Bănci AS Bănci

2. Ordonarea datelor după câmpul de referință

În acest caz, pentru documente comanda se va face în ordinea „Data->Număr”, pentru cărțile de referință în „Vizualizarea principală”. Dacă comandarea nu are loc prin câmpuri de referință, atunci nu se recomandă utilizarea construcției „COMANDĂ AUTOMATĂ”.

În unele cazuri, constructul „AUTO ORDER” poate încetini procesul de selecție. În mod similar, puteți rescrie fără comandă automată pentru documente:

3.Obținerea unei reprezentări text de tip referință. Design „PRESENTARE”.

Când trebuie să afișați un câmp de tip referință, de exemplu, câmpul „Bancă”, care este o legătură către un element din directorul „Bănci”, trebuie să înțelegeți că atunci când acest câmp este afișat, o subinterogare către Directorul „Bănci” va fi executat automat pentru a obține o vizualizare a directorului. Acest lucru va încetini producția de date. Pentru a evita acest lucru, trebuie să utilizați construcția „PRESENTARE” în ​​cerere pentru a obține imediat o reprezentare a obiectului și apoi afișat pentru vizualizare.

În sistemul de compunere a datelor, acest mecanism este utilizat în mod implicit, dar atunci când creați machete în celule, ar trebui să specificați reprezentarea câmpului de referință și, de exemplu, să plasați legătura în sine în transcriere.

4. Condiție pentru eșantionarea datelor conform unui șablon.

De exemplu, trebuie să obțineți telefoane mobile salariati de tipul (8 -123- 456-78-912). Pentru a face acest lucru, trebuie să setați următoarea condiție în cerere:

SELECTEAZĂ Employee.Name, Employee.Phone AS Phone FROM Directory.Employees AS Angajati WHERE Phone LIKE "___-_-___-__-__"

Caracterul „_” este un caracter de serviciu și înlocuiește orice caracter.

5. Utilizarea simultană a totalurilor și grupărilor.


Totalurile sunt adesea folosite împreună cu grupările în acest caz, funcțiile agregate pot să nu fie specificate în totaluri.

SELECT Prestare de servicii.Organizare AS Organizație, Furnizare de servicii.Nomenclatură AS Nomenclatură, SUM(Furnizare de servicii.Sumă document) AS Sumă document FROM Document.Prestare de servicii AS Prestare de servicii GROUP BY Prestare de servicii.Organizare, Furnizare de Servicii.Nomenclatura REZULTATE PE GENERAL, Organizare, nomenclatura

În acest caz, interogarea va returna aproape la fel ca următoarea interogare:

SELECT Prestare de servicii.Organizație AS Organizație, Furnizare de servicii.Nomenclator AS Nomenclator, Furnizare de servicii.Suma de document AS Cantitatea de document FROM Document.Prestare de servicii AS Furnizare de servicii REZULTATE SUMA (Suma de document) BY GENERAL, Organizație, Nomenclatură

Doar prima interogare va restrânge înregistrările cu aceeași nomenclatură.

6. Dereferențiarea câmpurilor.

Referirea la câmpuri printr-un punct se numește operația de dereferențiere a câmpurilor de referință. De exemplu Plata.Organizarea.Unitatea Administrativa. În acest caz, în câmpul de referință „Organizație” din documentul „Plată” se referă la un alt tabel „Organizații”, în care se va obține valoarea atributului „Unitate administrativă”. Este important să înțelegeți că atunci când accesați câmpuri printr-un punct, platforma creează implicit o subinterogare și se alătură acestor tabele.

Cerere:

Poate fi reprezentat ca:

SELECTAȚI Payment.Link, Payment.Organization, Payment.Organization, Organizations. AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Organizations Software Payment.Organization = Organizations.Link

Când dereferențează câmpurile de referință de tip compus, cadrul încearcă să creeze îmbinări implicite la toate tabelele care fac parte din tipul acelui câmp. În acest caz, interogarea nu va fi optimă Dacă se știe clar ce tip de câmp este, este necesar să se limiteze astfel de câmpuri cu un construct EXPRES().

De exemplu, există un registru de acumulare „Plăți nedistribuite”, unde mai multe documente pot acționa ca registrator. În acest caz, este incorect să obțineți valorile detaliilor registratorului în acest fel:

SELECTAȚI Plăți Nealocate.Data Înregistrării, ..... FROM RegisterAcumulare.Plăți Nealocate AS Plăți Nealocate

ar trebui să restricționați tipul câmpului compus la logger:

SELECTAȚI EXPRESS(Plăți nealocate.Înregistrați ca document.Plată).Data, ..... FROM RegisterAcumulare.Plăți nealocate AS Plăți nealocate

7. Construcție „UNDE”

Cu o îmbinare la stânga a două tabele, când impuneți o condiție „UNDE” pe masa din dreapta, vom obține un rezultat similar cu rezultatul cu o îmbinare interioară a meselor.

Exemplu. Este necesar să se selecteze toți Clienții din Directorul Clienți iar pentru acei clienți care au un document de plată cu valoarea atributului „Organizație” = &Organizare, să se afișeze documentul „Plată”, pentru cei care nu au, să nu-l afișeze.

Rezultatul interogării va returna înregistrări numai pentru acei clienți care au avut plata prin organizație în parametru și va filtra alți clienți. Prin urmare, trebuie să primiți mai întâi toate plățile pentru „un astfel de” organizație într-un tabel temporar, apoi să o conectați la directorul „Clienți” folosind o alăturare stângă.

SELECT Plata.Link AS Plata, Plata.Acţionar AS Client PLACE laPlăţi FROM Document.Plata AS Plata WHERE Plata.Sucursala = &Branch; //////////////////////////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Payment FROM Director .Clients AS Clienții LEFT CONNECTION topayments AS topayments SOFTWARE Clients.Link = topayments.Client

Puteți ocoli această afecțiune într-un alt mod. Este necesar să se impună o condiție „UNDE” direct relației dintre cele două tabele. Exemplu:

SELECT Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers LEFT CONNECTION Document.Payment AS Payment Software (Clients.Link = Payment.Client AND Payment.Client.Name LIKE "Sugar Packet") GROUP BY Clients.Link, Payment. Legătură

8. Uniri cu tabele imbricate și virtuale

Interogări imbricate adesea necesar pentru a prelua date pe baza unei anumite condiții. Dacă apoi le utilizați împreună cu alte tabele, acest lucru poate încetini critic execuția interogării.

De exemplu, trebuie să obținem suma soldului de la data curentă pentru unii clienți.

SELECT UnalocatedPaymentsBalances.Customer, UnallocatedPaymentsBalances.AmountBalance FROM (SELECT Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT JOIN RegisterAccumulations.UnallocatedPayments.BalatedPayments.BalatedPayments.Balances ymentsSolduri. Client

La executarea unei astfel de interogări, optimizatorul DBMS poate face erori la alegerea unui plan, ceea ce va duce la o execuție suboptimă a interogării. La unirea a două tabele, optimizatorul DBMS selectează un algoritm de îmbinare a tabelelor pe baza numărului de înregistrări din ambele tabele. Dacă există o interogare imbricată, este extrem de dificil să se determine numărul de înregistrări pe care le va returna interogarea imbricată. Prin urmare, ar trebui să utilizați întotdeauna tabele temporare în loc de interogări imbricate. Deci, să rescriem cererea.

SELECTARE Clienți.Link AS Link PLACE tClienți DIN Director.Clienți AS Clienți WHERE
Clienți.Link B (&Clienți) ; //////////////////////////////////////////////////////////////////// /////////////////////////// SELECTAȚI tClients.Link, UnalocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances (, Client IN (SELECTARE tClients. Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

ÎN în acest caz, optimizatorul va putea determina câte înregistrări folosește tabelul temporar tClients și va putea selecta algoritmul optim pentru alăturarea tabelelor.

Mesele virtuale , vă permit să obțineți date aproape gata făcute pentru majoritatea sarcinilor aplicate (Slice of the First, Slice of the Last, Remains, Turnovers, Remains și Turnovers) Cuvântul cheie aici este virtual. Aceste tabele nu sunt fizice, ci sunt compilate de sistem din mers, adică. Când primește date de la tabele virtuale, sistemul colectează date din tabelele de registru finale, le compune, le grupează și le transmite utilizatorului.

Aceste. Când vă conectați la o tabelă virtuală, se face o conexiune la o subinterogare. În acest caz, optimizatorul DBMS poate alege și un plan de conexiune neoptimal. Dacă interogarea nu este generată suficient de rapid și interogarea folosește îmbinări în tabele virtuale, atunci se recomandă să mutați accesul la tabelele virtuale într-un tabel temporar și apoi să faceți o îmbinare între două tabele temporare. Să rescriem cererea anterioară.

SELECTAȚI Clienți.Link AS Link PLACE tClienți DIN Director.Clients AS Clients INDEX BY Link WHERE
Clienți.Link B (&Clienți) ; //////////////////////////////////////////////////////////////////// ////////////////////////// SELECTAȚI Plăți Nealocate.SoldBalance, Plăți Nealocate.Client AS Client PLACE solduri FROM RegisterAccumulations.UnallocatedPayments.Balances(, Client B ( SELECTează tClients Link FROM tClients)) AS UnallocatedPaymentsBalance; //////////////////////////////////////////////////////////////////// /////////////////////////// SELECTAȚI tClients.Link, toRemainders.AmountRemaining AS AmountRemaining FROM tClients AS tClients LEFT JOIN toRemaining AS Remainders PO tClients.Link = tRemainings.Client

9.Verificarea rezultatului cererii.

Rezultatul interogării poate fi gol pentru a verifica valorile goale, utilizați următorul construct:

ResRequest = Request.Execute(); Dacă resQuery.Empty() Apoi Return; endIf;

Metodă Gol() trebuie folosit înaintea metodelor Alege() sau Descărca(), deoarece recuperarea colecției necesită timp.

Nu este o revelație pentru nimeni că este extrem de nedorit să folosești interogări într-o buclă. Acest lucru poate afecta în mod critic timpul de funcționare al unei anumite funcții. Este foarte de dorit să primiți toate datele din cerere și apoi să procesați datele într-o buclă. Dar uneori există cazuri când devine imposibil să mutați cererea în afara buclei. În acest caz, pentru optimizare, puteți muta crearea interogării în afara buclei, iar în buclă, înlocuiți parametrii necesari și executați interogarea.

Solicitare = Solicitare nouă; Query.Text = "SELECT | Clients.Link, | Clients.Birthdate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; Pentru fiecare rând FROM TableClients Loop Query.SetParameter("Client", Client);

QueryResult = Query.Execute().Select(); EndCycle;

Acest lucru va salva sistemul de la verificarea sintaxei cererii într-o buclă.

11. Construcție „AVÂND”.

Un design destul de rar la solicitari. Vă permite să impuneți condiții asupra valorilor funcțiilor agregate (SUMA, MINIM, MEDIE etc.). De exemplu, trebuie să selectați numai acei clienți a căror sumă de plată în septembrie a fost mai mare de 13.000 de ruble. Dacă utilizați condiția „UNDE”, va trebui mai întâi să creați un tabel temporar sau o interogare imbricată, să grupați înregistrările acolo după suma de plată și apoi să aplicați condiția. Construcția „HAVING” va ajuta la evitarea acestui lucru.

SELECT Plata.Client, SUMA(Suma.Plată) AS Sumă FROM Document.Plata AS Plată WHERE MONTH(Data.Plată) = 9 GROUP BY Plată.Client HAVING AMOUNT(Suma.Plata) > 13000 În constructor, pentru a face acest lucru, mergeți la fila „Condiții”, adăugați o nouă condiție și bifați caseta de selectare „Personalizat”. Atunci doar scrie


Sumă (Plată. Sumă) > 13000

12. Valoare NULL Nu voi descrie aici principiile logicii cu trei valori în baza de date există multe articole pe această temă. Doar pe scurt despre cum NUL<>poate afecta rezultatul interogării. Valoarea NULL nu este de fapt o valoare, iar faptul că valoarea este nedefinită este necunoscut. Prin urmare, orice operație cu NULL returnează NULL, fie că este adunare, scădere, împărțire sau comparație. O valoare NULL nu poate fi comparată cu o valoare NULL deoarece nu știm ce să comparăm. Aceste. ambele aceste comparații sunt: ​​NULL = NULL, NULL

NULL nu este adevărat sau fals, este necunoscut.

Pentru acei clienți care nu au plăți, trebuie să afișăm câmpul „Semnați” cu valoarea „Fără plăți”. Mai mult, știm sigur că avem astfel de clienți. Și pentru a reflecta esența a ceea ce am scris mai sus, să o facem astfel.

SELECTAȚI „Fără plăți” AS Atribut, NULL AS Document PLACE la plăți; //////////////////////////////////////////////////////////////////// ///////////////////////// SELECT Clients.Link AS Client, Payment.Link CUM PUNE Payment tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document. Payment AS Payment Software Clients.Link = Payment.Shareholder; //////////////////////////////////////////////////////////////////// ////////////////////////// SELECTează tClientPayment.Client FROM tClientPayment AS tClientPayment INTERNAL JOIN tPayment AS tTopay BY tClientPayment.Payment = tPayment

Acordați atenție celui de-al doilea tabel temporar tClientPayment. Cu alăturarea din stânga selectez toți clienții și toate plățile pentru acești clienți. Pentru acei clienți care nu au plăți, câmpul „Plată” va fi NULL. Urmând logica, în primul tabel temporar „tPayments” am desemnat 2 câmpuri, unul dintre ele NULL, a doua linie „Nu are plăți”. În al treilea tabel, conectez tabelele „tClientPayment” și „tPayment” folosind câmpurile „Plată” și „Document” cu o îmbinare internă. Știm că în primul tabel câmpul „Document” este NULL, iar în al doilea tabel, cei care nu au plăți în câmpul „Plată” sunt și NULL. Ce ne va returna o astfel de conexiune? Dar nu va returna nimic. Deoarece comparația NULL = NULL nu se evaluează la True.

Pentru ca cererea să returneze rezultatul așteptat, să o rescriem:

SELECTAȚI „Fără plăți” AS Atribut, VALUE(Document.Payment.EmptyLink) AS Document PLACE to Payments; //////////////////////////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) CUM Payment PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document.Payment AS Payment BY Clients.Link = Payment.Shareholder; //////////////////////////////////////////////////////////////////// ////////////////////////// SELECTează tClientPayment.Client FROM tClientPayment AS tClientPayment INTERNAL JOIN tPayment AS tTopay BY tClientPayment.Payment = tPayment

Acum, în cel de-al doilea tabel temporar, am indicat că dacă câmpul „Plată” este NULL, atunci acest câmp = un link gol către documentul de plată. În primul tabel am înlocuit, de asemenea, NULL cu o referință goală. Acum conexiunea implică câmpuri non-NULL și cererea va returna rezultatul așteptat.

Toate cererile cuprinse în articol reflectă situațiile pe care aș dori să le iau în considerare și nimic mai mult. DESPRE Ele pot să nu fie delirante sau suboptimale, principalul lucru este că reflectă esența exemplului.

13. O caracteristică nedocumentată a designului „ALEGE CÂND... ATUNCI... Sfârșit”.

În cazul în care este necesar să descriem construcția „Condiții” în cerere, folosim sintaxa standard:

SELECTAȚI SELECTAREA CÂND Utilizatori.Nume = „Vasya Pupkin” APOI „Angajatul nostru preferat” ELSE „Nu știm asta” END AS Field1 FROM Directory.Users AS Users

Dar dacă, de exemplu, trebuie să obținem numele lunii într-o solicitare? Scrierea unei construcții uriașe într-o solicitare este urâtă și necesită timp, așa că această formă de scriere de mai sus ne poate ajuta:

SELECTAȚI LUNA(US_CalculationConsumption_TurnoverSchedule.CalculationPeriod) WHEN 1 THEN "Ianuarie" WHEN 2 THEN "Februarie" WHEN 3 UP "March" WHEN 4 UP "APRILIE" WHEN 5 UP "MAI" WHAND THE 6EN" 8 APOI „August” CÂND 9 APOI „Septembrie” CÂND 10 APOI „Octombrie” CÂND 11 APOI „Noiembrie” CÂND 12 APOI „Decembrie” SE TERMINĂ CA O LUNĂ

Acum, designul pare mai puțin greoi și este ușor de înțeles.

14. Executarea interogării pe lot.


Pentru a nu multiplica cererile, puteți crea o cerere mare, o puteți împărți în pachete și puteți lucra cu ea.
De exemplu, trebuie să obțin următoarele câmpuri din directorul „Utilizatori”: „Data nașterii” și rolurile disponibile pentru fiecare utilizator. încărcați acest lucru în diferite părți tabelare din formular. Desigur, puteți face acest lucru într-o singură solicitare, apoi va trebui să repetați înregistrările sau să le restrângeți, sau puteți face acest lucru:

SELECT Users.Link AS Nume complet, Users.Date of Birth, Users.Role PUT vtUsers FROM Directory.Users AS Users; //////////////////////////////////////////////////////////////////// ////////////////////////// SELECT tueUsers.Nume complet, tueUsers.Data nașterii FROM tueUsers AS tueUsers GROUP BY tueUsers.nume complet, tueUsers . Data nașterii; //////////////////////////////////////////////////////////////////// ////////////////////////// SELECT wUsers.Full Name, wUsers.Role FROM wUsers AS wUsers GROUP BY wUsers.Full Name, wUsers de Naștere

tPackage = Request.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

După cum putem vedea, interogarea poate fi executată într-un lot, iar rezultatul poate fi procesat ca o matrice. În unele cazuri este foarte convenabil.

15. Condiții într-o cerere de lot

De exemplu, avem o cerere de lot, unde mai întâi primim câmpurile: „Nume, Data nașterii, Cod” din directorul „Utilizatori” și dorim să obținem înregistrări cu condiții pentru aceste câmpuri din directorul „Persoane fizice”.

SELECT Users.Individual.Name AS Nume, Users.Individual.Date of Birth AS Data of Birth, Users.Individual.Code AS Cod PLACE vtUsers FROM Directory.Users AS Users; //////////////////////////////////////////////////////////////////// ///////////////////////// SELECTează persoane fizice din directorul de persoane fizice

Puteți impune condiții ca acestea:

WHERE Persoane fizice.Cod IN (SELECT tueUsers.Code FROM tueUsers) AND Individuals.Name IN (SELECT tueUsers.Code FROM tueUsers) AND Individuals.BirthDate IN (SELECT tueUsers.DateBirth FROM tueUsers)

Și poți face așa:

WHERE (Persoane.Cod, Nume persoane fizice, Persoane fizice.Data nașterii) IN (SELECT tueUsers.Code, tueUsers.Name, tueUsers.Data nașterii FROM tueUsers)

Mai mult, este necesară menținerea ordinii.

16. Apelarea generatorului de interogări pentru „condiție” într-o cerere de lot

Când este necesar să se impună o condiție, ca în exemplul de mai sus, puteți uita cum este numit acest sau acel câmp în tabelul virtual.
De exemplu, trebuie să impuneți o condiție câmpului „Data nașterii”, iar în tabelul virtual acest câmp se numește „Data nașterii debitorului”, iar dacă uitați numele, va trebui să părăsiți editarea condiției fără salvând și uită-te la numele câmpului. Pentru a evita acest lucru, puteți utiliza următoarea tehnică.

Este necesar să puneți paranteze după Construcția „B” și să lăsați un spațiu gol (spațiu) între paranteze, selectați acest spațiu și apelați constructorul de interogare. Proiectantul va avea acces la toate tabelele interogării lot. Tehnica funcționează atât pe tabele de registre virtuale, cât și pe fila „Condiții”. În acest din urmă caz, trebuie să bifați caseta „P (condiție arbitrară)” și să intrați în modul de editare „F4”.

Interogările au fost adesea făcute din mers și servesc pur și simplu pentru a ilustra „tehnicile” pe care le aveam în vedere.

Am vrut să mă uit la utilizarea indecșilor în interogări, dar acesta este un subiect foarte larg. Îl voi pune într-un articol separat sau îl voi adăuga aici mai târziu.

upd1. Punctele 11,12
upd2. Punctele 13,14,15,16

Literatura folosita:
Limbajul de interogare „1C:Enterprise 8” - E.Yu. Khrustaleva
Dezvoltare profesională în sistemul 1C:Enterprise 8.”

Limbajul de interogare din 1C 8 este un analog simplificat al binecunoscutului „limbaj de programare structurat” (cum este numit mai des, SQL). Dar în 1C este folosit doar pentru citirea datelor; model de obiect date.

O altă diferență interesantă este sintaxa rusă. Deși de fapt poți folosi construcții în limba engleză.

Exemplu de solicitare:

ALEGE
Banci.Nume,
Bănci.CorrAccount
DIN
Director.Bănci CUM Bănci

Această solicitare ne va permite să vedem informații despre numele și contul de corespondent al tuturor băncilor existente în baza de date.

Limbajul de interogare este cel mai simplu și mod eficient obtinerea de informatii. După cum se poate vedea din exemplul de mai sus, în limbajul de interogare trebuie să utilizați nume de metadate (aceasta este o listă de obiecte de sistem care alcătuiesc configurația, adică directoare, documente, registre etc.).

Descrierea constructelor limbajului de interogare

Structura de interogare

Pentru a obține date, este suficient să folosiți construcțiile „SELECT” și „FROM”. Cea mai simplă cerere arata asa:

SELECT * FROM Directoare.Nomenclatură

Unde „*” înseamnă selectarea tuturor câmpurilor din tabel, iar Directories.Nomenclature – numele tabelului din baza de date.

Să ne uităm la un exemplu mai complex și general:

ALEGE
<ИмяПоля1>CUM<ПредставлениеПоля1>,
Sumă(<ИмяПоля2>) CUM<ПредставлениеПоля2>
DIN
<ИмяТаблицы1>CUM<ПредставлениеТаблицы1>
<ТипСоединения>COMPUS<ИмяТаблицы2>CUM<ПредставлениеТаблицы2>
DE<УсловиеСоединениеТаблиц>

UNDE
<УсловиеОтбораДанных>

GROUP BY
<ИмяПоля1>

COMANDA PENTRU
<ИмяПоля1>

REZULTATE
<ИмяПоля2>
DE
<ИмяПоля1>

În această interogare, selectăm datele câmpurilor „FieldName1” și „FieldName1” din tabelele „TableName1” și „TableName”, atribuim sinonime câmpurilor folosind operatorul „HOW” și le conectăm conform unei anumite condiții „ TableConnectionCondition”.

Din datele primite, selectăm numai datele care îndeplinesc condiția din „UNDE” „Condiția de selecție a datelor”. Apoi, grupăm cererea după câmpul „Nume câmp 1”, însumând „Nume câmp 2”. „Field Name1” și câmpul final „Field Name2”.

Ultimul pas este sortarea cererii folosind constructul ORDER BY.

Proiecte generale

Să ne uităm la structurile generale ale limbajului de interogare 1C 8.2.

PRIMULn

Prin utilizarea al acestui operator puteți obține n număr de primele înregistrări. Ordinea înregistrărilor este determinată de ordinea în interogare.

SELECTAȚI PRIMILE 100
Banci.Nume,
Bănci Cod AS BIC
DIN
Director.Bănci CUM Bănci
COMANDA PENTRU
Bănci.Nume

Solicitarea va primi primele 100 de intrări din directorul „Bănci”, sortate alfabetic.

PERMIS

Acest design este relevant pentru lucrul cu mecanismul. Esența mecanismului este de a restricționa citirea (și alte acțiuni) la utilizatori pentru anumite înregistrări dintr-un tabel de bază de date, și nu tabelul în ansamblu.

Dacă un utilizator încearcă să folosească o interogare pentru a citi înregistrări care nu sunt disponibile pentru el, va primi un mesaj de eroare. Pentru a evita acest lucru, ar trebui să utilizați construcția „PERMIS”, adică cererea va citi numai înregistrările permise.

SELECTARE PERMIS
Depozitul de informații suplimentare
DIN
Director.Documentul de informații suplimentare

DIVERSE

Utilizarea „DIFERENT” va împiedica introducerea liniilor duplicate în rezultatul interogării 1C. Dublarea înseamnă că toate câmpurile de solicitare se potrivesc.

SELECTAȚI PRIMILE 100
Banci.Nume,
Bănci Cod AS BIC
DIN
Director.Bănci CUM Bănci

EmptyTable

Această construcție este folosită foarte rar pentru a combina interogări. Când vă alăturați, poate fi necesar să specificați un tabel imbricat gol într-unul dintre tabele. Operatorul „EmptyTable” este potrivit pentru asta.

Exemplu din 1C 8 ajutor:

SELECT Link.Number, EMPTY TABLE.(Nr., Articol, Cantitate) AS Compoziție
DIN Document.Factură de cheltuieli
COMBINA TOTUL
SELECT Link.Number, Contents.(LineNumber, Product, Quantity)
FROM Document.Invoice Document.Invoice.Composition.*

ISNULL

O caracteristică foarte utilă care vă permite să evitați multe greșeli. Există NULL() vă permite să înlocuiți Valoare NULL la ceea ce este necesar. Foarte des folosit pentru a verifica prezența unei valori în tabelele unite, de exemplu:

ALEGE
Nomenclatură Ref.
IsNULL(Articol rămas.Cantitate rămasă,0) AS Cantitate rămasă
DIN


Poate fi folosit în alte moduri. De exemplu, dacă pentru fiecare rând nu se știe în ce tabel există valoarea:

ISNULL(Data primirii facturii, Data emiterii facturii)

CUM este un operator care ne permite să atribuim un nume (sinonim) unui tabel sau câmp. Am văzut un exemplu de utilizare mai sus.

Aceste construcții sunt foarte asemănătoare - vă permit să obțineți o reprezentare în șir a valorii dorite. Singura diferență este că REPRESENTATION convertește orice valoare într-un tip șir, în timp ce REPRESENTATIONREF convertește doar valorile de referință. REPREZENTAREA REFERINȚEI este recomandată a fi utilizată în interogările sistemului de compoziție a datelor pentru optimizare, cu excepția cazului în care, desigur, câmpul de date de referință este planificat să fie utilizat în selecții.

ALEGE
Vizualizare(Link), //șir, de exemplu „Raportul anticipat nr. 123 din 10.10.2015
Vizualizare(DeletionMark) AS DeleteMarkText, //șir, „Da” sau „Nu”
ViewReferences(DeletionMark) AS DeleteMarkBoolean //boolean, True sau False
DIN
Document.Raport de avans

EXPRES

Express vă permite să convertiți valorile câmpurilor în tipul de date dorit. Puteți converti o valoare fie într-un tip primitiv, fie într-un tip de referință.

Express pentru un tip de referință este utilizat pentru a restricționa tipurile de date solicitate în câmpuri de tip complex, adesea folosite pentru a optimiza performanța sistemului. Exemplu:

EXPRESS (Table of Costs. Subconto1 AS Directory. Elemente de costuri Tip de activitate pentru Contabilitatea fiscală a costurilor).

Pentru tipurile primitive, această funcție este adesea folosită pentru a limita numărul de caractere din câmpurile de lungime nelimitată (cu astfel de câmpuri nu pot fi comparate). Pentru a evita eroarea " Parametri nevalidi în operația de comparare. Nu poți compara câmpuri
lungime nelimitată și câmpuri de tipuri incompatibile
", trebuie să exprimați astfel de câmpuri după cum urmează:

EXPRESS(Comentează AS Line(150))

DATA DIFERENTATA

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

Un exemplu de utilizare a IS NULL într-o solicitare 1C:

SELECTAȚI * DIN
Ref
CONEXIUNEA STÂNGA ÎnregistrareAcumulări.ProduseÎnDepozite.Rămas ca produs rămas
Software NomenclatureRef.Link = Sold GoodsCommitteesRemains.Nomenclature
UNDE NU Mărfuri rămase

Tipul de date dintr-o interogare poate fi determinat folosind funcțiile TYPE() și VALUETYPE() sau prin utilizarea operatorului logic REFERENCE. Cele două funcții sunt similare.

Valori predefinite

Pe lângă utilizarea parametrilor trecuți în interogări în limbajul de interogare 1C, puteți utiliza valori predefinite sau . De exemplu, transferuri, directoare predefinite, planuri de conturi și așa mai departe, se folosește constructul „Valoare()”.

Exemplu de utilizare:

WHERE Nomenclature.Type of Nomenclature = Value(Directory.Types of Nomenclature.Product)

WHERE Counterparties.Type of Contact Information = Value(Enumeration.Types of Contact Information.Phone)

WHERE Soldurile contului.Cont contabil = Valoare(Planul de conturi.Profit.ProfitsLoss)

Conexiuni

Există 4 tipuri de conexiuni: STÂNGA, CORECT, COMPLET, INTERN.

CONEXIUNEA STÂNGA și DREAPTA

Îmbinările sunt folosite pentru a lega două tabele pe baza unei anumite condiții. Caracteristică când LEFT JOIN este că luăm primul tabel specificat în întregime și legăm condiționat al doilea tabel. Câmpurile celui de-al doilea tabel care nu au putut fi legate de condiție sunt completate cu valoarea Nu voi descrie aici principiile logicii cu trei valori în baza de date există multe articole pe această temă. Doar pe scurt despre cum.

De exemplu:

Va returna întregul tabel de Contrapartide și va completa câmpul „Bancă” numai în acele locuri în care va fi îndeplinită condiția „Contrapărți.Nume = Bănci.Nume”. Dacă condiția nu este îndeplinită, câmpul Bank va fi setat la Nu voi descrie aici principiile logicii cu trei valori în baza de date există multe articole pe această temă. Doar pe scurt despre cum.

RIGHT JOIN în limba 1C absolut asemănătoare Conexiune STÂNGA, cu excepția unei diferențe - în DREPTUL DE CONECTARE Masa „principală” este a doua, nu prima.

CONEXIUNE COMPLETA

CONEXIUNE COMPLETA diferă de stânga și dreapta prin faptul că afișează toate înregistrările din două tabele și le conectează numai pe cele pe care le poate conecta în funcție de condiție.

De exemplu:

DIN

CONEXIUNE COMPLETA
Director.Bănci CUM Bănci

DE

Limbajul de interogare va returna ambele tabele complet numai dacă este îndeplinită condiția de a se alătura înregistrărilor. Spre deosebire de o îmbinare stânga/dreapta, este posibil ca NULL să apară în două câmpuri.

INNER JOIN

INNER JOIN diferă de full prin aceea că afișează numai acele înregistrări care ar putea fi conectate în funcție de o anumită condiție.

De exemplu:

DIN
Directorul contrapărților AS Clienți

INNER JOIN
Director.Bănci CUM Bănci

DE
Clients.Name = Banks.Name

Această interogare va returna numai rândurile în care banca și contrapartea au același nume.

Asociații

Construcțiile JOIN și JOIN ALL combină două rezultate într-unul singur. Aceste. rezultatul efectuării a două va fi „unit” într-unul, unul comun.

Adică sistemul funcționează exact la fel ca și cele obișnuite, doar pentru un tabel temporar.

Cum se utilizează INDEX BY

Cu toate acestea, un punct trebuie luat în considerare. Construirea unui index pe un tabel temporar necesită, de asemenea, timp. Prin urmare, este recomandabil să utilizați construcția „ ” numai dacă se știe cu siguranță că vor exista mai mult de 1-2 înregistrări în tabelul temporar. În caz contrar, efectul poate fi invers - performanța câmpurilor indexate nu compensează timpul necesar pentru a construi indexul.

ALEGE
Currency Currency Ultima secțiune transversală Moneda AS.
Rate valutare Ultima secțiune transversală.
Ratele valutare PUT
DIN
Informații Register.Currency Rates.Last Slice(&Period,) AS Currency RatesLast Slice
INDEX PRIN
Valută
;
ALEGE
Nomenclatura prețurilor.Nomenclatura,
PreturiNomenclaturi.Pret,
PrețuriNomenclaturi.Moneda,
Rate valutare.Rate
DIN
Registrul de informații.Nomenclatura prețurilor.Ultima felie(&perioada,
Nomenclatură B (&Nomenclatură) AND PriceType = &PriceType) AS PriceNomenclature
LEFT JOIN Currency Rates AS Currency Rates
Software PricesNomenclatures.Currency = Currency Rates.Currency

Gruparea

Limbajul de interogare 1C vă permite să utilizați funcții de agregare speciale atunci când grupați rezultatele interogării. Gruparea poate fi folosită și fără funcții de agregare pentru a „elimina” duplicatele.

Există următoarele funcții:

Cantitate, Cantitate, Număr de diferite, Maxim, Minim, Medie.

Exemplul #1:

ALEGE
Nomenclatura vânzărilor de bunuri și servicii.
SUM(Vânzări de mărfuriServiciiBunuri.Cantitate) AS Cantitate,
SUM(Vânzări de mărfuriServiciiBunuri.Suma) AS Sumă
DIN

GROUP BY
Vânzări de Bunuri și Servicii Nomenclatură

Interogarea primește toate rândurile cu mărfuri și le rezumă după cantitate și sume pe articol.

Exemplul nr. 2

ALEGE
Codul băncilor,
CANTITATE(Bănci diferite.Link) CA Număr de duplicate
DIN
Director.Bănci CUM Bănci
GROUP BY
Bănci.Cod

Acest exemplu va afișa o listă de BIC-uri în directorul „Bănci” și va arăta câte duplicate există pentru fiecare dintre ele.

Rezultate

Rezultatele sunt o modalitate de a obține date dintr-un sistem cu o structură ierarhică. Funcțiile de agregare pot fi utilizate pentru câmpurile de rezumat, la fel ca și pentru grupări.

Una dintre cele mai populare moduri de a utiliza rezultatele în practică este anularea în loturi a mărfurilor.

ALEGE




DIN
Vânzări de bunuri și servicii
COMANDA PENTRU

REZULTATE
SUM(Cantitate),
SUM(Suma)
DE
Nomenclatură

Rezultatul interogării va fi următorul ierarhic:

Rezultate generale

Dacă trebuie să obțineți totaluri pentru toate „totalurile”, utilizați operatorul „GENERAL”.

ALEGE
Vânzări de bunuri și servicii Nomenclatură AS.
Vânzări de Bunuri și Servicii Bunuri Link AS Document,
Vânzări de bunuri și servicii.
Vânzări de Bunuri și Servicii Bunuri
DIN
Vânzări de bunuri și servicii
COMANDA PENTRU
Vânzări de Bunuri și Servicii Data
REZULTATE
SUM(Cantitate),
SUM(Suma)
DE
GENERAL,
Nomenclatură

Ca urmare a executării cererii, obținem următorul rezultat:

În care 1 nivel de grupare este agregarea tuturor câmpurilor necesare.

Aranjarea

Operatorul ORDER BY este folosit pentru a sorta rezultatul unei interogări.

Sortarea pentru tipurile primitive (șir, număr, boolean) urmează regulile obișnuite. Pentru câmpurile de tip referință, sortarea are loc prin reprezentarea internă a legăturii (identificatorul unic), mai degrabă decât prin cod sau prin reprezentarea referințelor.

ALEGE

DIN
Director.Nomenclatura AS Nomenclatura
COMANDA PENTRU
Nume

Solicitarea va afișa o listă de nume în directorul nomenclatorului, sortate alfabetic.

Comanda automată

Rezultatul unei interogări fără sortare este un set de rânduri prezentat haotic. Dezvoltatorii platformei 1C nu garantează că rândurile vor fi afișate în aceeași secvență atunci când execută interogări identice.

Dacă trebuie să afișați înregistrările tabelului într-o ordine constantă, trebuie să utilizați constructul Auto-Order.

ALEGE
Nomenclatură.Nume AS Nume
DIN
Director.Nomenclatura AS Nomenclatura
COMANDĂ AUTOMATĂ

Mesele virtuale

Tabelele virtuale din 1C sunt o caracteristică unică a limbajului de interogare 1C care nu se găsește în alte sintaxe similare. Un tabel virtual este o modalitate rapidă de a obține informații de profil din registre.

Fiecare tip de registru are propriul set de tabele virtuale, care pot diferi în funcție de setările registrului.

  • tăierea primului;
  • tăierea acestuia din urmă.
  • resturi;
  • revoluții;
  • solduri si cifra de afaceri.
  • mișcări din subconto;
  • revoluții;
  • viteza Dt Kt;
  • resturi;
  • solduri si cifra de afaceri
  • subconto.
  • baza;
  • date grafice;
  • perioada efectivă de valabilitate.

Pentru dezvoltatorul de soluții, datele sunt preluate dintr-un singur tabel (virtual), dar de fapt platforma 1C preia din mai multe tabele, transformându-le în forma necesară.

ALEGE
Produse în Depozite Resturi și Cifra de afaceri,
ProductsIn WarehousesRemainingAndTurnover.QuantityInitialRemaining,
ProductsIn WarehousesRemainsAndTurnover.QuantityTurnover,
MărfuriÎnDepoziteRemainsAndTurnover.CantityIncoming,
ProduseÎn DepoziteRămăși și Cifra de afaceri.CantitateConsum,
ProductsIn WarehousesRemainingsAndTurnover.CantityFinalRemaining
DIN
ÎnregistrareAcumulări.MărfuriÎnDepozite.Rămăși și Cifra de afaceri CA Mărfuri ÎnDepoziteRămăși și Cifra de afaceri

Această interogare vă permite să preluați rapid o cantitate mare de date.

Opțiuni de masă virtuală

Un aspect foarte important al lucrului cu tabele virtuale este utilizarea parametrilor. Parametrii tabelului virtual sunt parametri specializați pentru selecție și configurare.

Pentru astfel de tabele, se consideră incorectă utilizarea selecției în construcția „UNDE”. Pe lângă faptul că interogarea devine suboptimă, este posibil să primiți date incorecte.

Un exemplu de utilizare a acestor parametri:

Registrul de acumulări de mărfuri în depozite (& Începutul perioadei, & Sfârșitul perioadei, Mișcări și limite ale perioadei, Nomenclatură = & Nomenclatură obligatorie).

Algoritm pentru tabele virtuale

De exemplu, cel mai folosit tabel virtual de tip „Rămășițe” stochează date din două tabele fizice – solduri și mișcări.

Când se utilizează o masă virtuală, sistemul efectuează următoarele manipulări:

  1. Obținem cea mai apropiată valoare calculată în termeni de dată și măsurători în tabelul cu totaluri.
  2. „Adăugăm” suma din tabelul de mișcări la suma din tabelul cu totaluri.


Astfel de pași simpli poate îmbunătăți semnificativ performanța sistemului în ansamblu.

Folosind Generatorul de interogări

Generator de interogări– un instrument încorporat în sistemul 1C Enterprise care facilitează foarte mult dezvoltarea interogărilor bazei de date.

Generatorul de interogări are o interfață destul de simplă, intuitivă. Cu toate acestea, să ne uităm la utilizarea constructorului de interogări mai detaliat.

Constructorul de text de interogare este lansat din meniul contextual (butonul dreapta al mouse-ului) în locul dorit din codul programului.

Descrierea constructorului cererii 1C

Să ne uităm la fiecare filă a designerului mai detaliat. Excepția este fila Builder, care este un subiect pentru o altă discuție.

fila Tabele și câmpuri

Această filă specifică sursa de date și câmpurile care trebuie afișate în raport. În esență, aici sunt descrise construcțiile SELECT.. FROM.

Sursa poate fi un tabel fizic de bază de date, un tabel de registru virtual, tabele temporare, interogări imbricate etc.

În meniul contextual al tabelelor virtuale, puteți seta parametrii tabelului virtual:

fila Conexiuni

Fila este folosită pentru a descrie conexiunile mai multor tabele și creează construcții cu cuvântul CONEXIUNE.

Fila Grupare

În această filă, sistemul vă permite să grupați și să rezumați câmpurile obligatorii ale rezultatului tabelului. Descrie utilizarea construcțiilor GROUP BY, SUM, MINIM, MEDIE, MAXIMUM, CANTITATE, NUMĂR DE DIFERENȚI.

fila Condiții

Raspunde de tot ce intra in textul de solicitare dupa constructia WHERE, adica de toate conditiile impuse datelor primite.

Fila Avansat

Tab În plus plin cu tot felul de parametri foarte importanți. Să ne uităm la fiecare dintre proprietăți.

Gruparea Selectarea înregistrărilor:

  • În primul rând N– un parametru care returnează doar N înregistrări la interogare (PRIMUL operator)
  • Fără duplicate– asigură unicitatea înregistrărilor primite (operator DIFERIT)
  • Permis– vă permite să selectați doar acele înregistrări pe care sistemul vă permite să le selectați ținând cont (construcție PERMISĂ)

Gruparea Tip cerere determină ce tip de interogare va fi: preluarea datelor, crearea unui tabel temporar sau distrugerea unui tabel temporar.

Mai jos este un steag Blocați datele primite pentru modificare ulterioară. Vă permite să activați capacitatea de a seta blocarea datelor, ceea ce asigură siguranța datelor din momentul în care sunt citite și până când sunt modificate (relevant doar pentru Modul automat interblocări, design A SCHIMBA).

Fila Joins/Aliases

În această filă a designerului de interogări, puteți seta capacitatea de a uni diferite tabele și alias-uri (constructia CUM). Tabelele sunt indicate în partea stângă. Dacă setați steagurile vizavi de masă, se va folosi construcția UNITE, în caz contrar - UNITE ALL (diferențe între cele două metode). În partea dreaptă este indicată corespondența câmpurilor din diferite tabele dacă nu este specificată corespondența, interogarea va returna NULL.

fila Comanda

Aceasta specifică ordinea în care sunt sortate valorile (ORDER BY) - descendent (DESC) sau crescător (ASC).

Există și un steag interesant - Comanda automată(in cerere - COMANDA AUTO). În mod implicit, sistemul 1C afișează datele într-o ordine „haotică”. Dacă setați acest indicator, sistemul va sorta datele după datele interne.

Fila Lot de interogări

În fila Designer de interogări, puteți crea altele noi și, de asemenea, le puteți utiliza ca navigare. În textul cererii, pachetele sunt separate prin simbolul „;” (virgulă).

Butonul „Interogare” din designerul de interogări

În colțul din stânga jos al designerului de solicitări există un buton Solicitare, cu ajutorul căruia puteți vizualiza textul solicitării în orice moment:

În această fereastră, puteți face ajustări la cerere și o puteți executa.


Folosind consola de interogări

Consola de interogări este o modalitate simplă și convenabilă de a depana interogări complexe și de a obține rapid informații. În acest articol, voi încerca să descriu cum să utilizați Query Console și să ofer un link pentru a descărca Query Console.

Să aruncăm o privire mai atentă la acest instrument.

Descărcați consola de interogări 1C

În primul rând, pentru a începe să lucrați cu consola de interogări, trebuie să o descărcați de undeva. Tratamentele sunt de obicei împărțite în două tipuri - forme controlateși obișnuit (sau uneori numit 8.1 și 8.2/8.3).

Am încercat să combin aceste două vederi într-o singură prelucrare - forma dorită se deschide în modul de operare dorit (în modul gestionat, consola funcționează doar în modul gros).

Descrierea consolei de interogări 1C

Să începem să ne uităm la consola de interogări cu o descriere a panoului principal de procesare:

În antetul consolei de interogări, puteți vedea timpul de execuție al ultimei interogări cu precizie în milisecunde, acest lucru vă permite să comparați diferite modele în ceea ce privește performanța.

Primul grup de butoane din bara de comandă este responsabil pentru salvarea interogărilor curente într-un fișier extern. Acest lucru este foarte convenabil, puteți reveni oricând la scrierea unei cereri complexe. Sau, de exemplu, stocați o listă de exemple tipice ale anumitor modele.

În stânga, în câmpul „Solicitare”, puteți crea cereri noi și le puteți salva într-o structură arborescentă. Al doilea grup de butoane este responsabil de gestionarea listei de solicitări. Folosind-o puteți crea, copia, șterge, muta o solicitare.

  • Executacerere– execuție simplă și rezultate
  • Executați pachetul– vă permite să vizualizați toate interogările intermediare într-un lot de interogări
  • Vizualizarea tabelelor temporare– vă permite să vedeți rezultatele pe care interogările temporare le returnează pe un tabel

Parametri de solicitare:

Vă permite să setați parametrii actuali pentru cerere.

În fereastra parametrilor de interogare, următoarele sunt interesante:

  • Buton Ia de la cerere găsește automat toți parametrii din cerere pentru confortul dezvoltatorului.
  • Pavilion Parametri comuni pentru toate cererile– la instalare, procesarea acestuia nu șterge parametrii la trecerea de la cerere la cerere în lista generală de solicitări.

Setați un parametru cu o listă de valori Este foarte simplu, doar când alegeți o valoare a parametrului, faceți clic pe butonul de ștergere a valorii (cruce), sistemul vă va solicita să selectați tipul de date, unde trebuie să selectați „Lista de valori”:

De asemenea, în panoul de sus există un buton pentru a apela setările consolei de interogare:

Aici puteți specifica parametrii pentru salvarea automată a interogărilor și parametrii de execuție a interogărilor.

Textul solicitării este introdus în câmpul de cerere de consolă. Acest lucru se poate face prin simpla tastare a unui test de interogare sau apelând un instrument special - designerul de interogări.

Constructorul cererii 1C 8 este apelat de la meniul contextual(butonul dreapta al mouse-ului) când faceți clic pe câmpul de introducere:

De asemenea, în acest meniu sunt și așa caracteristici utile, cum ar fi ștergerea sau adăugarea de întreruperi de linie („|”) la cerere sau obținerea codului de solicitare în această formă convenabilă:

Solicitare = Solicitare nouă;
Solicitare.Text = ”
|SELECT
| Monede.Link
|DIN
| Director.Monede AS Monede”;
RequestResult = Request.Execute();

Câmpul inferior al consolei de interogări afișează câmpul rezultat al interogării, motiv pentru care a fost creată această procesare:



De asemenea, consola de interogări, pe lângă listă, poate afișa date sub formă de arbore - pentru interogările care conțin totaluri.

Optimizarea interogărilor

Unul dintre cele mai importante puncte în creșterea productivității întreprinderii 1C 8.3 este optimizarecereri. Acest punct este, de asemenea, foarte important când trecerea certificării. Mai jos vom vorbi despre motivele tipice pentru care nu performanță optimă interogări și metode de optimizare.

Selecții într-un tabel virtual folosind constructul WHERE

Este necesar să se aplice filtre la detaliile tabelului virtual numai prin parametrii VT. În niciun caz nu trebuie să utilizați constructul WHERE pentru selecție într-un tabel virtual, aceasta este o greșeală gravă din punct de vedere al optimizării. În cazul selecției folosind WHERE, de fapt, sistemul va primi TOATE înregistrările și abia apoi le va selecta pe cele necesare.

CORECT:

ALEGE

DIN
Registrul Acumulărilor Decontări reciproce cu Participanții Organizațiilor (.
,
Organization = &Organization
AND Individ = &Individual) CUM Decontări reciproce cu participanții organizațiilor Solduri

GREŞIT:

ALEGE
Decontări reciproce cu Participanții Organizațiilor Solduri
DIN
Registrul Acumulărilor. Decontări reciproce cu Participanții Organizațiilor Solduri
UNDE
Decontari reciproce cu Participantii Organizatiilor Solduri Organizatie = & Organizatie
ȘI Decontări reciproce cu Participanții Organizațiilor Solduri Persoană fizică

Obținerea valorii unui câmp de tip complex folosind un punct

La primirea datelor de tip complex într-o interogare printr-un punct, sistemul se conectează cu o îmbinare la stânga exact atâtea tabele câte tipuri sunt posibile în domeniul tipului complex.

De exemplu, este extrem de nedorit ca optimizarea să acceseze câmpul de înregistrare a registrului – registrator. Registratorul are un tip de date compus, printre care se numără toate tipurile de documente posibile care pot scrie date în registru.

GREŞIT:

ALEGE
Record Set.Recorder.Date,
RecordSet.Quantity
DIN
RegisterAcumulations.ProductsOrganizations AS Set of Records

Adică, de fapt, o astfel de interogare va accesa nu un tabel, ci 22 de tabele de baze de date (acest registru are 21 de tipuri de registrator).

CORECT:

ALEGE
ALEGERE
WHEN ProductsOrg.Registrar LINK Document.Vânzări de produse și servicii
THEN EXPRESS(ProductsOrg.Registrar AS Document.Vânzări de bunuriServicii).Data
WHEN GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
APOI EXPRESS(GoodsOrg.Registrar AS Document.Reception of GoodsServices).Data
SFÂRȘIT CA DATA,
ProduseOrg.Cantitate
DIN
RegisterAcumulations.GoodsOrganizations AS GoodsOrganization

Sau a doua opțiune este să adăugați astfel de informații la detalii, de exemplu, în cazul nostru, adăugarea unei date.

CORECT:

ALEGE
ProductsOrganizations.Date,
ProduseOrganizaţii.Cantitate
DIN
Registrul Acumulărilor de Bunuri ale Organizațiilor AS Bunuri ale Organizațiilor

Subinterogări într-o condiție de alăturare

Pentru optimizare, este inacceptabil să folosiți subinterogări în condiții de îmbinare, acest lucru încetinește semnificativ interogarea. Este recomandabil să folosiți VT în astfel de cazuri. Pentru a vă conecta, trebuie să utilizați numai metadate și obiecte VT, indexându-le în prealabil după câmpurile de conexiune.

GREŞIT:

ALEGE…

LEFT JOIN (
SELECTAȚI FROM RegisterInformation.Limits
UNDE…
GRUPA DE...
) PRIN…

CORECT:

ALEGE…
PUT Limite
DIN Registrul de informații.Limite
UNDE…
GRUPA DE...
INDEX PRIN...;

ALEGE…
DIN Vânzări de bunuri și servicii
Limite LEFT JOIN
PRIN …;

Unirea înregistrărilor cu mese virtuale

Există situații când, la conectarea unei mese virtuale la altele, sistemul nu funcționează optim. În acest caz, pentru a optimiza performanța interogării, puteți încerca să plasați tabelul virtual într-unul temporar, fără a uita să indexați câmpurile unite în interogarea tabelului temporar. Acest lucru se datorează faptului că VT-urile sunt adesea conținute în mai multe tabele DBMS fizice, ca urmare, este compilată o subinterogare pentru a le selecta, iar problema se dovedește a fi similară cu punctul anterior;

Utilizarea selecțiilor bazate pe câmpuri neindexate

Una dintre cele mai frecvente greșeli atunci când scrieți interogări este utilizarea condițiilor pe câmpuri neindexate, acest lucru contrazice regulile de optimizare a interogărilor. SGBD nu poate executa o interogare optim dacă interogarea include selecția pe câmpuri neindexabile. Dacă luați un tabel temporar, trebuie să indexați și câmpurile de conexiune.

Trebuie să existe un index adecvat pentru fiecare condiție. Un indice adecvat este unul care îndeplinește următoarele cerințe:

  1. Indexul conține toate câmpurile enumerate în condiție.
  2. Aceste câmpuri se află chiar la începutul indexului.
  3. Aceste selecții sunt consecutive, adică valorile care nu sunt implicate în condiția de interogare nu sunt „pănate” între ele.

Dacă DBMS nu selectează indecșii corecti, întregul tabel va fi scanat - acest lucru va avea un impact foarte negativ asupra performanței și poate duce la blocarea prelungită a întregului set de înregistrări.

Utilizarea SAU logic în condiții

Asta e tot, acest articol a acoperit aspectele de bază ale optimizării interogărilor pe care fiecare expert 1C ar trebui să le cunoască.

Un curs video gratuit foarte util despre dezvoltarea și optimizarea interogărilor, Recomand cu incredere pentru incepatori si nu numai!

La organizarea probelor în probleme reale, în marea majoritate a cazurilor, selecția datelor este organizată în conformitate cu anumite criterii.

În cazul în care selecția se face dintr-un tabel real, nu apar dificultăți. Datele sunt prelucrate absolut banal:

În cazul în care sursa din interogare este un tabel virtual, situația devine ceva mai complicată.

Limbajul de interogare vă permite să impuneți o condiție unei selecții din tabelele virtuale în două moduri: în clauza WHERE și folosind parametrii tabelului virtual. Ambele metode vor duce la același rezultat (cu excepția unor cazuri specifice), dar, cu toate acestea, sunt departe de a fi echivalente.

Știm deja că tabelele virtuale se numesc virtuale deoarece nu se află de fapt în baza de date. Se formează numai în momentul în care li se face o cerere. În ciuda acestui fapt, este convenabil pentru noi (adică cei care scriem interogarea) să considerăm tabelele virtuale ca fiind reale. Ce se va întâmpla în sistemul 1C Enterprise 8 când interogarea pe care am compilat-o încă mai accesează tabelul virtual?

În primul pas, sistemul va construi un tabel virtual. În al doilea pas, vor fi selectate înregistrări din tabelul rezultat care îndeplinesc condiția specificată în clauza WHERE:


Se vede clar că eșantionul final nu va include toate înregistrările din tabelul virtual (și, prin urmare, din baza de date), ci doar pe cele care îndeplinesc condiția dată. Și înregistrările rămase vor fi pur și simplu excluse din rezultat.

Astfel, sistemul nu va face doar o muncă inutilă, ci va dubla munca inutilă! În primul rând, resursele vor fi cheltuite pentru construirea unui tabel virtual bazat pe date inutile (în figură sunt marcate ca „zonele de date A și B”), iar apoi se va lucra pentru a filtra aceste date din rezultatul final.

Este posibil să încetați imediat, în etapa de construire a unui tabel virtual, să nu mai folosiți date inutile? Se dovedește că este posibil. Exact pentru asta sunt proiectați parametrii tabelului virtual:


Parametrizând un tabel virtual, limităm imediat cantitatea de date care va fi procesată de interogare.

Care este diferența dintre valorile parametrului tabelului virtual „Metoda de adăugare”?
Când Metoda de adăugare este setată la „mișcări”, atunci vor fi returnate numai acele perioade în care au existat mișcări. Când este setat „Mișcări și limite de perioadă”, la mișcările de mai sus vor fi adăugate 2 înregistrări: mișcări la începutul și sfârșitul perioadei specificate în parametrii VT. Câmpul „Registrar” va fi gol pentru aceste 2 înregistrări.

La organizarea probelor în probleme reale, în marea majoritate a cazurilor, selecția datelor este organizată în conformitate cu anumite criterii.

În cazul în care selecția se face dintr-un tabel real, nu apar dificultăți. Datele sunt prelucrate absolut banal:

În cazul în care sursa din interogare este un tabel virtual, situația devine ceva mai complicată.


Limbajul de interogare vă permite să impuneți o condiție unei selecții din tabelele virtuale în două moduri: în clauza WHERE și folosind parametrii tabelului virtual. Ambele metode vor duce la același rezultat (cu excepția unor cazuri specifice), dar, cu toate acestea, sunt departe de a fi echivalente.

Știm deja că tabelele virtuale se numesc virtuale deoarece nu se află de fapt în baza de date. Se formează numai în momentul în care li se face o cerere. În ciuda acestui fapt, este convenabil pentru noi (adică cei care scriem interogarea) să considerăm tabelele virtuale ca fiind reale. Ce se va întâmpla în sistemul 1C Enterprise 8 când interogarea pe care am compilat-o încă mai accesează tabelul virtual?

În primul pas, sistemul va construi un tabel virtual. În al doilea pas, vor fi selectate înregistrări din tabelul rezultat care îndeplinesc condiția specificată în clauza WHERE:
Se vede clar că eșantionul final nu va include toate înregistrările din tabelul virtual (și, prin urmare, din baza de date), ci doar pe cele care îndeplinesc condiția dată. Și înregistrările rămase vor fi pur și simplu excluse din rezultat.

Astfel, sistemul nu va face doar o muncă inutilă, ci va dubla munca inutilă! În primul rând, resursele vor fi cheltuite pentru construirea unui tabel virtual bazat pe date inutile (în figură sunt marcate ca „zonele de date A și B”), iar apoi se va lucra pentru a filtra aceste date din rezultatul final.

Este posibil să încetați imediat, în etapa de construire a unui tabel virtual, să nu mai folosiți date inutile? Se dovedește că este posibil. Exact pentru asta sunt proiectați parametrii tabelului virtual:

Parametrizând un tabel virtual, limităm imediat cantitatea de date care va fi procesată de interogare.

Care este diferența dintre valorile parametrului tabelului virtual „Metoda de adăugare”?
Când Metoda de adăugare este setată la „mișcări”, atunci vor fi returnate numai acele perioade în care au existat mișcări. Când este setat „Mișcări și limite de perioadă”, la mișcările de mai sus vor fi adăugate 2 înregistrări: mișcări la începutul și sfârșitul perioadei specificate în parametrii VT. Câmpul „Registrar” va fi gol pentru aceste 2 înregistrări.

Informatii preluate de pe site