Crearea și lucrul cu solicitări (pentru începători). Crearea și lucrul cu cereri (pentru începători) 1s 8.3 dacă într-o solicitare

Programarea 1C constă în mai mult decât scrierea unui program. 1C este un lingot de acțiuni ale utilizatorului și date cu care lucrează.

Datele sunt stocate într-o bază de date. Interogările 1C sunt o modalitate de a prelua date dintr-o bază de date pentru a le arăta utilizatorului într-un formular sau pentru a le procesa.

Partea fundamentală a raportului este cererea 1C. În cazul unui raport, ACS este cea mai mare parte a raportului.

Aşezaţi-vă. Ia o pauza. Calma. Acum o să vă spun vestea.

Pentru a programa în 1C, nu este suficient să cunoașteți limbajul de programare 1C. De asemenea, trebuie să cunoașteți limbajul de interogare 1C.

Limbajul de interogare 1C este un limbaj complet separat care ne permite să specificăm ce date trebuie să obținem din baza de date.

El este și bilingv - adică poți scrie în rusă sau engleză. Este extrem de asemănător cu limbajul de interogare SQL și cei care îl cunosc se pot relaxa.

Cum sunt utilizate cererile 1C

Când un utilizator lansează 1C în modul Enterprise, nu există niciun gram de date în clientul care rulează. Prin urmare, atunci când trebuie să deschideți un director, 1C solicită date din baza de date, adică face o cerere 1C.

Interogările 1C sunt:

  • Interogări automate 1C
    Generat automat de sistem. Ați creat un formular de listă de documente. S-a adăugat o coloană. Aceasta înseamnă că atunci când deschideți acest formular în modul Enterprise, va exista o interogare și datele pentru această coloană vor fi solicitate.
  • Interogări semi-automate 1C
    Există multe metode (funcții) în limbajul 1C, atunci când este accesat, se face o interogare la baza de date. De exemplu.GetObject()
  • Interogări manuale 1C (scrise de programator special ca interogare)
    Puteți scrie singur o solicitare 1C în cod și o puteți executa.

Crearea și executarea interogărilor 1C

O solicitare 1C este textul real al cererii în limba de solicitare 1C.
Textul poate fi scris cu pixuri. Adică ia-l și scrie-l (dacă știi această limbă).

Deoarece 1C promovează conceptul de programare vizuală, unde se poate face mult sau aproape totul fără a scrie codul manual, există un obiect special Query Constructor care vă permite să desenați textul unei interogări fără a cunoaște limbajul de interogare. Cu toate acestea, miracolele nu se întâmplă - pentru aceasta trebuie să știți cum să lucrați cu constructorul.

Odată ce textul cererii 1C este gata, acesta trebuie să fie executat. În acest scop există un obiect în codul 1C Request(). Iată un exemplu:

Solicitare = Solicitare nouă();
Query.Text = „SELECT
| Nomenclatură.Link
|DIN
| Director.Nomenclatura AS Nomenclatura
|UNDE
| Nomenclatură.Serviciul";
Selectare = Query.Run().Select();

Raport (Selection.Link);
EndCycle;

După cum puteți vedea în exemplu, după executarea cererii 1C, rezultatul vine la noi și trebuie să-l procesăm. Rezultatul este unul sau mai multe rânduri ale tabelului (într-o formă specială).

Rezultatul poate fi încărcat într-un tabel obișnuit:
Preluare = Query.Run().Unload(); //Rezultat – tabel de valori

Sau pur și simplu ocolește rând cu rând.
Selectare = Query.Run().Select();
While Select.Next() Loop
//Fă ceva cu rezultatele interogării
EndCycle;

Lucrul cu solicitări 1C

Principiile de bază ale interogărilor 1C

Principii de bază ale construirii unei cereri 1C -
SELECTAȚI Lista câmpurilor din Titlul tabelului WHERE Condiții

Un exemplu de construire a unei astfel de cereri 1C:

ALEGE
//lista de câmpuri de selectat
Legătură,
Nume,
Cod
DIN
//numele tabelului din care selectăm datele
//lista de tabele este o listă de obiecte din fereastra configuratorului
Director.Nomenclatură
UNDE
//indică selecția
Tip produs = &Serviciu //selectare după valoare externă
Sau Serviciu // Atributul „Service” de tip Boolean, selecție după valoare True
FILTREAZĂ DUPĂ
//Triere
Nume

Lista tabelelor 1C

Puteți vedea numele tabelelor în fereastra configuratorului. Trebuie doar să scrieți „Directoar” în loc de „Directoare”, de exemplu „Directoar.Nomenclatură” sau „Document.Vânzări de bunuri și servicii” sau „Registrul de acumulare.Vânzări”.

Există tabele suplimentare (virtuale) pentru registre care vă permit să obțineți numerele finale.

Informații Register.RegisterName.Last Slice(&Date) – Solicitare 1C din registrul de informații, dacă este periodic, pentru o anumită dată

Registrul de acumulare.Nume registru.Solduri(&Data) – Solicitare 1C din registrul soldurilor pentru o anumita data

Registrul de acumulare. Nume registru. Cifra de afaceri (&Data de începere, &Data de încheiere) – Solicitare 1C din registrul cifrei de afaceri pentru perioada de la data de început până la data de încheiere.

Principii suplimentare

Când solicităm o listă cu unele date, principiile de bază funcționează. Dar putem solicita și numere și solicitarea le poate număra pentru noi (adăugați-le, de exemplu).

ALEGE
//Quantity(FieldName) – numără cantitatea
//Field AS OtherName – redenumește câmpul
Cantitate (Link) AS Cantitatea de documente postate
DIN

UNDE
Dirijată

Această solicitare 1C ne va returna numărul total de documente. Cu toate acestea, fiecare document are un câmp Organizație. Să presupunem că vrem să numărăm numărul de documente pentru fiecare organizație folosind o interogare 1C.

ALEGE
//doar un câmp de document
Organizare,
//numărați cantitatea
Cantitate(Link) AS CantitateBy Organizations
DIN
Document.Vânzări de Bunuri și Servicii
UNDE
Dirijată
A SE GRUPA CU

Organizare

Această solicitare 1C ne va returna numărul de documente pentru fiecare organizație (numită și „pe organizație”).

Să calculăm suplimentar suma acestor documente folosind o solicitare 1C:

ALEGE
//doar un câmp de document
Organizare,
//numărați cantitatea

//numărați suma

DIN
Document.Vânzări de Bunuri și Servicii
UNDE
Dirijată
A SE GRUPA CU
//trebuie folosit dacă lista de câmpuri are o funcție count() și unul sau mai multe câmpuri în același timp - atunci trebuie să grupați după aceste câmpuri
Organizare

Această solicitare 1C ne va returna și cantitatea de documente.

ALEGE
//doar un câmp de document
Organizare,
//numărați cantitatea
Cantitate(Link) AS CantitateBy Organizations,
//numărați suma
Amount(DocumentAmount) AS Sumă
DIN
Document.Vânzări de Bunuri și Servicii
UNDE
Dirijată
A SE GRUPA CU
//trebuie folosit dacă lista de câmpuri are o funcție count() și unul sau mai multe câmpuri în același timp - atunci trebuie să grupați după aceste câmpuri
Organizare
REZULTATE PO General

Limbajul de interogare 1C este extins și complex și nu vom lua în considerare toate capacitățile sale într-o lecție - citiți următoarele lecții.

Pe scurt despre caracteristicile suplimentare ale limbajului de interogare 1C:

  • Unirea datelor din mai multe tabele
  • Interogări imbricate
  • Solicitare lot
  • Crearea propriilor tabele virtuale
  • Interogare din tabelul de valori
  • Utilizarea funcțiilor încorporate pentru obținerea și manipularea valorilor.

1C Query Builder

Pentru a nu scrie manual textul cererii, există un designer de solicitări 1C. Doar faceți clic dreapta oriunde în modul și selectați 1C Query Designer.

Selectați tabelul dorit din stânga în designerul de interogări 1C și trageți-l la dreapta.

Selectați câmpurile necesare din tabel în designerul de interogări 1C și trageți spre dreapta. Dacă doriți nu numai să selectați un câmp, ci să îi aplicați un fel de funcție de însumare, după glisare, faceți clic pe câmp de două ori cu mouse-ul. În fila Grupare, va trebui apoi să selectați (trageți) câmpurile necesare pentru grupare.

Pe fila Condiții din designerul de interogări 1C, puteți selecta selecțiile necesare în același mod (prin tragerea câmpurilor prin care veți face selecția). Asigurați-vă că selectați condiția corectă.

În fila Comandă este indicată sortarea. Pe fila Rezultate – însumând rezultatele.

Folosind designerul de interogări 1C, puteți studia orice interogare existentă. Pentru a face acest lucru, faceți clic dreapta pe textul unei cereri existente și selectați, de asemenea, 1C query designer - iar cererea va fi deschisă în 1C query designer.

Limbajul de interogare 1C 8 este un instrument indispensabil pentru un programator 1C; vă permite să scrieți cod mai concis, simplu și ușor de înțeles și să utilizați mai puține resurse de sistem atunci când lucrați cu date. Acest articol deschide o serie de lecții dedicate limbajului de interogare 1C 8. În prima lecție ne vom uita la structura operatorului principal al acestui limbaj - ALEGE. Folosind acest operator, puteți crea selecții din tabelele bazei de date. Datele de tabel selectate pot fi sortate, condițiile plasate pe el, legate și combinate cu datele din alte tabele, grupate pe diferite câmpuri și multe altele.

Limbajul de interogare 1C întreprindere 8 - Structura operator SELECT

Să ne uităm la structura operatorului SELECT (părțile opționale ale operatorului sunt indicate între paranteze drepte). Limbajul de interogare 1C oferă o gamă largă de instrumente pentru crearea de mostre de date.

SELECTAȚI [PERMIS] [DIFERENT] [PRIMUL A] [Câmp1] [CA Alias1], [Câmp2] [AS Alias2], ... [CâmpM] [AS AliasB] [PUNERET TemporaryTableName] [FROM Table1 AS AliasTableTable1 [[INNER JOIN ][LEFT JOIN][FULL JOIN] Table2 AS Alias ​​​​Table2 [[INNER JOIN][LEFT JOIN][FULL JOIN] TableC AS Alias ​​​​TablesC BY Expression1 [Și Expression2]...[Și ExpressionD]] .. . ... BY Expression1 [Și Expression2]...[Și ExpressionE]] ... [TableF AS TableF Alias] ... ] [GROUP BY GroupingField1[,] ... [GroupingFieldG]] [WHERE Expression1 [ȘI Expresia2] ... [ȘI ExpresiaH]] [UNITE TOATE...] [; ...] [INDEX BY Alias1 ... AliasB] [TOTALS [AggregationFunction(Field1)][,] [AggregationFunction(Field2)][,] ... [AggregationFunction(FieldI)] BY [GENERAL][,] [ GroupingField1][,] ... [GroupingFieldj]]

Cuvinte cheie și blocuri pentru lucrul cu câmpuri

  • ALEGE— un cuvânt cheie care indică începutul operatorului;
  • PERMIS indică faptul că selecția ar trebui să includă înregistrări de tabel care au acces de citire pentru utilizatorul dat;
  • VARIAT indică faptul că eșantionul ar trebui să includă numai fluxuri diferite (în toate câmpurile). Cu alte cuvinte, rândurile duplicat vor fi excluse din eșantion;
  • PRIMUL A dacă specificați acest cuvânt cheie, atunci doar primul A dintre rândurile selectate de interogare va fi inclus în selecție, unde A este un număr natural;
  • Bloc de câmp— acest bloc indică câmpurile care trebuie incluse în selecție. Aceste câmpuri vor fi coloane selectate. În cel mai simplu caz, câmpul arată astfel: Table Alias.TableFieldName AS Field Alias

    În acest fel indicăm din ce tabel luăm acest câmp. Limbajul de interogare 1C vă permite să specificați orice alias, dar acestea nu trebuie repetate în aceeași instrucțiune SELECT. Un câmp poate fi mai complex, constând din diverse combinații de câmpuri de tabel, funcții de limbaj de interogare și funcții de agregare, dar nu vom acoperi acele cazuri în acest tutorial;

Cuvinte cheie și blocuri pentru lucrul cu tabele

  • PUT TemporaryTableName- cuvânt cheie LOC este destinat să creeze un tabel temporar cu un nume specific, care va fi stocat în RAM într-o anumită sesiune 1C 8 până când se încheie sau până când tabelul temporar este distrus. Trebuie remarcat faptul că numele tabelelor temporare dintr-o sesiune 1C 8 nu trebuie repetate;
  • Bloc de tabele și relații— blocul indică toate tabelele utilizate în această interogare, precum și relațiile dintre ele. Blocul începe cu un cuvânt cheie DIN, urmat de numele și alias-ul primului tabel. Dacă acest tabel este legat de alte tabele, atunci relațiile sunt indicate. Limbajul de interogare 1C conține următorul set de tipuri de conexiune:
    • INNER JOIN— o înregistrare din tabelul din stânga va fi inclusă în selecție numai dacă este îndeplinită condiția de conectare, o înregistrare din tabelul din dreapta va fi inclusă în selecție numai dacă condiția de conectare este îndeplinită;
    • CONEXIUNEA STÂNGA— o înregistrare din tabelul din stânga va fi inclusă în selecție în orice caz, o înregistrare din tabelul din dreapta va fi inclusă în selecție numai dacă condiția de conectare este îndeplinită;
    • CONEXIUNE COMPLETA— o înregistrare din tabelul din stânga va fi inclusă în selecție mai întâi în orice caz, apoi numai dacă este îndeplinită condiția de conectare, o înregistrare din tabelul din dreapta va fi inclusă în selecție mai întâi în orice caz, apoi numai dacă condiția de conectare este îndeplinită. În acest caz, rândurile duplicat rezultate sunt excluse din eșantion.

    După tipul de conexiune, sunt indicate numele și alias-ul celui de-al doilea tabel. Urmează cuvântul cheie DE, urmată de condițiile de comunicare conectate între ele de către operatori logici ȘI, SAU. Fiecare expresie din condiție trebuie să returneze o valoare booleană (adevărat, fals). Dacă primul tabel este conectat la alte tabele decât al doilea, atunci tipul de conexiune este din nou indicat și așa mai departe. Fiecare dintre tabelele care participă la conexiune, la rândul său, poate fi conectată la alte tabele, acest lucru este prezentat în diagrama structurii de interogare. Dacă tabelul nu este legat de primul, atunci este indicat fără un tip de conexiune, atunci conexiunile sale pot urma și așa mai departe;

Cuvinte cheie și blocuri de conversie a datelor

  • Bloc de grup— acest bloc este folosit pentru a grupa rânduri de tabel. Rândurile sunt combinate într-un singur dacă valorile câmpurilor specificate după cuvântul cheie A SE GRUPA CU se dovedesc a fi la fel. În acest caz, toate celelalte câmpuri sunt însumate, mediate, maximizate sau minimizate folosind funcții de agregare. Funcțiile agregate sunt utilizate într-un bloc de câmp. Exemplu: Maximum(TableAlias.TableFieldName) AS FieldAlias
  • Bloc de stare- în acest bloc după cuvântul cheie UNDE sunt indicate expresii condiționale separate prin operatori logici ȘI, SAU, pentru ca oricare dintre rândurile selectate să fie inclus în eșantion, este necesar ca toate condițiile din agregat să aibă o valoare Adevărat.
  • COMBINA TOTUL— acest cuvânt cheie este folosit pentru a combina interogări (operatori ALEGE). Limbajul de interogare 1C vă permite să combinați mai multe interogări într-una singură. Pentru ca interogările să fie îmbinate, acestea trebuie să aibă același set de câmpuri;
  • «;» - punctele și virgulă sunt folosite pentru a separa afirmațiile care sunt independente unele de altele ALEGE;
  • INDEX PRIN— cuvântul cheie este utilizat pentru indexarea câmpurilor specificate după el;
  • Bloc rezumat— folosit pentru a construi mostre asemănătoare copacilor. Pentru fiecare dintre câmpurile de grupare specificate după cuvântul cheie DE, un rând separat va fi creat în selecție. În această linie, folosind funcții agregate, se vor calcula valorile totale ale câmpurilor specificate după cuvântul cheie REZULTATE.

Doriți să continuați să învățați limbajul de interogare 1C 8? Apoi citește următorul articol.

Cerere . Text = "ALEGE | StorageUnits.Link |DIN | Directory.usStorageUnits CUM se folosescStorageUnits // Exemplul 1: comparație cu o valoare booleană goală: |UNDE | StorageUnits.AllowSelectionFromReserveZone = Fals // Exemplul 2. dar dacă acest boolean este definit, atunci este mai bine așa: // condiție pentru un boolean negativ: |UNDE | NU unități de depozitare. Permiteți selecția din zona de rezervă // Exemplul 3. selecție bazată pe condiția unui câmp gol care are tipul „director de un anumit tip” |UNDE | StorageUnits.ActiveSelectionArea = VALUE(Directory.usSelectionArea.EmptyRef) // Exemplul 3a. selecție bazată pe condiția unui câmp gol având tipul „document de un anumit tip” |UNDE | OurInformationRegister.Document = VALUE(Document.OurDocument.EmptyLink) // Exemplul 3b. selecție bazată pe condiția unui câmp gol având tipul „documente de diferite tipuri” ( câmp compozit) |UNDE | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyLink) | SAU OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyLink) | SAU... (etc. - listăm 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 | Unitate de stocare.Nume > """" // Exemplul 5. dacă trebuie să selectați documente de un anumit tip, cu un tip de date compus, de exemplu, în registrul „RunningTasks”, resursa „Task” are un tip compozit, printre valorile cărora documentul „Selectare” este posibil |UNDE | EXPRESS(Informații RegisterExecutedTasks.Task AS Document.Selection) LINK Document.Selection // Exemplul 5a. Un alt exemplu similar când trebuie să selectați documente de un anumit tip | ALEGEREA | CÂND SE EXPRIMĂ (ag Corespondența documentelor. DocumentBU AS Document. Recepția Bunurilor și Serviciilor) LINK Document. Recepția Bunurilor și Serviciilor | ATUNCI ""Recepția de bunuri și servicii"" | CÂND SE EXPRIMĂ (ag Corespondența documentelor. DocumentBU AS Document. Vânzări de bunuri și servicii) LINK Document. Vânzări de bunuri și servicii | APOI ""Vânzări de bunuri și servicii"" | ELSE """" | END AS Document View // 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 | RegProductsInRetail.MovementType = VALUE(MovementTypeAccumulation.Incoming) // Exemplul 8. Cum să indicați într-o solicitare că nu este nevoie să executați cererea (de exemplu, trebuie să returnați în mod programatic, în funcție de o anumită condiție, un rezultat al cererii necompletate - Request.Text = StrReplace(Request.Text, „UNDE Doc.Link = &DocumentLink” , „UNDE E MINCIUNEA”);). Pentru a face acest lucru, trebuie doar să adăugați condiția „Unde este fals”. Apropo, indiferent de volumul de date solicitat în eșantion, o astfel de solicitare va fi executată instantaneu. |UNDE E MINCIUNA // Exemplul 9. Verificarea dacă rezultatul interogării conține date: Dacă nuCerere.A executa().Gol() Apoi // Exemplul 10. selecție bazată pe o dată goală: |UNDE | tbStrings.CancellationDate = DATETIME(1, 1, 1)

În acest articol dorim să discutăm totul cu tine Funcții de limbaj de interogare 1C, și constructele limbajului de interogare. Care este diferența dintre funcție și design? Funcția este apelată cu paranteze și posibili parametri în ele, iar constructul este scris fără paranteze. Fara indoiala toate structurile și funcțiile limbajului de interogare 1C face procesul de achiziție a datelor flexibil și multifuncțional. Aceste funcții și constructe se aplică câmpurilor de solicitare, iar unele se aplică și condițiilor.

1C Funcții limbaj de interogare

Pentru că o descriere clară Funcții de limbaj de interogare 1C este mult mai puțin frecventă decât descrierile structurilor, am decis să începem să ne uităm la funcții. Acum să ne uităm la fiecare separat, descriindu-i scopul, sintaxa și exemplul de utilizare, deci:

1. Funcţie DATA ORA- această funcție creează un câmp constant cu tipul „Date”.

Sintaxă: DATA ORA(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Exemplu de utilizare:

2. Funcția DATE DIFERENTĂ- returnează diferența dintre două date într-unul dintre dimensiuni (an, lună, zi, oră, minut, secundă). Măsurarea este trecută ca parametru.

Sintaxă: DIFERENCEDATE(<Дата1>, <Дата2>, <Тип>)

Exemplu de utilizare:

Query.Text = „SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Qty.Days”;

3. Funcția VALUE- setează un câmp constant cu o înregistrare predefinită din baza de date; puteți obține și un link gol de orice tip.

Sintaxă: VALUE(<Имя>)

Exemplu de utilizare:

Request.Text = „SELECT //element predefinit | VALUE(Directory.Currencies.Dollar) AS Dollar, //link gol | VALUE(Document.Receipt of Goods and Services.EmptyLink) AS Receipt, //transfer value | VALUE(Transfer . Persoană fizică juridică. Persoană fizică) AS Persoană fizică, //cont predefinit | VALUE(Planul de conturi. Autoportant. Materiale) AS Account_10" ;

4. Funcția SELECT- avem în fața noastră un analog al construcției IF, care este folosit în cod, doar acesta este folosit în interogările 1C.

Sintaxă: ALEGERE CÂND<Выражение>APOI<Выражение>IN CAZ CONTRAR<Выражение>Sfârşit

Exemplu de utilizare:

Solicitare.Text = //dacă suma este mai mare de 7500, atunci ar trebui să existe o reducere de 300 de ruble, //deci dacă condiția este declanșată, funcția //returnează Suma - 300 //în caz contrar, cererea va returna pur și simplu Sumă „SELECT | SELECT | WHEN TTCReceipts.Amount > 7500 | THEN TTCReceipts.Amount - 300 | ELSE TTCReceipts.Amount | END AS AmountWithDiscount |FROM | Document.Receipt of GoodsServices.Goods AS TTCReceipts”;

5. Funcția EXPRESS- vă permite să exprimați un câmp constant cu un anumit tip.

Sintaxă: EXPRESS(FieldName AS TypeName)

Exemplu de utilizare:

Query.Text = "SELECT VARIOUS | Sales.Registrar.Number, | SELECT | WHEN Sales.Registrar LINK Document.Consumable | THEN EXPRESS(Sales.Registrar AS Document.Consumable) | ELSE SELECT | WHEN Sales.Registrar LINK Document.Implementation | THEN EXPRESS(Sales.Registrar AS Document.Implementation) | END | ... | END AS Număr | FROM | RegisterAcumulations.Purchases AS Purchase";

Există o altă opțiune pentru utilizarea funcției EXPRESS în câmpuri de tipuri mixte, unde apar acestea? Cel mai simplu exemplu este „Registrul” pentru orice registru. Deci, de ce ar trebui să calificăm tipul în registrator? Să luăm în considerare situația când selectăm câmpul „Număr” de la registrator, din ce tabel va fi selectat numărul? Răspunsul corect al tuturor! Prin urmare, pentru ca interogarea noastră să funcționeze rapid, ar trebui să specificăm un tip explicit folosind funcția EXPRESS

Exemplu de utilizare:

Query.Text = "SELECT | EXPRESS(Nomenclature.Comment AS Line(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Directory.Nomenclature AS Nomenclature";

6. Funcția ISNULL(ortografie alternativă ISNULL) - dacă câmpul este de tip NULL, atunci se înlocuiește cu al doilea parametru al funcției.

Sintaxă: ISNULL(<Поле>, <ПодставляемоеЗначение>)

Exemplu de utilizare:

De asemenea, rețineți că este recomandabil să înlocuiți ÎNTOTDEAUNA tipul NULL cu o anumită valoare, deoarece comparația cu tipul NULL returnează întotdeauna FALSE chiar dacă comparați NULL cu NULL. Cel mai adesea, valorile NULL sunt formate ca urmare a îmbinării tabelelor (toate tipurile de îmbinări, cu excepția celor interne).

Query.Text = //Selectați întregul articol și soldurile acestuia //dacă nu există sold într-un articol, atunci va exista un câmp //NULL care va fi înlocuit cu valoarea 0 "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) AS Rest | FROM | Directory.Nomenclature AS Nr. | LEFT CONNECTION Înregistrați acumulări. BunuriÎnDepozite. Rămășite AS BunuriÎnDepoziteRemains | ON (GoodsInWarehousesRemains. Nomenclatură)"; = No.

7. Funcția REPREZENTARE- vă permite să obțineți o reprezentare a câmpului de solicitare.

Sintaxă: PERFORMANŢĂ(<НаименованиеПоля>)

Exemplu de utilizare:

Query.Text = "SELECT | REPRESENTATION(FreeRemainingRemains.Nomenclature) AS Nomenclature, | REPRESENTATION(FreeRemainingRemaining.Warehouse) AS Warehouse, | FreeRemainingRemaining.InStockRemaining |FROM |Acumulation Register.FreeRemaining AS FreeRemaining;Remaining"

Construcții în limbajul de interogare 1C

Am discutat cu tine mai sus Funcții de limbaj de interogare 1C, acum este timpul să luați în considerare constructe în limbajul de interogare 1C, nu sunt mai puțin importante și utile, să începem.

1. Constructii LINK- este un operator logic pentru verificarea unui tip de referință. Cel mai des întâlnit la verificarea unui câmp de tip complex cu un anumit tip. Sintaxă: LEGĂTURĂ<Имя таблицы>

Exemplu de utilizare:

Solicitare.Text = //dacă tipul de valoare înregistrator este document Recepție, //atunci interogarea va returna „Recepție de mărfuri”, în caz contrar, „Vânzări de mărfuri” „SELECT | SELECT | WHEN Remainings.Registrar LINK Document.Receipt of Goods and Servicii | ATUNCI ""Chitare"" | ALTA ""Consum"" | END AS Tip de miscare | DIN | Registrul de acumulare. Produse ramase in depozite AS Resturi" ;

2. Design INTRE- acest operator verifică dacă valoarea se află în intervalul specificat.

Sintaxă: ÎNTRE<Выражение>ȘI<Выражение>

Exemplu de utilizare:

Request.Text = //obține întreaga nomenclatură al cărei cod este în intervalul de la 1 la 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. Construcția B și B IERARHIE- verificați dacă valoarea se află în lista transferată (matricele, tabelele de valori etc. pot fi transferate ca listă). Operatorul ÎN IERARHIE vă permite să vizualizați ierarhia (un exemplu de utilizare a Planului de conturi).

Sintaxă: ÎN(<СписокЗначений>), ÎN IERARHIE(<СписокЗначений>)

Exemplu de utilizare:

Solicitare.Text = //selectați toate subconturile contului „SELECT | Auto-susținut. Link AS Account | FROM | Plan de conturi. Auto-susținut AS Auto-susținut | WHERE | Auto-susținător. Link ÎN VALOAREA IERARHIEI (Graficul de Conturi. Autoportante. Bunuri)";

4. Design similar- Această funcție ne permite să comparăm un șir cu un model de șir.

Sintaxă: LIKE "<ТекстШаблона>"

Opțiuni de model de rând:

% - o secvență care conține orice număr de caractere arbitrare.

Un personaj arbitrar.

[...] - orice caracter unic sau secvență de caractere enumerate între paranteze drepte. Enumerarea poate specifica intervale, de exemplu a-z, adică un caracter arbitrar inclus în interval, inclusiv capetele intervalului.

[^...] - orice caracter unic sau secvență de caractere enumerate între paranteze drepte, cu excepția celor enumerate după semnul de negație.

Exemplu de utilizare:

Interogare.Text = //găsiți întreaga nomenclatură care conține rădăcina TABUR și începe //fie cu litera mică sau majusculă t „SELECT | Nomenclatură. Link | FROM | Director. Nomenclatura AS Nomenclatură | WHERE | Produse. Nume LIKE "" [Tt ]abur%""" ;

5. Design PERMIS- acest operator vă permite să selectați doar acele înregistrări din baza de date pentru care apelantul are permisiunea de citire. Aceste drepturi sunt configurate la nivel de înregistrare (RLS).

Sintaxă: ALLOWED este scris după cuvântul cheie SELECT

Exemplu de utilizare:

Request.Text = "SELECTARE PERMIS | Contrapartide. Link | DIN | Director. Contrapartide AS Contrapartide";

6. Design DIVERSE- vă permite să selectați înregistrări în care nu există înregistrări duplicat.

Sintaxă: VARIOUS este scris după cuvântul cheie SELECT

Exemplu de utilizare:

Request.Text = //selectează înregistrările la care cititorul are drepturi „SELECT VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties” ;

De asemenea, construcția VARIOUS poate fi folosită cu operatorul PERMIS și alți operatori.

Exemplu de utilizare:

Request.Text = //selectează diverse înregistrări la care cititorul are drepturi „SELECT ALLOWED VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties”;

7. Design FIRST- selectează numărul de înregistrări specificat în parametru din rezultatul interogării.

Sintaxă: FIRST<число>

Exemplu de utilizare:

Solicitare.Text = //selectați primele 4 numere CCD din directorul "SELECT FIRST 4 | Numere CCD. Link | FROM | Director. Numere CCD AS Numere CCD";

8. Design PENTRU SCHIMBARE- vă permite să blocați un tabel, funcționează numai în tranzacții (relevant doar pentru blocările automate).

Sintaxă: PENTRU SCHIMBARE<НаименованиеТаблицы>

Exemplu de utilizare:

Query.Text = "SELECT | Resturi libere. Nomenclator, | Resturi libere. Depozit, | Resturi libere. În stoc rămase | DIN | Registrul acumulărilor. Resturi libere. Rămășii ca resturi libere | PENTRU SCHIMBARE | Registrul acumulărilor. . Resturi libere. Resturi";

9. Design COMANDA DE- organizează datele după un anumit câmp. Dacă câmpul este un link, atunci când setați steag COMANDĂ AUTOMATĂ Sortarea va avea loc prin reprezentarea link-ului; dacă steag-ul este dezactivat, atunci link-urile sunt sortate după vechimea adresei link-ului din memorie.

Sintaxă: FILTREAZĂ DUPĂ<НаименованиеПоля>COMANDĂ AUTOMATĂ

Exemplu de utilizare:

Query.Text = "SELECT | Resturi libere. Nomenclator AS Nomenclator, | Resturi libere. Depozit AS Depozit, | Resturi libere. În stoc rămas | DIN | Înregistrați acumulări. Resturi libere. Rămase AS Resturi libere rămase BY | | Nomenclatură | RECUPERAREA COMANDĂ AUTOMATĂ”;

10. Design GROUP BY- folosit pentru gruparea șirurilor de interogări după anumite câmpuri. Câmpurile numerice trebuie utilizate cu orice funcție de agregare.

Sintaxă: A SE GRUPA CU<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Exemplu de utilizare:

Query.text = "SELECT | ProductsInWarehouses.Nomenclature as Nomenclature, | ProductsInwarehouses.warehouse, | sum (GoodSinwarehouses.Instock) ca instank | de la | RegisterAccumulations.ProductsinwareHouses as ProductSinwarehouses | ;

11. Design AVÂND- vă permite să aplicați o funcție agregată unei condiții de selecție a datelor, similară construcției WHERE.

Sintaxă: AVÂND<агрегатная функция с условием>

Exemplu de utilizare:

Query.Text = //selectează înregistrările grupate în care câmpul InStock este mai mare de 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.Stocks AS | ItemsInStocks AS | GROUP BY | ProductsInWarehouses.Nomenclature, | ProductsInWarehouses.Warehouse | | DISPONIBIL | SUMĂ(ProductsInWarehouses.InStock) > 3" ;

12. Constructii INDEX BY- folosit pentru indexarea câmpului de interogare. O interogare cu indexare durează mai mult, dar accelerează căutarea prin câmpurile indexate. Poate fi folosit doar în mesele virtuale.

Sintaxă: INDEX PRIN<Поле1, ... , ПолеN>

Exemplu de utilizare:

Query.Text = „SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";

13. Design UNDE- vă permite să impuneți o condiție oricăror câmpuri de selecție. Rezultatul va include numai înregistrările care îndeplinesc condiția.

Sintaxă: UNDE<Условие1 ОператорЛогСоединения УсловиеN>

Exemplu de utilizare:

Query.Text = //toate înregistrările cu CompensationRemaining sunt selectate<>0 și //AmountForCalcCompRemaining > 100 „SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |Place Data Compensation.RPORemains.RPORemains.Accumulation.RPA | |UNDE |CompensationRPORremaining.CompensationRemaining<>0 | Și CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. Design REZULTATE... GENERAL- folosit pentru calcularea totalurilor; proiectul specifică câmpurile prin care vor fi calculate totalurile și funcțiile de agregare aplicate câmpurilor totale. Când se folosesc totaluri pentru fiecare câmp după construcția TOTAL, datele sunt grupate. Există o construcție GENERAL opțională; utilizarea sa oferă și grupări suplimentare. Veți vedea un exemplu de rezultat al cererii mai jos.

Sintaxă: REZULTATE<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>DE<ОБЩИЕ> <Поле1, ... , ПолеN>

Exemplu de utilizare:

Solicitare.Text = "SELECTARE | Calcule. Contract de contrapartidă. Tip de acord AS Tip de contract, | Calcule. Contract de contraparte AS Contract, | Calcule. Contraparte, | Calcule. Valoarea soldului decontării reciproce AS Sold | FROM | Registrul de acumulări. Mutual Decontare CU Contrapărțile. Solduri AS Calcule | TOTAL | SUMA (Sold) |Software | GENERAL, | Tip de acord";

Figura conturează grupările care s-au format în timpul executării cererii, cea de sus se referă la secțiunea GENERAL, iar cea de-a doua la câmpul Counterparty Agreement Agreement Type.

În acest articol vom examina subiectul tabelelor imbricate în limbajul de interogare 1C.

Puteți utiliza un tabel sursă de interogare imbricat în câmpurile de selectare a interogării. De exemplu, documentul „Furnizare de servicii” are o parte tabelară de Servicii și, astfel, această parte tabelară poate fi afișată și în câmpul de selecție. Acum veți vedea cum poate fi implementat acest lucru.

În baza mea de date de antrenament, voi lansa consola de interogări, voi deschide designerul de interogări și voi selecta tabelul „Furnizare de servicii”.

Să extindem acest tabel

Și în ea vedem partea tabulară „Servicii”.

Să selectăm toată această parte a tabelului.

După cum puteți vedea, întreaga parte tabelară a serviciului a intrat complet în câmpuri.

Vă rugăm să rețineți că partea tabelară, de fapt, vine ca un câmp separat numit „Servicii” și al cărui tip va fi „Rezultatul solicitării”. Să învățăm cum să folosim un tabel imbricat într-o interogare.

Să lăsăm trei câmpuri din tabelul imbricat și să adăugăm câteva câmpuri din antetul documentului.

Să facem clic pe OK în designer și să vedem cum va arăta cererea noastră.

După cum puteți vedea, în cerere există un punct după câmpul „Servicii”, iar câmpurile selectate sunt enumerate între paranteze după acesta.

Să îndeplinim cererea.

În figură vedem că toate câmpurile selectate din partea tabelară a documentului sunt listate separate prin virgule în câmpul „Servicii”. Nu toate consolele de interogare au un afișaj ca cel din figura de mai sus; uneori se poate spune doar „”.

Un alt punct interesant: într-un tabel imbricat puteți pune un asterisc în loc de câmpuri, apoi vor apărea toate câmpurile părții tabelare. Acest lucru nu se poate face în constructor, ci doar manual în cerere. Cererea va avea următoarea formă:

Să vedem cum va fi executată o astfel de cerere.

Singurul lucru este că acest asterisc nu va fi salvat dacă deschidem constructorul de interogare.

Am învățat cum să facem o interogare cu un tabel imbricat în consolă, acum vom învăța cum să folosim un tabel imbricat într-o selecție

În realitate, nu este atât de dificil să accesezi un tabel imbricat atunci când procesezi o interogare. Pur și simplu accesați selecția după numele tabelului și obțineți o variabilă cu tipul „Rezultatul interogării”. Și apoi îl procesezi ca rezultat normal al unei cereri: dacă vrei, obține o mostră, dacă vrei, încarcă.

Mai jos este un mic exemplu de cod care funcționează cu un tabel imbricat:


&Pe server
Procedura FillOnServer()
Solicitare = Solicitare nouă;
Cerere. Text = "ALEGE
| Vânzarea produsului. Link,
| Vânzarea Produselor.(
| Produs,
| Cantitate
|DIN
| Document. Vânzarea produselor CUM SE Vând produse"
;
Preluare = Interogare. Alerga(). Alege();
Pa selecție. Buclă Next()
TopLine of the Tree = Vânzarea de produse. GetItems();
NewRow = TopRowTree. Adăuga();
Linie nouă. Link = Selectie. Legătură;
TableProducts = Selecție. Bunuri;
SelectionProducts = TableProducts. Alege();
În timp ce selecția produselor. Buclă Next()
TreeChildRow = NewRow. GetItems();
ProductRow = ChildTreeRow. Adăuga();
ProductString. Link = Selectarea produsului. Produs;
ProductString. Cantitate = SampleItems. Cantitate ;
EndCycle;
EndCycle;
Sfârșitul procedurii

Lasă-mă să explic codul de mai sus.

În primul rând, avem o selecție liniară și parcurgem această selecție într-o buclă, în care creăm linia superioară a arborelui de valori (este pe formular) și scriem un link către documentul nostru în ea.

Și apoi cel mai interesant lucru, puteți chiar să îl priviți mai târziu în depanator, ne întoarcem la câmpul de selecție a produselor și, pentru comoditate, scrieți acest câmp într-o variabilă separată în TableProducts. Această variabilă este de tipul „Rezultatul interogării”. Și puteți obține cu ușurință o mostră a acestui rezultat. Asta facem. Rămâne să ocoliți această selecție folosind următoarea funcție și bucla while.

Și în interiorul acestei bucle ne vom referi la câmpurile de selecție ca câmpuri ale unui tabel imbricat și le vom scrie în rândurile secundare ale arborelui din formular.

Acesta este rezultatul pe care îl va returna acest cod

Mai ai întrebări?

Le vei răspunde singur când vei studia cursul meu „Interogări în 1C pentru începători”. Unde acestea și multe alte probleme sunt discutate mai detaliat. Toate informațiile sunt oferite într-o formă simplă și accesibilă și sunt de înțeles chiar și pentru cei care nu sunt deosebit de familiarizați cu programarea în 1C.

Cod promoțional pentru 20% reducere: hrW0rl9Nnx

Sprijină-mi proiectul donând orice sumă

Alăturați-vă grupurilor mele.