1s cerere rezultă cu o condiție. Crearea și lucrul cu interogări (pentru începători)

Limbajul de interogare este unul dintre mecanismele fundamentale ale 1C 8.3 pentru dezvoltatori. Cu ajutorul interogărilor, puteți obține rapid orice date stocate în baza de date. Sintaxa sa este foarte asemănătoare cu SQL, dar există unele diferențe.

Principalele avantaje ale limbajului de interogare 1C 8.3 (8.2) față de SQL:

  • dereferențiarea câmpurilor de referință (întoarcerea unuia sau mai multor puncte în atributele obiectului);
  • lucrul cu rezultatele este foarte convenabil;
  • capacitatea de a crea tabele virtuale;
  • cererea poate fi scrisă atât în ​​engleză, cât și în rusă;
  • capacitatea de a bloca datele pentru a evita blocajele.

Dezavantajele limbajului de interogare în 1C:

  • spre deosebire de SQL, interogările în 1C nu vă permit să schimbați datele;
  • lipsa procedurilor stocate;
  • imposibilitatea conversiei unui șir într-un număr.

Luați în considerare mini tutorialul nostru despre construcțiile de bază ale limbajului de interogare 1C.

Datorită faptului că solicitările din 1C vă permit doar să primiți date, orice solicitare trebuie să înceapă cu cuvântul „SELECT”. După această comandă, sunt indicate câmpurile din care doriți să obțineți date. Dacă specificați „*”, atunci toate câmpurile disponibile vor fi selectate. Locul de unde vor fi selectate datele (documente, registre, directoare etc.) este indicat după cuvântul „DIN”.

În exemplul de mai jos, numele întregii nomenclaturi sunt selectate din cartea de referință „Nomenclatură”. După cuvântul „CUM”, sunt indicate pseudonimele (numele) pentru tabele și câmpuri.

ALEGE
Nomenclatură.Nume AS NumeNomenclatură
DIN
Director.Nomenclatura AS Nomenclatura

Lângă comanda „SELECT”, puteți specifica cuvinte cheie:

  • VARIAT. Interogarea va selecta numai rânduri care diferă în cel puțin un câmp (fără duplicate).
  • Primul N, Unde n– numărul de rânduri de la începutul rezultatului care urmează să fie selectat. Cel mai adesea, această construcție este utilizată împreună cu sortarea (ORDER BY). De exemplu, atunci când trebuie să selectați un anumit număr de ultimele documente după dată.
  • PERMIS. Acest design vă permite să selectați din baza de date numai acele înregistrări care sunt disponibile utilizatorului curent. Dacă se utilizează acest cuvânt cheie, utilizatorul va primi un mesaj de eroare dacă încearcă să interogheze înregistrările la care nu are acces.

Aceste cuvinte cheie pot fi folosite împreună sau separat.

PENTRU SCHIMBARE

Această clauză blochează datele pentru a evita conflictele. Datele blocate nu vor fi citite de la o altă conexiune până la sfârșitul tranzacției. În această clauză, puteți specifica anumite tabele pe care doriți să le blocați. În caz contrar, toate vor fi blocate. Designul este relevant doar pentru modul de blocare automată.

Cel mai adesea, clauza „PENTRU SCHIMBARE” este folosită la primirea soldurilor. Într-adevăr, atunci când mai mulți utilizatori lucrează în program în același timp, în timp ce unul primește soldurile, celălalt le poate schimba. În acest caz, soldul rezultat nu va mai fi corect. Dacă blocați datele cu această propunere, atunci până când primul angajat primește soldul corect și efectuează toate manipulările necesare cu acesta, al doilea angajat va trebui să aștepte.

ALEGE
Acorduri reciproce. Salariat,
Decontari reciproce Suma Decontari reciproce Sold
DIN
Registrul de acumulare Decontari reciproce CU Angajati Solduri AS Decontari reciproce
PENTRU SCHIMBARE

UNDE

Construcția este necesară pentru impunerea oricărei selecții asupra datelor descărcate. În unele cazuri de obținere a datelor din registre, este mai rezonabil să se prescrie condiții de selecție în parametrii tabelelor virtuale. Când utilizați „UNDE”, toate înregistrările sunt obținute mai întâi și abia apoi se aplică selecția, ceea ce încetinește semnificativ interogarea.

Următorul este un exemplu de solicitare de a obține persoane de contact cu o anumită poziție. Parametrul de selecție are următorul format: &ParameterName (numele parametrului este arbitrar).

SELECTARE (CAZ)

Construcția vă permite să specificați condiții direct în corpul cererii.

În exemplul de mai jos, „Câmpul suplimentar” va conține text în funcție de dacă documentul este postat sau nu:

ALEGE
AdmitereT&U.Link,
ALEGERE
CÂND
ATUNCI "Document postat!"
ELSE "Documentul nu a fost postat..."
TERMINAȚI CA SuplimentarField
DIN
Document.Reception of GoodsServices AS ReceiptT&C

A TE ALATURA

Unele leagă două tabele printr-o anumită condiție de legătură.

ALĂTURAȚI STÂNGA/DREAPTA

Esența îmbinării LEFT este că primul tabel specificat este luat în întregime, iar al doilea este atașat la acesta de condiția conexiunii. Dacă nu există înregistrări care să corespundă primului tabel din al doilea, atunci NULL este înlocuit ca valorile lor. Mai simplu spus, tabelul principal este primul tabel specificat, iar datele celui de-al doilea tabel (dacă există) sunt deja înlocuite cu datele acestuia.

De exemplu, trebuie să obțineți articole din documentele „Recepție de bunuri și servicii” și prețuri din registrul de informații „Prețuri articole”. În acest caz, dacă prețul oricărei poziții nu este găsit, înlocuiți NULL. Toate articolele din document vor fi selectate indiferent dacă au un preț sau nu.

ALEGE
Chitanța Nomenclatorului T&U,
Preturi.Pret
DIN
Document.Receptie of GoodsServices.Goods AS ReceiptT&C
INNER JOIN
ON Primirea Q&A.Nomenclatura = Preturi.Nomenclatura

În DREAPTA, totul este exact invers.

CONEXIUNE COMPLETA

Acest tip de îmbinare diferă de cele anterioare prin faptul că toate înregistrările primului tabel și ale celui de-al doilea vor fi returnate ca rezultat. Dacă nu se găsesc înregistrări în primul sau al doilea tabel pentru condiția de legătură specificată, va fi returnat NULL.

Când utilizați îmbinarea completă în exemplul anterior, vor fi selectate toate articolele din documentul de primire a bunurilor și serviciilor și toate cele mai recente prețuri din registrul prețurilor articolelor. Valorile înregistrărilor negăsite, atât în ​​primul, cât și în cel de-al doilea tabel, vor fi NULL.

INNER JOIN

Diferența dintre o îmbinare INNER și o îmbinare COMPLETĂ este că, dacă o înregistrare nu este găsită în cel puțin unul dintre tabele, atunci interogarea nu o va afișa deloc. Ca urmare, vor fi selectate doar acele articole din documentul de Primire Bunuri și Servicii pentru care există înregistrări în registrul de informații Prețuri Articole, dacă în exemplul anterior înlocuim FULL cu INTERN.

A SE GRUPA CU

Gruparea în interogări 1C vă permite să restrângeți rândurile de tabel (câmpuri de grupare) conform unei anumite caracteristici comune (câmpuri de grupare). Câmpurile de grupare pot fi afișate numai folosind funcții de agregare.

Rezultatul următoarei interogări va fi o listă de tipuri de articole cu prețurile lor maxime.

ALEGE
,
MAX(Preț.Preț) AS Preț
DIN

A SE GRUPA CU
Preturi.Nomenclatura.TipNomenclatura

REZULTATE

Spre deosebire de grupare, atunci când se utilizează totaluri, toate înregistrările sunt afișate și rândurile totale sunt deja adăugate la acestea. Gruparea afișează numai înregistrări generalizate.

Rezultatele pot fi rezumate pentru întregul tabel (folosind cuvântul cheie „GENERAL”), pentru mai multe câmpuri, pentru câmpuri cu structură ierarhică (cuvinte cheie „IERARHIE”, „NUMAI IERARHIE”). Când rezumați, nu este necesar să folosiți funcții agregate.

Luați în considerare un exemplu similar cu cel de mai sus folosind gruparea. În acest caz, rezultatul interogării va returna nu numai câmpuri grupate, ci și înregistrări detaliate.

ALEGE
Prețuri.Nomenclatură.Tip de nomenclatură AS Tip de nomenclatură,
Preturi.Pret AS Pret
DIN
RegisterInformation.PricesNomenclature.SliceLast AS Preturi
REZULTATE
MAXIMUM(Preț)
DE
Nomenclatură de tip

AVÂND

Acest operator este similar cu operatorul WHERE, dar este folosit doar pentru funcții agregate. Alte câmpuri decât cele utilizate de acest operator trebuie grupate. Operatorul „UNDE” nu este aplicabil pentru funcțiile agregate.

În exemplul de mai jos, prețurile maxime ale articolelor sunt selectate dacă depășesc 1000, grupate după tipul articolului.

ALEGE

MAX(Preț.Preț) AS Preț
DIN
RegisterInformation.PricesNomenclature.SliceLast AS Preturi
A SE GRUPA CU
Preturi.Nomenclatura.TipNomenclatura
AVÂND
MAX(Prețuri. Preț) > 1000

FILTREAZĂ DUPĂ

Operatorul „ORDER BY” sortează rezultatul interogării. Pentru a vă asigura că înregistrările sunt scoase într-o ordine consecventă, se utilizează AUTO-ORDER. Tipurile primitive sunt sortate după regulile obișnuite. Tipurile de referință sunt sortate după GUID.

Un exemplu de obținere a unei liste de angajați sortați după nume:

ALEGE
Angajații.Nume AS Nume
DIN
Director.Angajaţii AS Angajaţii
FILTREAZĂ DUPĂ
Nume
COMANDA AUTOMATA

Alte construcții ale limbajului de interogare 1C

  • UNI- rezultatele a două interogări într-una.
  • UNIȚI TOȚI– similar cu JOIN, dar fără a grupa rânduri identice.
  • MASĂ GOLĂ- folosit uneori la alăturarea interogărilor pentru a specifica un tabel imbricat gol.
  • A PUNE- creează un tabel temporar pentru a optimiza interogările complexe 1C. Astfel de solicitări se numesc solicitări în lot.

Caracteristicile limbajului de interogare

  • SUBSTRING trunchiază un șir dintr-o poziție specificată cu numărul specificat de caractere.
  • AN... AL DOILEA vă permit să obțineți valoarea selectată a tipului numeric. Parametrul de intrare este o dată.
  • ÎNCEPUTUL PERIOADEI ȘI sfârșitul perioadei sunt folosite atunci când se lucrează cu date. Tipul perioadei (ZI, LUNA, AN etc.) este specificat ca un parametru suplimentar.
  • ADDDATE vă permite să adăugați sau să scădeți de la dată ora specificată de un anumit tip (SECOND, MINUT, DAY etc.).
  • DIFERENTA DE DATA determină diferența dintre două date, specificând tipul valorii de ieșire (ZI, AN, LUNA etc.).
  • ISNULLînlocuiește valoarea lipsă cu expresia specificată.
  • PREZENTARE și PREZENTARELINK-URI obțineți reprezentarea în șir a câmpului specificat. Ele sunt utilizate pentru orice valoare și, respectiv, numai pentru valori de referință.
  • TIP, TIP VALOARE sunt utilizate pentru a determina tipul parametrului de intrare.
  • LEGĂTURĂ este un operator logic de comparare pentru tipul de valoare de atribut.
  • EXPRES este folosit pentru a converti valoarea în tipul dorit.
  • DATA ORA primește o valoare de tip „Data” din valorile numerice (Anul, Luna, Ziua, Ora, Minutul, Secunda).
  • SENSîntr-o solicitare 1C, este folosit pentru a specifica valori predefinite - directoare, enumerari, planuri pentru tipuri de caracteristici. Exemplu de utilizare: " Unde LegalIndividual = Valoare(Enumeration.LegalIndividual.Individual)«.

Generator de interogări

Pentru a crea interogări cu 1C, există un mecanism încorporat foarte convenabil - designerul de interogări. Conține următoarele file principale:

  • „Tabele și câmpuri” - conține câmpurile care trebuie selectate și sursele acestora.
  • „Legături” - descrie condițiile pentru constructul CONEXIUNE.
  • „Gruparea” - conține o descriere a construcțiilor grupărilor și câmpurile rezumate după acestea.
  • „Condiții” – este responsabil pentru selectarea datelor din cerere.
  • „Avansat” - parametri suplimentari de interogare, cum ar fi cuvintele cheie ale comenzii „SELECT” etc.
  • „Joins / Aliases” - sunt indicate posibilitățile de îmbinare a tabelelor și sunt setate aliasuri (constructia „CUM”).
  • „Comandă” - este responsabil pentru sortarea rezultatului interogărilor.
  • „Totale” - similar cu fila „Grupare”, dar este folosit pentru construcția „TOTALURI”.

Textul cererii în sine poate fi vizualizat făcând clic pe butonul „Solicitare” din colțul din stânga jos. În acest formular, poate fi corectat manual sau copiat.


Consola de interogări

Pentru a vizualiza rapid rezultatul unei interogări în modul „Enterprise” sau pentru a depana interogări complexe, utilizați . Textul de interogare este scris în el, parametrii sunt setați și rezultatul acestuia este afișat.

Puteți descărca consola de interogări pe discul ITS sau prin .

Am decis să contribui și să descriu acele caracteristici ale limbajului care nu au fost luate în considerare în articolele de mai sus. Articolul se adresează dezvoltatorilor începători.

1. Construcție „DIN”.

Pentru a obține date din baza de date, nu este necesar să folosiți constructul „FROM”.
Exemplu: Trebuie să selectăm toate informațiile despre bănci din directorul băncilor.
Cerere:

ALEGE Director.Bănci.*

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

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

2. Comandați datele după câmpul de referință

Când trebuie să ordonăm datele de interogare după tipurile primitive: „Șir”, „Număr”, „Data”, etc., atunci totul este rezolvat folosind constructul „ORDER BY”, dacă trebuie să ordonați datele după un câmp de referință? Câmpul de referință este o legătură, un identificator unic, adică În linii mari, este posibil ca un anumit set arbitrar de caractere și ordinea obișnuită să nu producă rezultatul așteptat. Pentru comandarea câmpurilor de referință se folosește constructul „AUTOORDER”. Pentru a face acest lucru, trebuie mai întâi să ordonați datele direct după tipul de referință folosind constructul „ORDER BY”, apoi constructul „AUTOORDER”.

În acest caz, pentru documente, comanda va avea loc în ordinea „Data-> Număr”, pentru directoare - prin „Vizualizare principală”. Dacă ordonarea nu se bazează pe câmpuri de referință, nu este recomandată utilizarea construcției „AUTOORDER”.

În unele cazuri, constructul „AUTOORDER” poate încetini procesul de eșantionare. În mod similar, puteți rescrie fără aranjare automată pentru documente:

3. Obținerea unei reprezentări textuale a tipului de referință. Construcție „PRESENTARE”.

Când trebuie să afișați un câmp de tip de referință pentru afișare, de exemplu, câmpul „Bank”, care este o legătură către elementul 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 căutarea directorului. Acest lucru va încetini producția de date. Pentru a evita acest lucru, este necesar să folosiți constructul „REPREZENTARE” în ​​cerere pentru a obține imediat reprezentarea obiectului și a-l afișa deja pentru vizualizare.

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

4. Condiție pentru eșantionarea datelor conform șablonului.

De exemplu, trebuie să obțineți telefoane mobile ale angajaților din formular (8 -123-456-78-912). Pentru a face acest lucru, trebuie să puneți următoarea condiție în cerere:

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

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

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


Totalurile sunt adesea folosite împreună cu grupările, caz în care funcțiile agregate din totaluri pot fi omise.

ALEGE Servicii.Organizație AS Organizație, Servicii.Nomenclatură AS Nomenclatură, SUMA(Servicii.Suma document) AS Document Sumă FROM Document.Servicii AS Servicii GRUPURI BY Servicii.Organizare, Servicii.Nomenclator SHIE, Organizație, Nomenclator

În acest caz, cererea va returna aproape la fel ca această solicitare:

ALEGE Servicii Organizație AS Organizație, Servicii Nomenclator AS Nomenclator Servicii Document Sumă AS Document Sumă FROM Document.

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

6. Dereferențiarea câmpurilor.

Referințarea câmpurilor 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” al documentului „Plată”, se referă la un alt tabel „Organizații”, în care se va primi 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 de câmp. În acest caz, interogarea nu va fi optimă.Dacă se știe clar ce tip de câmp este, este necesar să restrângi astfel de câmpuri după tip cu construcția EXPRES().

De exemplu, există un registru de acumulare „Plăți nealocate”, 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.Registrar.Data, ..... DIN Registrul de acumulare.Plăți nealocate AS Plăți nealocate

ar trebui să limitați tipul de înregistrator de câmp compozit:

SELECT EXPRESS(Plăți nealocate. Înregistrare ca document. Plată). Data, ..... FROM Registrul de acumulare. Plăți nealocate ca plăți nealocate

7. Construcție „UNDE”

Cu o îmbinare la stânga a două tabele, când impuneți condiția „UNDE” pe tabelul 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 de Clienți și pentru acei clienți care au un document de plată cu valoarea atributului „Organizație” = &Organizație să se afișeze documentul „Plată”, pentru cei care nu îl 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ă obțineți mai întâi toate plățile pentru organizarea „cum ar fi” într-un tabel temporar și apoi să vă conectați la directorul „Clienți” cu o alăturare stângă.

SELECT Plată.Referință AS Plată, Plată.Acționar AS Client PUT topayments FROM Document.Payment AS Plată WHERE Payment.Department = &Department; ////////////////////////////////////////////////////////////////////// / ////////////////////////////// SELECT Clients.Reference AS Client, ISNULL(topayments.Payment, "") AS Payment FROM Director .Clienții CA CLIENȚI LEFT JOIN

Puteți ocoli această afecțiune într-un alt mod. este necesar să se impună condiţia „UNDE” direct în relaţia celor două tabele. Exemplu:

SELECT Clients.Reference, Payment.Reference FROM Directory.US_Subscribers AS ST_Subscribers LEFT JOIN Document.Payment AS Payment SOFTWARE (Clients.Reference = Payment.Client AND Payment.Client.Name LIKE "Sugar Bag") GROUP BY Clients.Reference, Payment. Legătură

8. Uniri cu tabele imbricate și virtuale

Subinterogări sunt adesea necesare pentru a selecta datele în funcție de anumite condiții. Dacă apoi le utilizați împreună cu alte tabele, atunci acest lucru poate încetini critic execuția interogării.

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

SELECT UnallocatedPayBlances.Customer, UnallocatedPaymentsRemains.AmountBalance FROM (SELECT Clients.Reference AS Reference FROM Directory.Clients AS Clients WHERE Clients.Ref B(&Clients)) AS NestedQuery LEFT JOIN Registru de acumulare.UnallocatedPayments. mentsRămâne .Client

La executarea unei astfel de interogări, optimizatorul DBMS este probabil să facă erori atunci când alege un plan, ceea ce va duce la o execuție suboptimă a interogării. La unirea a două tabele, optimizatorul DBMS alege un algoritm pentru unirea tabelelor pe baza numărului de înregistrări din ambele tabele. În cazul unei interogări imbricate, este extrem de dificil să se determine numărul de înregistrări pe care le va returna interogarea imbricată. Prin urmare, în loc de interogări imbricate, ar trebui să utilizați întotdeauna tabele temporare. Deci, să rescriem interogarea.

SELECTARE Clienți.Link AS Link PUT Clients FROM Directory.Clients AS Clients WHERE
Clienți.Link B (&Clienți) ; ////////////////////////////////////////////////////////////////////// / ////////////////////// SELECTAȚI tClients.Reference, UnalocatedPaymentsBalances.SumBalance, FROM tClients AS tClients LEFT JOIN Registrul de acumulare.UnallocatedPayments.Balances (, Client IN (SELECT) tClients.Reference FROM tClients)) AS UnallocatedPaymentsBalances ON tClients.Reference = UnallocatedPaymentsBalances.Clients

În acest caz, optimizatorul va putea determina câte înregistrări folosește tabelul temporar tClients și va putea alege algoritmul optim de îmbinare a tabelului.

Mesele virtuale , vă permit să obțineți date aproape gata făcute pentru majoritatea sarcinilor aplicației (Slice of the First, Slice of the Last, Residuals, Turnovers, Residuals și Turnovers) Cuvântul cheie aici este virtual. Aceste mese nu sunt fizice, ci sunt asamblate de sistem din mers, adică. atunci când primește date din tabele virtuale, sistemul colectează date din tabelele finale de registre, compune, grupează și emite utilizatorului.

Acestea. când vă alăturați cu un tabel virtual, vă alăturați cu o subinterogare. În acest caz, optimizatorul DBMS poate alege, de asemenea, un plan de conectare neoptimal. Dacă interogarea nu se formează suficient de repede și interogarea folosește îmbinări în tabele virtuale, atunci se recomandă transferul accesului la tabelele virtuale într-un tabel temporar și apoi să se facă o îmbinare între două tabele temporare. Să rescriem interogarea anterioară.

SELECTARE Clienți.Link AS Link PUT Clients FROM Directory.Clients AS Clients INDEX BY Link WHERE
Clienți.Link B (&Clienți) ; ////////////////////////////////////////////////////////////////////// / ////////////////////////////// SELECTAȚI Plăți Nealocate.SumăBalance, Plăți Nealocate.Client CA Client PUNEȚI soldurile DIN Registrul de acumulare.Plăți Nealocate. Solduri(, Client IN (SELECTARE tClients.Reference FROM tClients)) AS UnalocatedPaymentsBalances; ////////////////////////////////////////////////////////////////////// ////////////////////////////// SELECT tClients.Reference, thenRemains.SumRemainder AS SumRemainder FROM tClients AS tClients tClients.Reference = tRemainders. Client

9.Verificarea rezultatului interogării.

Rezultatul execuției interogării poate fi gol; pentru a verifica valorile goale, utilizați construcția:

RequestRes = Request.Execute(); Dacă reQuery.Empty() Apoi Return; EndIf;

Metodă Gol() trebuie folosit înainte de metode Alege() sau Descărca(), deoarece este nevoie de timp pentru a obține colecția.

Nu este o descoperire pentru nimeni că este extrem de nedorit să folosești interogări într-un ciclu. 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 abia apoi să procesați datele într-o buclă. Dar uneori există cazuri când devine imposibil să scoți cererea din buclă. În acest caz, pentru optimizare, puteți muta crearea interogării în afara buclei și puteți înlocui parametrii necesari în buclă și executați interogarea.

Solicitare = Solicitare nouă; Query.Text = "SELECT | Clients.Link, | Clients.Date of Birth |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 analizarea cererii într-o buclă.

11. Construcție „AVÂND”.

O construcție destul de rară în interogări. 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ă valoarea plății și apoi să impuneți o condiție. Construcția „HAVING” va ajuta la evitarea acestui lucru.

SELECT Plata.Client, SUM(Plata.Suma) AS Sumă FROM Document.Plată AS Plată WHERE MONTH(Plata.Data) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Amount) > 13000

În constructor, tot ce trebuie să faceți este să mergeți la fila „Condiții”, să adăugați o nouă condiție și să bifați caseta de selectare „Personalizat”. Atunci doar scrie Sumă (Plată. Sumă) > 13000


12. Valoare nulă

Nu voi descrie aici principiile logicii cu trei valori din baza de date, există multe articole pe această temă. Doar o privire despre cum NUL poate afecta rezultatul interogării. Valoarea NULL nu este cu adevărat o valoare, iar faptul că valoarea nu este definită este necunoscut. Prin urmare, orice operație pe NULL returnează NULL, fie că este vorba de adunare, scădere, împărțire sau comparație. Valoarea NULL nu poate fi comparată cu valoarea NULL deoarece nu știm ce să comparăm. Acestea. ambele aceste comparații: NULL = NULL, NULL<>NULL nu este adevărat sau fals, adică necunoscut.

Să ne uităm la un exemplu.

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

SELECTAȚI „Fără plăți” AS Atribut, NULL AS Document PUT la plăți; ////////////////////////////////////////////////////////////////////// /////////////////////////////// SELECT Clients.Link AS Client, Payment.Link AS Payment PUT tClientPayment FROM Directory.Clients AS Clienții LEFT JOIN Document.Payment AS Payment Software Clients.Link = Payment.Shareholder; ////////////////////////////////////////////////////////////////////// /////////////////////////////// SELECTAȚI tCustomerPayment.Customer FROM tClientPay AS tClientPay INNER JOIN toPay AS toPay BY tClientPay.Pay = tPay Document

Acordați atenție celui de-al doilea tabel temporar tCustomerPayment. 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 „topayments” am desemnat 2 câmpuri, unul dintre ele este NULL, al doilea este linia „Nu are plăți”. În al treilea tabel, mă alătur tabelelor „tClientPayment” și „tPayments” prin câmpurile „Plată” și „Document” cu o îmbinare internă. Știm că în primul tabel câmpul „Document” este NULL, iar în al doilea tabel sunt și NULL cei care nu au plăți în câmpul „Plată”. Ce ne va returna o astfel de conexiune? Și nu va returna nimic. Deoarece comparația NULL = NULL nu se evaluează la True.

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

SELECTAȚI „Fără plăți” AS Sign, VALUE(Document. Plată. Referință goală) AS Document PUT la Plăți; ////////////////////////////////////////////////////////////////////// / /////////////////////////////// SELECT Clients.Reference AS Client, ISNULL(Payment.Reference, VALUE(Document.Payment) .EmptyReference )) CUM PUNEȚI tClientPayment DIN Director.Clienți AS CLIENȚI LEFT JOIN Document.Payment AS Payment ON Clients.Reference = Payment.Shareholder; ////////////////////////////////////////////////////////////////////// / /////////////////////////////// SELECTAȚI tClientPayment.Customer FROM tClientPay AS tClientPayment INTERNAL JOIN topayments AS topayments BY tClientPayment.Payment = toplati.Document

Acum, în al doilea tabel temporar, am indicat că dacă câmpul „Plată” este NULL, atunci acest câmp = o referință goală la documentul de plată. În primul tabel, am înlocuit, de asemenea, NULL cu o referință nulă. Acum câmpurile non-NULL sunt implicate în conexiune și interogarea va returna rezultatul așteptat.

Toate cererile cuprinse în articol reflectă situații pe care aș dori să le iau în considerare și nimic mai mult. DESPRE nici nu pot fi nebuni sau nu optimi, principalul lucru este să reflecte esența exemplului.

13. Caracteristica de proiectare nedocumentată „ALEGE CÂND... ATUNCI.... Sfârșitul”.

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

SELECTAȚI ALEGEREA CÂND Utilizatori.Nume = „Vasya Pupkin” ȘI „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 în interogare? Scrierea unui construct uriaș într-o interogare este urâtă și necesită timp, așa că această formă de notare de mai sus ne poate ajuta:

Alegerea unei luni (decontarea evaluării_grafice. Contul Periodrass) când 1 apoi „ianuarie” când 2 apoi „februarie” când 3 apoi „martie” când 4 apoi „aprilie” când 5 apoi „mai” când 6 apoi „iunie” când 7 este „iulie” apoi „iulie” 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 nu pare atât de greoi și este ușor de perceput.

14. Executarea interogării pe lot.


Pentru a nu produce cereri, puteți crea o cerere mare, o puteți împărți în pachete și puteți lucra deja cu ea.
De exemplu, trebuie să obțin câmpuri din directorul „Utilizatori”: „Data nașterii” și roluri disponibile pentru fiecare utilizator. pentru a-l descărca în diferite părți tabulare de pe formular. Desigur, puteți face acest lucru într-o singură interogare, apoi trebuie să repetați înregistrările sau să restrângeți, sau puteți face acest lucru:

SELECT Users.Link AS Nume, Users.Date of Birth, Users.Role ENTER Users FROM Directory.Users AS Users; ////////////////////////////////////////////////////////////////////// /////////////////////////////// SELECT tuUsers.Name, tuUsers.Data nașterii FROM tuUsers AS tuUsers GROUP BY tuUsers.Name , tuUsers. Data nașterii; ////////////////////////////////////////////////////////////////////// /////////////////////////////// SELECT wUsers.Name, wUsers.Role FROM wUsers AS wUsers GROUP BY wUsers.Name, wUsers Data nașterii

tPackage = Request.ExecutePackage();

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

După cum putem vedea, interogarea poate fi executată într-un lot și poate lucra cu rezultatul ca o matrice. În unele cazuri, foarte convenabil.

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

De exemplu, avem o cerere de lot, unde primim mai întâi câmpurile: „Nume, Data nașterii, Cod” din directorul „Utilizatori” și dorim să obținem înregistrări cu o condiție pe 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 PUT in Users FROM Directory.Users AS Users; ////////////////////////////////////////////////////////////////////// ////////////////////////////// SELECTAȚI Persoane.Link AS Individ FROM Director.Persoane AS Persoane

Puteți aplica condiții ca aceasta:

WHERE Persoane fizice.Cod la (SELECT TueUsers.Code FROM TuUsers) AND Individuals.Name La (SELECT TueUsers.Code FROM TuUusers) AND Individuals.Date of Birth La (SELECT TueUsers.Date of Birth FROM TuUsers)

Și este posibil așa:

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

Și asigurați-vă că urmați regulile.

16. Apelați Query Builder pentru „Condiție” în Batch Query

Când trebuie să impuneți 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ă ați uitat numele, va trebui să părăsiți editarea condiția fără a salva și uitați-vă la numele câmpului. Pentru a evita acest lucru, puteți folosi următorul truc.

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 loc și apelați constructorul de interogare. Constructorul va avea acces la toate tabelele de interogări batch. Recepția funcționează atât pe tabele virtuale de registre, cât și pentru fila „Condiții”. În acest din urmă caz, este necesar să bifați caseta de selectare „A (condiție arbitrară)” și să intrați în modul de editare „F4”.

Interogările sunt adesea făcute din mers și servesc doar pentru a afișa „trucurile” pe care le-am luat în considerare.

Am vrut să iau în considerare utilizarea indecșilor în interogări, dar este un subiect dureros de extins. Îl voi pune într-un articol separat sau îl voi adăuga mai târziu aici.

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

Cărți folosite:
Limbajul de interogare „1C:Enterprise 8” - E.Yu. Hrustalev
Dezvoltare profesională în sistemul 1C:Enterprise 8.

Atenţie! Iată o versiune de probă a lecției, ale cărei materiale ar putea să nu fie complete.

Conectați-vă ca student

Conectați-vă ca student pentru a accesa conținutul școlii

1C 8.3 limbaj de interogare pentru programatori începători: operator condiționat

Declarație condiționată într-o interogare

Să scriem o interogare care să obțină numele și caloriile alimentelor:

Și acum să adăugăm o coloană la rezultatul interogării, în care vom afișa conținutul de grăsime al alimentelor conform următoarelor reguli:

  • dacă conținutul de calorii este mai mic de 100, atunci conținutul de grăsimi este scăzut;
  • dacă conținutul de calorii este de la 100 la 200, atunci conținutul de grăsimi este normal;
  • dacă conținutul de calorii este mai mare de 200, atunci conținutul de grăsimi este mare.

Cum se poate realiza acest lucru, pentru că în tabel Director.Mâncare nici o coloana conținut de grăsime?

Se pare că putem adăuga singuri această coloană folosind un operator condiționat în interiorul interogării:

Să aruncăm o privire mai atentă la textul solicitării:

In sectiune ALEGE câmpurile de selecție sunt listate: Nume, calorii, iar apoi în locul celui de-al treilea câmp, există o construcție a unui operator condiționat, al cărui rezultat se încadrează în a treia coloană.

Condițiile operatorului procesate secvenţial. Dacă una dintre ele s-a dovedit a fi adevărată, atunci valoarea corespunzătoare este returnată ca rezultat. Dacă niciuna dintre condiții nu este îndeplinită, atunci valoarea din secțiune este returnată. IN CAZ CONTRAR.

Deci, noua interogare va returna următorul tabel:

Retragere

Rețineți că a treia coloană din tabel returnată de interogare este apelată Câmpul 1. Acest nume a fost generat automat de sistem deoarece a treia coloană nu corespunde niciunui câmp real din tabel Director.Mâncare, de unde s-ar putea primi acest nume.

Dar stă în puterea noastră să-i dăm acest nume. Pentru a face acest lucru, imediat după descrierea câmpului, trebuie să scrieți un cuvânt cheie CUM, iar după aceea specificați numele în sine, despărțit de un spațiu. Citiți o versiune de probă a lecției, se află lecțiile complete. Acest nume va fi numit alias de câmp.

Aliasurile pot fi atribuite oricărui câmp, inclusiv celor care au deja un nume. Să facem un alias Alimente pentru teren Nume:

Exemplu de utilizare a funcției SUBSTRING:

SELECT Name, SELECT WHEN SUBSTRING(Nume, 1 , 3 ) = "Ban" THEN "This is a banana" WHEN SUBSTRING(Name, 1 , 2 ) = "Chi" THEN "This is chips" ELSE "Something" END OF Director . Alimente

Rezultate condiționale mai complexe

Rezultatul unui operator condiționat poate fi nu numai un șir, ci și un număr, dată, boolean sau tip de referință. Poate fi fie o constantă a tipurilor enumerate mai sus, fie un câmp de tabel. Citiți o versiune de probă a lecției, se află lecțiile complete.

Iată un exemplu general care demonstrează toate aceste opțiuni:

A lua testul

Începeți testul

1. Condițiile instrucțiunii select (cum este numită și aceasta) sunt procesate

2. Operatorul condiționat revine întotdeauna

3. Dacă niciuna dintre condiții nu a funcționat, instrucțiunea select va returna valoarea

4. Secțiunea ELSE din instrucțiunea condiționată

5. În condiţiile fişei de selecţie se poate folosi

Cum se setează filtrul după tipul de document?
Cum se specifică o condiție pentru selectarea unei valori nedefinite?
Cum se selectează o valoare goală în limbajul de interogare 1C?
Ce condiție trebuie specificată în cerere după cuvântul cheie „UNDE” atunci când este necesar să se facă o selecție pe câmpuri goale?

Cod 1C v 8.x Solicitare.Text =
"ALEGE
| usStorageUnits.Reference
| DE LA
| Reference.usStorageUnit AS usStorageUnit"

// Exemplul 1. comparație cu o valoare booleană goală:
|UNDE
| setStorageUnit.Allow SelectionFromStandbyZone = Fals

// Exemplul 2. dar dacă acest boolean este definit, atunci acesta este mai bine: // condiție pentru un boolean negativ:
|UNDE
| NU cu unități de stocare. Permiteți retragerea din zona de așteptare

// Exemplul 3. selectarea după condiție a unui câmp gol de tip „referință tip beton”
|UNDE
| setStorageUnit.ActiveFilterRegion = VALUE(Catalog.FilterRegion us.NullReference)

// Exemplul 3a. selectarea după condiție a unui câmp gol de tipul „document de un anumit tip”
|UNDE
| OurInformationRegister.Document = VALUE(Document.OurDocument.EmptyReference)

// Exemplul 3b. selectarea după condiție a unui câmp gol de tipul „documente de diferite tipuri” (câmp compus)
|UNDE
| (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyReference)
| SAU Registrul nostru de informații.Document = VALUE(Document.Documentul nostru2.Referință goală)
| SAU...(etc. - enumerați secvențial condițiile pentru toate tipurile posibile ale acestui câmp compus))

// Exemplul 4. sau invers, dacă trebuie să selectați o valoare completată de tipul „șir”, atunci condiția va ajuta:
|UNDE
| usStorageUnits.Name > """"

// Exemplul 5. dacă trebuie să selectați documente de un anumit tip, cu un tip de date compus, de exemplu, în registrul „Sarcini executate”, resursa „Sarcina” are un tip compus, printre valorile cărora documentul „Selectare” este posibil
|UNDE
| EXPRESS(InformationRegisterJobs to be performed.Job AS Document.Filter) REF Document.Filter

// Exemplul 5a. Un alt exemplu similar când trebuie să selectați documente de un anumit tip
| ALEGERE
| CÂND SE EXPRIMĂ(ar Corespondența documentelor.DocumentBU AS Document.Bunuri de servicii primite) REFERINȚĂ Document.Bunuri de servicii primite
| APOI ""Bunuri/Servicii primite""
| CÂND SE EXPRIMĂ (ar Corespondența documentelor.DocumentBU AS Document.Vânzări de bunuri de servicii) Document de REFERINȚĂ.Vânzări de bunuri de servicii
| APOI ""Realizarea bunurilor și serviciilor""
| IN CAZ CONTRAR """"
| END AS KindDocument

// Exemplul 6. selectarea după condiție a unei valori nedefinite:
|UNDE
| SavedSettings.User = NEdefinit

// Exemplul 7. selectarea după tipul de mișcare „Intrare” a registrului de acumulare, „Cheltuieli” - similar):
|UNDE
| RegGoodsRetail.MovementType = VALUE(MovementAccumulationType.Income)

// Exemplul 8. Cum se indică în cerere că nu este necesar să se execute cererea (de exemplu, este necesar programatic, în funcție de unele
// condiții pentru a returna un rezultat de interogare gol -
// Query.Text = StrReplace(Query.Text, „WHERE Document.Link = &DocumentLink”, „WHERE FALSE”);).
// Pentru a face acest lucru, trebuie doar să adăugați condiția „Unde este fals”.
// Apropo, indiferent de cantitatea de date solicitată în eșantion, o astfel de solicitare va fi executată instantaneu.
|UNDE SA MINCI

// Exemplul 9. Verificarea dacă rezultatul interogării conține date:
Dacă NU Cerere.Run().Empty() Atunci

// Exemplul 10. selectarea după condiția unei date goale:
|UNDE
| tbRows.CancellationDate = DATETIME(1, 1, 1)

Articolul oferă trucuri 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ă dau Descriere completa limbajul de interogare, dar vreau să mă opresc doar asupra unor puncte care pot fi utile cuiva.

Deci, să începem. Solicitarea este un obiect special în 1C 8.2 A care este utilizat pentru a forma și executa interogări împotriva tabelelor bazei de date din sistem. Pentru a executa o interogare, trebuie să compuneți un text de interogare care să descrie ce tabele vor fi folosite ca surse de date pentru interogare, ce câmpuri să selectați, ce sortări și grupări să aplicați etc. Puteți citi mai multe despre interogări în cartea „1C 8.2 Developer’s Guide”. Limbajul de interogare 1C 8.2 este foarte asemănător ca sintaxă cu alte limbaje de interogare a bazei de date SQL, dar există diferențe. Printre principalele avantaje ale limbajului de interogare încorporat, merită remarcată dereferențiarea câmpurilor, prezența tabelelor virtuale, lucrul convenabil cu totaluri și câmpurile netipizate în interogări. Printre dezavantaje - nu puteți folosi o interogare ca câmp de ieșire, nu puteți folosi proceduri stocate, nu puteți converti un șir într-un număr.

Voi oferi informații și recomandări cu privire la limbajul de interogare punct cu punct:
1. Pentru a crește lizibilitatea interogării și a reduce numărul de parametri de interogare, puteți aplica în interogare acces la datele de configurare predefinite folosind literalul VALOARE (REPREZENTAREA VALORII). Ca reprezentare a valorilor, valoarea enumerărilor, date predefinite ale cărților de referință, planuri de tipuri de calcul, planuri de tipuri de caracteristici, planuri de conturi, referințe goale, valori ale punctelor de referință, valori ale enumerarilor de sistem (de exemplu , AccumulationMovementType,AccountType) pot fi utilizate.
Exemple:

WHERE City = VALUE(Directory.Cities.Moscow)
WHERE City = VALUE(Reference.Cities.EmptyReference)
WHEREItemType = VALUE(Enumeration.ProductTypes.Service)
WHEREMovementType = VALUE(MovementTypeAccumulation.Income)
WHERERoutePoint =
VALUE(BusinessProcess.Consent.RoutePoint.Consent)

O expresie între paranteze începe întotdeauna cu un cuvânt singular (Director, Enumerare etc.) care se potrivește cu tipul valorii predefinite.

2. Comanda automată într-o interogare poate încetini foarte mult procesul. Dacă nu este necesară sortarea, este mai bine să nu o folosiți deloc. În multe cazuri, este mai eficient să scrieți sortarea cu cuvântul cheie FILTREAZĂ DUPĂ.

3. Trebuie avut grijă să nu creați un câmp ambiguu atunci când utilizați aliasuri. În caz contrar, sistemul nu va înțelege ce obiect ar trebui accesat.
Un exemplu de interogare cu un câmp ambiguu:
ALEGE
Nomenclatură. Link,
Bunuri rămase rămase Cantitate rămasă
DIN
Director.Nomenclatura AS Nomenclatura
LEFT JOIN
Rămășițe de produse software.
Este necesar să corectați alias-ul tabelului, de exemplu, după cum urmează: „Directory.Nomenclature AS Nomenclature1”, și respectiv „Nomenclature.Reference”, corectați-l la „Nomenclature1.Reference”.

4. Uneori este util să obțineți reprezentarea câmpurilor de referință cu un cuvânt cheie PERFORMANŢĂîmpreună cu un link astfel încât să nu existe re-acces la baza de date. Acest lucru este util când se afișează rezultatul unei interogări într-un tabel.
Exemplu:
ALEGE
REPREZENTARE(Document.Contractant) CA Destinatar,
REPREZENTARE(Document.Base)
DIN
Document.Factura AS Document

5.Utilizare la cerere EXPRESS(Tip de câmp AS) vă permite să eliminați tabelele inutile din conexiunea cu câmpul tipului de date compus. Acest lucru va grăbi executarea cererii.
Exemplu (registrul este un câmp cu tip compus pentru tabelul fizic al registrului de acumulare a Resturilor de Bunuri, în cerere se selectează Data și Numărul documentelor de Primire a Bunurilor, în timp ce se accesează detaliile documentului Data și Numărul prin Registrator, nu există conexiune multiplă a tabelului de registru cu tabelele de documente care sunt registratori pentru Registrul Resturilor de Bunuri):
ALEGE DIFERIT[b] EXPRESS(Rămășițe de mărfuri.Registrul ca document.Recepția mărfurilor).Număr AS PRIMIT NUMĂR,
[b]EXPRESS(Rămășițe de mărfuri. Înregistrare ca document.Recepție de mărfuri).Data CA DATA PRIMIȚII
[b] DE LA Registrul de acumulare. Rămășițe de bunuri AS Rămășițe de bunuri UNDE (EXPRESS(Rămășițe de mărfuri. Înregistrare ca document. Bunuri de intrare) NU ESTE NUL)

6. Când există utilizatori în configurația 1C ale căror drepturi sunt limitate la anumite obiecte de configurare, cuvântul cheie trebuie utilizat într-o solicitare către astfel de obiecte PERMIS astfel încât interogarea să se finalizeze fără eroare (Selectați Permis...)

7. Când uniți tabele care conțin tabele imbricate (de exemplu, un document cu o secțiune tabelară), cuvântul cheie este util TABUL GOLIT când, de exemplu, unul dintre documente nu are o secțiune tabelară.
Exemplu:
ALEGE Număr.Referință, TABEL GOL.(Nom, Tov, Cant.) CA COMPOZIȚIE

UNIȚI TOȚI
SELECTARE Număr de referință, Compoziție (Număr de linie, Nomenclatură, Cantitate)
DIN Document.Factură

8. Când lucrați cu îmbinări de tabele care conțin câte un rând fiecare, poate fi necesară lipirea rândurilor de tabele (în același timp, ambele tabele nu au un astfel de câmp prin care să poată fi unite). Acest lucru poate fi realizat prin utilizarea „ FULL JOIN Tabel de TRUE". Dacă tabelele au mai multe rânduri, atunci rezultatul va fi numărul de rânduri egal cu produsul numărului de rânduri din ambele tabele. Dacă există O rânduri într-un tabel, atunci numărul de rânduri din tabelul rezultat va fi egal cu numărul de rânduri din al doilea tabel. De asemenea, pentru a uni astfel de tabele, puteți folosi produsul cartezian al tabelelor, în care tabelul rezultat va conține toate combinațiile de rânduri din ambele tabele. Trebuie să ne amintim că dacă unul dintre tabele are 0 rânduri, atunci și produsul cartezian va fi 0, deci o îmbinare completă va fi mai bună. În general, în loc de o conexiune completă PE ADEVĂRAT puteți folosi orice alt tip de îmbinare, dar în acest caz este posibil și ca tabelul rezultat să aibă 0 rânduri, chiar dacă unul dintre tabele are un număr de rânduri diferit de zero. În cazul unei îmbinări complete, această situație va apărea doar într-un singur caz, dacă numărul de rânduri din ambele tabele este 0. Dacă știți că există exact cel puțin un rând în tabel, atunci puteți utiliza LEFT JOIN cu o alta masa cu conditie PE ADEVĂRAT.
Un exemplu (deși artificial, pentru o conexiune completă):
ALEGE
Primul 1
Gender.Link,
K.Contractant
DIN
Enum.Gender AS Gen
FULL JOIN (Selectați primul 1 D.Contractant DIN Document.Vânzarea de bunuri CUM SE COMANDĂ PENTRU D. Punct în timp) CUM SE
ACTIVAT (ADEVĂRAT)

9. Pentru a obține înregistrări unice pentru un anumit câmp, este mai corect să folosiți un cuvânt cheie în loc de grupare VARIATîn interogare, deoarece o astfel de construcție este mult mai clară și cuvântul cheie A SE GRUPA CU are o aplicație mai largă și este adesea folosit dacă este suplimentar necesar să se calculeze funcții agregate pe grupări. În unele cazuri, este necesar să afișați un număr limitat de linii. Pentru a face acest lucru, în descrierea cererii în descrierea cererii, trebuie să specificați cuvântul cheie PRIMUL iar după el - numărul necesar de linii.
Exemplu pentru PRIMUL:
Selectați Primele 5
Director. Nomenclator. Nume,
Director.Nomenclatură.PurchasePrice
Filtrează după
Director.Nomenclatură.PurchasingPrice Desc
Exemplu pentru VARIAT:
Selectați Diverse
Document.Cheltuieli.Contraparte

10. Funcțiile de agregare dintr-o interogare pot fi utilizate fără cuvântul cheie GRUP. În acest caz, toate rezultatele vor fi grupate într-o singură linie.
Exemplu:
Alege
Sumă (Factură. Sumă) Ca Sumă
Din
Document.Factură.Compoziție Ca Factură

11.În interogările din câmpurile de selecție, puteți accesa liber detaliile câmpurilor de selecție. Această caracteristică se numește dereferențiere câmpuri de selecție. Dacă sursa de date este un tabel imbricat (partea tabelară a documentului), atunci în câmpurile de selecție vă puteți referi și la câmpurile tabelului principal (de exemplu, prin câmpul Link, accesați câmpul tabelului principal Counterparty)
Exemplu:
ALEGE[b] Primirea Bunurilor si Serviciilor Bunuri Cantitate AS Cantitate, Primirea de Bunuri și Servicii Bunuri. Link. Contraparte DIN UNDE
Există o particularitate a utilizării dereferențării câmpurilor dacă există grupări în cerere. În orice interogări cu grupări în listele câmpurilor de interogare, puteți accesa liber detaliile câmpurilor de grupare.
Exemplu:
ALEGE
Recepția Bunurilor și Bunurilor Servicii. Nomenclator,
Recepție Bunuri și Servicii Bunuri.Nomenclatură.Cod,
SUM(Bunuri primite și bunuri de servicii. Cantitate) AS Cantitate,
Primirea Bunurilor și Serviciilor Bunuri. Referință. Contraparte,
Primirea Bunurilor și Serviciilor Bunuri. Referință. Data
DIN
Document. Recepția de bunuri și servicii. Bunuri AS Recepția de bunuri și servicii Bunuri
UNDE
Primirea Bunurilor și Serviciilor Bunuri. Link = & Link
A SE GRUPA CU
Recepția Bunurilor și Bunurilor Servicii. Nomenclator,
Primirea de Bunuri și Servicii Bunuri. Link
Ajutorul 1C spune că, dacă există grupare, numai câmpurile de grupare și funcțiile de agregare după câmpuri de selecție pot participa la câmpurile de selecție a interogării. Există o excepție când funcțiile agregate sunt aplicate câmpurilor unui tabel imbricat. În acest caz, în lista câmpurilor de selecție, se poate face referire la câmpurile din tabelul de nivel superior, fără a grupa rezultatele după aceste câmpuri.
Exemplu:
ALEGE
Primirea de bunuri și servicii, bunuri (SUMA (cantitate), nomenclatură),
Primirea Bunurilor și Serviciilor. Link,
Primirea Bunurilor și Serviciilor Contraparte
DIN
Document.Reception of Goods and Services AS Primirea Bunurilor si Serviciilor
A SE GRUPA CU
Primirea de bunuri și servicii, bunuri (nomenclatură)

12. Uneori, în loc să specificați un câmp într-o grupare, este util să includeți un parametru în câmpurile de selecție a interogării:
ALEGE DocGoods.Nomenclatura, &Contractant, &Perioadă, SUM(DocProducts.Quantity * DocProducts.K) AS Cantitate, SUM(DocProducts.Sum) AS Sum DIN Document.Receipt.Goods AS DocGoods UNDE DocProducts.Link = &Link
A SE GRUPA CU DocProducts.Nomenclatură
Și apoi setați parametrul în corpul cererii:
Query.SetParameter("&Cont", SelectAccount);
Query.SetParameter("&Period", Data);

13. În interogările universale, parametrii pot fi utilizați în descrierea surselor de date de interogare, în condiții UNDE,în condițiile de conectare la tabel și setările tabelului virtual. Există două tehnici pentru a crea interogări generice:
A) folosind mecanismul de concatenare a șirurilor de caractere, adăugarea de variabile la textul interogării;
Exemplul 1:

OrderType = ?(SOMEVARIABLE,"","DESC");
Query.Text = "Selectați... Comandă Software Field1 " + OrderingType + "...";
Exemplul 2:
Query.Text = "Selectați Câmp1...";

Dacă UNEVAVARIABIL = 1 Atunci
Request.Text = Request.Text + ",Field2 ...";
EndIf;
B) utilizați parametrii în diferite părți ale interogării (de exemplu, în secțiunea surse de date a interogării), apoi metoda limbajului încorporat - STREPLACE(). Când se proiectează interogări generice, este util să se facă referire la o proprietate a obiectelor METADATE(), cu care puteți determina numele tabelului pentru un link (de exemplu, pentru un document va fi ceva de genul acesta - Link . METADATA().NAME), trecut printr-un parametru la o procedură universală.
Exemplu:
Alege
Doc.Nomenclatura,
...
DIN
&SomeDocTC AS DocTC
Și apoi setați parametrul în corpul solicitării
Query.Text = StrReplace(Query.Text, "&SomeDocTCH", "Document."+Link.Metadata().Name+".Goods");

Parametrii pot fi utilizați în condiții de interogare pentru a include o condiție opțională &Parametru SAU NU SomeProperty:
Query.SetParameter(“&Parameter”, “Account.Name="”Ivanov”””);
Cu un literal ADEVĂRAT puteți elimina anumite filtre din interogare
Query.SetParameter("&Parametru", True);

14. Foarte utilă în designerul de interogări este comanda meniului contextual al tabelului - " Redenumiți tabelul...", cu care puteți veni cu un nume generic pentru sursa de date. Pentru a crea interogări la tabele de același tip care sunt similare ca structură, este util ca al doilea tabel să copieze textul de interogare al primului tabel, mergeți la fereastra de proiectare de interogări și selectați elementul din meniul contextual al tabelului - Înlocuiește masa...și selectați al doilea tabel.

15. Când lucrați cu crearea de interogări imbricate în condițiile sau parametrii tabelelor virtuale ale designerului de interogări, se folosește tehnica de evidențiere a unui spațiu între paranteze, apoi elementul „Query Builder” apare în meniul contextual și la editare. o interogare imbricată, întreaga interogare între paranteze este selectată în condiție.
Exemplu de subinterogare:
Punctul B (Selectați nomenclatura...)

16. La proiectarea rapoartelor ACS în interogări de echilibrare a registrelor, este mai convenabil și mai corect să folosiți expresia ca parametru Perioadă AddKDate(EndPeriod(Perioad,DAY),SECOND,1), întrucât soldurile virtuale se obțin la începutul perioadei, fără a include ultima secundă. Recepția +1 secundă nu poate fi utilizată cu documente: conform noii metode de înregistrare a documentelor, soldurile de registru trebuie să fie primite pentru Perioada specificată de obiectul Limitare cu ora documentului inclusiv (și nu la data documentului +1 secundă! ), dar după vechea metodă de postare - la momentul documentului (și nu la data documentului!). Atunci când analizați cifrele de afaceri sau datele pentru o perioadă, este convenabil să adăugați un parametru cu tipul perioada standard(în acest caz nu este necesar să aduceți ultima intalnire interval la sfârșitul zilei). În câmpul standard „StartPeriod” în câmpul „Expresie” trebuie să scrieți „&Perioad.StartDate". Și pentru câmpul standard „EndPeriod” în câmpul „Expresie” scrieți „ &Period.EndDate". Asa de mult Informatii utile limbajul de interogare poate fi găsit nu în asistentul de sintaxă, ci în ajutorul complet al configuratorului 1C 8.2 (butonul F1)

17.Funcția de interogare Nul(este mai convenabil să scrieți versiunea în limba engleză EsteNull) este folosit în mod obișnuit pentru a scăpa de valorile nule pentru câmpurile de interogare numerică. În unele cazuri, de exemplu, o îmbinare completă a două tabele, funcția IsNull(Parametrul1,Parametrul2) poate înlocui cu succes designul ALEGERE CÂND... ATUNCI..ALTĂ....Sfârșit, când pentru un câmp valorile NULL pot fi atât în ​​primul tabel, cât și în al doilea (această construcție vă permite să obțineți o valoare non-Null pentru câmp). Dar trebuie să ne amintim că, spre deosebire de operatorul condiționat ALEGERE funcţie Nul aruncă tipul celui de-al doilea argument la tipul primului argument, care trebuie luat în considerare dacă tipurile de argumente sunt diferite!
Exemplu:
IsNull(Reg.Remainder,0)
IsNull(Doc.Item,Doc1.Nomenclatură)

18. Construcție condiționată ALEGERE există o sintaxă alternativă pentru cazul simplu de verificare a egalității față de o anumită valoare, dar nu este documentată:
Alegere expresie Când 1 Apoi „Cel mai mare” Când 2 Apoi „Mediu” Altfel „Inferior”

19.Operator de testare NULL Nul(Se recomandă utilizarea versiunii în limba engleză Este nul). Această construcție a apărut deoarece orice operație de comparare a două valori, dintre care cel puțin una este Nulă, este întotdeauna falsă. Scrie Unde Nume = Null gresit. Interesantă este și forma de negație a acestui operator Nu nul- greșit, dar corect Nu este nul sau formă Nu (Câmpul 1 este nul)- aceasta este o diferență semnificativă față de toți operatorii utilizați împreună cu operatorul He.

20. Formularul de operator este uneori util ÎN pentru a verifica dacă există o potrivire cu una dintre valorile enumerate.
Exemplu:
...Unde este produsul.Descrierea B ("Electrocasnice","Calculatoare")
Pentru directoare, formularul operator poate fi util ÎN verificări ierarhice de membru.
Exemplu:
...Unde este Nomenclatura ÎN IERARHIE (&Grup)
Operator ÎN adesea folosit pentru a verifica dacă o valoare este inclusă în rezultatul unei subinterogări.
Exemplu:
...Where Nomenclature.Reference In (Selectați Nomenclature.Reference...).
Într-o interogare imbricată, puteți accesa câmpurile interogării exterioare într-o condiție.
Exemplu:
// Selectați numele produselor care au fost prezente
// în facturi
ALEGE
Produse.Nume
DIN
Director.Nomenclator AS Bunuri
UNDE
Produse.Link B
(ALEGE
Bon de livrareCompoziție.Nomenclatură
DIN
Document.Invoice.Composition AS InvoiceContent
UNDE
InvoiceContent.Nomenclature = Bunuri.Referință)
Operațiune ÎN poate fi folosit cu matrice, liste de valori, tabele de valori, interogări imbricate. În acest caz, este posibil să se reducă condițiile
Sintaxă pentru subinterogare
(expresia1, expresia2,...,expresiaN) Către (Selectați expresia1, expresia2,...,expresiaN ...)
Sintaxa pentru tabelul de valori
(expresie1, expresie2,...,expresieN) În (&TK), unde primele N coloane sunt utilizate în tabelul cu valorile TK

20. Există o glumă pe internet despre cum continuă să se descurce generatorul de interogări STÂNGA alăturarea meselor (și schimbarea lor), indiferent de modul în care specificăm DREAPTA:
1C: Întreprinderii îi place „la stânga”.

21. Este convenabil să depanați interogări complexe în consola de interogări. Sunt multe dintre ele pe Internet. După depanarea unei interogări, aceasta poate fi copiată și există un buton minunat în constructorul de interogări " Cerere”, unde îl puteți lipi în aceeași formă și îl puteți salva (anterior era posibil doar să îl copiați în configurator și să formatați cererea folosind un caracter de întrerupere de linie). În fereastra care se deschide când faceți clic pe butonul „Solicitare”, puteți edita cererea și puteți vizualiza rezultatul execuției, ceea ce este destul de convenabil.

22. Când proiectați rapoarte ACS, trebuie să vă amintiți că, dacă trebuie să furnizați filtrarea după un anumit câmp, nu este necesar să adăugați un parametru la textul solicitării. Generatorul de interogări are o filă „ Compoziția datelor”, unde puteți adăuga parametri la condiții. În plus, la nivelul raportului ACS există o filă de condiții în care puteți adăuga condiții arbitrare și le puteți salva în setări rapide. În acest caz, condițiile vor fi universale (egalitate, inegalitate, apartenență, includere în listă etc.).

23. Când lucrați cu documente, uneori este necesar să adăugați sortarea după un câmp de tabel virtual MOMENT DE TIMP, dar asta e ghinion - în interogările imbricate, sortarea după acest câmp nu funcționează corect. Dansul cu tamburine ajută: sortarea după câmp virtual MOMENT DE TIMP se înlocuiește cu două feluri: după dată și după referință. De asemenea, puteți rezolva problema printr-un tabel temporar, transferând interogarea imbricată într-o interogare separată. Pentru multe versiuni, această caracteristică sau eroare nu a fost remediată.
Un exemplu de interogare care funcționează incorect care primește ultimul document postat pentru contrapartea specificată (sau, mai degrabă, partea tabelară a documentului):

ALEGE
Produse consumabile.Link,
ConsumablesGoods.LineNumber,
Bunuri consumabile, bunuri,
Bunuri consumabile Cantitate,
Bunuri consumabile. Preț,
Consumabile Mărfuri.Sumă
DIN

UNDE
Produse consumabile. Link In
(ALEGE PRIMUL 1
D.Link
DIN
Document.Cheltuieli AS D
UNDE
D. Link. Realizat

COMANDĂ DE D.Ref.TimeDOWN)

Solutii posibile:
A) Înlocuiți cu FILTREAZĂ DUPĂ pe
COMANDA PENTRU D.DATA DESC
COMANDĂ DE D.Referință DESC

B) Puteți muta interogarea imbricată într-un tabel temporar:
SELECTAȚI ÎNTÂI 1
D.Link
APLICAȚI TKLink
DIN
Document.Cheltuieli AS D
UNDE
D. Link. Realizat
AND D.Contractor = &Contractant

FILTREAZĂ DUPĂ
E.Ref.TimeDOWN
;

////////////////////////////////////////////////////////////////////////////////
ALEGE
Produse consumabile.Link,
ConsumablesGoods.LineNumber,
Bunuri consumabile, bunuri,
Bunuri consumabile Cantitate,
Bunuri consumabile. Preț,
Consumabile Mărfuri.Sumă
DIN
Document.Consumable.Goods AS ConsumableGoods
UNDE
Produse consumabile. Link In
(ALEGE
T.Link
DIN
TZLink AS T)
C) Vă puteți referi la tabelul principal al documentului și abia apoi la partea tabulară
SELECTAȚI ÎNTÂI 1
Consumabile.Link,
Bunuri consumabile.(
Legătură,
Numărul de linie,
Produs,
Cantitate,
Preț,
Sumă
)
DIN
Document.Cheltuieli AS Cheltuieli
UNDE
Consumable.Contractor = &Contractant
Și Consumabile.Efectuat

FILTREAZĂ DUPĂ
Consumabile.Momentul timpului ÎN DESCĂCERE

24. Când te referi la tabelul principal al documentului (cartea de referință), te poți referi la datele tabelului subordonat (secțiunea tabelară) din condiție. Această posibilitate se numește dereferențierea câmpurilor tabulare. Ca exemplu de sarcină, putem cita sarcina de căutare a documentelor care conțin un anumit produs în secțiunea tabelară.
Exemplu:
Selectați Chitanță.Referință FROM Document.Chitanță Unde Chitanță.Marfa.Nomenclatură = &Nomenclatură.

Avantajul acestei interogări față de interogarea din tabelul imbricat Receipt.Products este că, dacă există duplicate în documente, rezultatul interogării va returna doar documente unice fără a utiliza cuvântul cheie. VARIAT.
Comparaţie:
Selectați Diverse Bunuri.Referință FROM Document.Incoming.Goods ca Bunuri unde Bunuri.Nomenclatură = &Nomenclatură.
Acest loc este probabil totul. Este clar că există încă multe întrebări în limbajul de interogare pe care nu le-am acoperit. Pentru a scrie articolul, am folosit informațiile pe care le-am primit după finalizarea cursului de bază 1C 8.2 spec8.ru, precum și din cartea „1C 8.2 Developer’s Guide” și pe Internet.
Mulțumiri tuturor!