La cerere 1s. Caracteristici de lucru cu câmpul Reprezentare și funcția Reprezentare() a limbajului de interogare. Operatorii de alegere sunt nuli

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

O altă diferență interesantă este sintaxa rusă. Deși de fapt poți folosi construcții englezești.

Exemplu de solicitare:

ALEGE
Banci.Nume,
Bănci.Cont corect
DIN
Director.Bănci AS Bănci

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

Limbajul de interogare este cel mai simplu și mai eficient mod de a obține informații. După cum puteți vedea din exemplul de mai sus, în limbajul de interogare, trebuie să faceți apel cu numele metadatelor (este o listă de obiecte de sistem care alcătuiesc configurația, adică directoare, documente, registre etc.).

Descrierea constructelor limbajului de interogare

Structura cererii

Pentru a obține date, este suficient să folosiți construcțiile SELECT (select) și FROM (from). Cea mai simplă interogare arată astfel:

SELECT * FROM Directoare.Nomenclator

Unde „*” înseamnă selecția tuturor câmpurilor din tabel, iar References.Nomenclature - numele tabelului din baza de date.

Luați în considerare un exemplu mai complex și general:

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

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

A SE GRUPA CU
<ИмяПоля1>

FILTREAZĂ DUPĂ
<ИмяПоля1>

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

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

Din datele primite, selectăm doar datele care îndeplinesc condiția din „UNDE” „Condiția de selecție a datelor”. Apoi, grupăm interogarea după câmpul „NumeCâmp1”, însumând „NumeCâmp2”. Creăm totaluri pentru „ Câmpul FieldName1” și câmpul final „FieldName2”.

Ultimul pas este sortarea interogării folosind constructul „ORDER BY”.

Proiecte generale

Luați în considerare construcțiile generale ale limbajului de interogare 1C 8.2.

PRIMULn

Folosind acest operator, puteți obține n număr de primele înregistrări. Ordinea înregistrărilor este determinată de ordinea în interogare.

ALEGEȚI PRIMILE 100
Banci.Nume,
Bănci.Cod AS BIC
DIN
Director.Bănci AS Bănci
FILTREAZĂ DUPĂ
Bănci.Nume

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

PERMIS

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

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

SELECTARE PERMIS
RepositoryAdditionalInformation.Link
DIN
Director. Stocarea informațiilor suplimentare

VARIAT

Utilizarea „DIFERENT” va face posibilă excluderea rândurilor duplicate de la introducerea rezultatului unei interogări 1C. Dublarea înseamnă că toate câmpurile cererii se potrivesc.

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

EmptyTable

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

Exemplu din ajutorul 1C 8:

ALEGE Număr.Referință, TABEL GOL.(Nom, Tov, Cant.) CA COMPOZIȚIE
DIN Document.Factură
UNIȚI TOȚI
SELECT Link.Number, Composition.(LineNumber, Product, Quantity)
FROM Document.Invoice Document.Invoice.Composition.*

ESTE NUL

O caracteristică foarte utilă care vă permite să evitați multe greșeli. IsNULL() vă permite să înlocuiți valoarea NULL cu cea dorită. Foarte des folosit în verificări pentru prezența unei valori în tabelele unite, de exemplu:

ALEGE
NomenclaturăRef.Referință,
IsNULL(Product Remaining.QuantityRemaining,0) AS CantitateRemaining
DIN


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

ISNULL(Data facturii primite, data emiterii facturii)

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

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

ALEGE
Vizualizare(Link), //șir, de exemplu „Raportul anticipat nr. 123 din 10.10.2015
Reprezentare(DeleteMark) AS DeleteMarkText, //șir, „Da” sau „Nu”
ReferenceRepresentation(DeletionMark) AS DeletionMarkBoolean //boolean, True sau False
DIN
Document.AdvanceReport

EXPRES

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

Tipul de referință Express este utilizat pentru a restricționa tipurile de date solicitate în câmpurile unui tip compus, adesea folosit pentru a optimiza performanța sistemului. Exemplu:

EXPRESS(Tabel de costuri. Subconto1 AS Directory. Articole de cost).Tip de activitatePentru Contabilitatea fiscală a costurilor

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

EXPRESS(Comentează ca șir(150))

DIFERENTA DE DATA

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

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

ALEGE DIN
Ref
LEFT JOIN
Software
UNDE NU Rămâne de mărfuri Cantitatea rămasă ESTE NULĂ

Tipul de date dintr-o interogare poate fi determinat după cum urmează: folosind funcțiile TYPE() și VALUETYPE() sau folosind operatorul logic REFERENCE. Aceste două funcții sunt similare.

Valori predefinite

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

Exemplu de utilizare:

UNDE

WHERE Counterparties.KindofContactInformation = Valoare(Enumeration.Types ofContactInformation.Phone)

WHERE Soldurile contului.Cont contabil = Valoare(Planul de conturi.Auto-susținere.Profit-Pierdere)

Conexiuni

Conexiunile sunt de 4 tipuri: STÂNGA, DREAPTA, COMPLET, INTERN.

ÎNSCRIEȚI ȘÂNGA și DREAPTA

Joinurile sunt folosite pentru a lega două tabele printr-o anumită condiție. Caracteristică la LEFT JOIN prin aceea că luăm primul tabel specificat complet și legăm al doilea tabel după condiție. Câmpurile celui de-al doilea tabel care nu au putut fi legate prin condiție sunt completate cu valoarea NUL.

De exemplu:

Va returna întregul tabel de Contrapartide și va completa câmpul „Bancă” numai în acele locuri în care va fi îndeplinită condiția „Contrapărți.Nume = Bănci.Nume”. Dacă condiția nu este îndeplinită, câmpul Bank va fi setat la NUL.

RIGHT JOIN în limba 1C absolut asemănătoare STÂNGA alăturați-vă cu excepția unei diferențe - în ÎNSCRIEȚI DREPT masa „master” este a doua, nu prima.

CONEXIUNE COMPLETA

CONEXIUNE COMPLETA diferă de stânga și dreapta prin faptul că afișează toate înregistrările din două tabele, le unește numai pe cele care pot fi unite după condiție.

De exemplu:

DIN

CONEXIUNE COMPLETA
Director.Bănci AS Bănci

DE

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

INNER JOIN

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

De exemplu:

DIN
Director.Contrapărți AS Clienți

INNER JOIN
Director.Bănci AS Bănci

DE
Clients.Name = Banks.Name

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

Asociațiile

Construcția UNION și UNION ALL combină două rezultate într-unul singur. Acestea. rezultatul executării a două va fi „combinat” într-unul, comun.

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

Cum se utilizează INDEX BY

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

ALEGE
CurrenciesCurrencySliceLast.Currency AS Moneda,
MonedeCurrencySliceLast.Course
Ratele valutare PUT
DIN
DataRegister.Currency Rates.SliceLast(&Period,) AS Currency RatesSliceLast
INDEX PRIN
Valută
;
ALEGE
Nomenclatura prețurilor.Nomenclatura,
PrețuriNomenclatură.Preț,
Nomenclatura prețurilor.Monedă,
RateMoneda.Curs
DIN
RegisterInformation.PricesNomenclature.SliceLast(&Period,
Item B (&Nomenclatură) AND PriceType = &PriceType) AS Item Prices
LEFT JOIN Currencies Rates AS Currencies Rates
Software PricesNomenclature.Currency = RatesCurrency.Currency

gruparea

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

Există următoarele funcții:

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

Exemplul #1:

ALEGE
Realizare Bunuri, Servicii, Bunuri.Nomenclatura,
SUM(Vânzarea de bunuri, servicii, bunuri. Cantitate) AS Cantitate,
SUM(Vânzarea de bunuri, servicii, bunuri. Sumă) AS Sum
DIN

A SE GRUPA CU
Realizare Bunuri, Servicii, Bunuri.Nomenclator

Interogarea primește toate rândurile cu mărfuri și le rezumă pe cantitate și sume în contextul articolului.

Exemplul #2

ALEGE
Codul băncilor,
NUMĂR (Bănci DIFERITE. Referință) AS Număr de duplicate
DIN
Director.Bănci AS Bănci
A SE GRUPA CU
Bănci.Cod

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

Rezultate

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

Una dintre cele mai populare modalități de a utiliza totalurile în practică este anularea loturilor de mărfuri.

ALEGE




DIN
Document.Vânzarea de BunuriServicii.Bunuri AS Realizare de BunuriServiciiBunuri
FILTREAZĂ DUPĂ

REZULTATE
SUM(număr),
SUMA(Suma)
DE
Nomenclatură

Interogarea va avea ca rezultat următoarea ierarhie:

Rezultate generale

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

ALEGE
Realizare Bunuri, Servicii, Bunuri.Nomenclatura AS Nomenclatura,
Realizare Bunuri Servicii Bunuri Document AS de referinta,
Vânzări de bunuri, servicii, bunuri Cantitate AS Cantitate,
Realizare Bunuri de Servicii Bunuri.Suma AS Suma
DIN
Document.Vânzarea de BunuriServicii.Bunuri AS Realizare de BunuriServiciiBunuri
FILTREAZĂ DUPĂ
Realizare Bunuri si Servicii Bunuri.Referinta.Data
REZULTATE
SUM(număr),
SUMA(Suma)
DE
SUNT COMUNE,
Nomenclatură

Ca rezultat al executării interogării, obținem următorul rezultat:

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

comanda

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

Sortarea pentru tipurile primitive (șir, număr, boolean) urmează regulile obișnuite. Pentru câmpurile de tipuri de referință, sortarea are loc pe reprezentarea internă a referinței (identificatorul unic), și nu pe cod sau pe reprezentarea referinței.

ALEGE

DIN
Director.Nomenclatura AS Nomenclatura
FILTREAZĂ DUPĂ
Nume

Interogarea va afișa o listă de nume ale cărții de referință de nomenclatură, sortate alfabetic.

Auto-aranjare

Rezultatul unei interogări nesortate este un set de rânduri reprezentat aleatoriu. Dezvoltatorii platformei 1C nu garantează ieșirea liniilor în aceeași secvență atunci când execută aceleași interogări.

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

ALEGE
Nomenclator Nume AS Nume
DIN
Director.Nomenclatura AS Nomenclatura
COMANDA AUTOMATA

Mesele virtuale

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

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

  • tăiați mai întâi;
  • felie din acesta din urmă.
  • resturi;
  • cifre de afaceri;
  • solduri si cifre de afaceri.
  • mișcări din subconto;
  • cifre de afaceri;
  • revoluții Dt Kt;
  • resturi;
  • solduri si cifre de afaceri
  • subconto.
  • baza;
  • date grafice;
  • perioada efectivă de valabilitate.

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

ALEGE
MărfuriÎn DepoziteRămășiȘi Cifre de Afaceri.Nomenclatură,
MărfuriÎn DepoziteRămășiȘi Cifra de Afaceri.Cantitate
MărfuriÎn DepoziteRemainsAndTurnovers.CantityCurnover,
MărfuriÎn DepoziteRămășiȘi Cifra de Afaceri.CantitateIntrat,
MărfuriÎn DepoziteRămășiȘi Cifra de Afaceri.CantitateConsum
MărfuriÎn Depozite Resturi și cifre de afaceri
DIN
Registrul de acumulare Mărfuri în depozite Resturi și cifre de afaceri AS Mărfuri în depozite resturi și cifre de afaceri

O astfel de interogare vă permite să obțineți rapid o cantitate mare de date.

Opțiuni de masă virtuală

Un aspect foarte important al lucrului cu tabele virtuale este utilizarea parametrilor. Opțiunile de masă virtuală sunt opțiuni specializate pentru selecție și personalizare.

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

Un exemplu de utilizare a unor astfel de parametri:

Registrul de acumulare.MarfuriInDepozite.RemainsAndTurnovers(&StartPeriod, &EndPeriod, Month, Movements ANDPeriodBorders, Nomenclature = &NecessaryNomenclature)

Algoritm pentru tabele virtuale

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

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

  1. Obținem valoarea calculată cea mai apropiată după dată și dimensiuni în tabelul cu totaluri.
  2. „Adăugați” suma din tabelul de mișcări la suma din tabelul cu totaluri.


Astfel de acțiuni simple pot îmbunătăți semnificativ performanța sistemului în ansamblu.

Folosind Generatorul de interogări

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

Generatorul de interogări are o interfață destul de simplă, intuitivă. Cu toate acestea, să luăm în considerare mai detaliat utilizarea constructorului de interogări.

Constructorul de text de interogare este lansat de meniul contextual (clic dreapta) în locul potrivit în codul programului.

Descrierea constructorului de interogare 1C

Să luăm în considerare fiecare filă a designerului mai detaliat. Excepția este fila Builder, acesta este un subiect pentru o discuție separată.

Fila Tabele și câmpuri

Această filă specifică sursa de date și câmpurile de afișat în raport. De fapt, aici sunt descrise construcțiile SELECT.FROM.

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

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

Fila Linkuri

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

Fila Grupare

În această filă, sistemul vă permite să grupați și să rezumați câmpurile dorite ale rezultatului tabelului. Este descrisă utilizarea structurilor GROUP BY, SUM, MINIM, AVERAGE, MAXIMUM, NUMBER, NUMBER OF DIFERITE.

fila Condiții

Responsabil pentru tot ceea ce intră în textul de solicitare după constructul WHERE, adică pentru toate condițiile impuse datelor primite.

Filă avansată

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

gruparea Selectarea înregistrărilor:

  • Primul N– un parametru care returnează doar N înregistrări în interogare (PRIMUL operator)
  • Nu se repetă– asigură unicitatea înregistrărilor primite (operator DIFERIT)
  • Permis– vă permite să selectați doar acele înregistrări pe care sistemul vă permite să le selectați ținând cont (construcția PERMISĂ)

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

Mai jos este un steag Blocați datele primite pentru modificare ulterioară. Vă permite să activați posibilitatea de a seta o blocare a datelor, care asigură siguranța datelor din momentul în care sunt citite până la modificare (relevant doar pentru modul Blocare automată, construcție PENTRU SCHIMBARE).

Fila Joins/Aliases

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

fila Comanda

Aici specificați ordinea de sortare a valorilor (ORDER BY) - descendent (DESC) sau crescător (ASC).

Există și un steag interesant - Auto-aranjare(în interogare - AUTOCOMANDĂ). În mod implicit, sistemul 1C afișează datele într-o ordine „haotică”. Dacă setați acest indicator, sistemul va sorta datele după datele interne.

Fila Lot de interogări

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

Butonul de interogare în generatorul de interogări

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

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


Folosind consola de interogări

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

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

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

În primul rând, pentru a începe cu consola de interogări, trebuie să o descărcați de undeva. Prelucrările sunt de obicei împărțite în două tipuri - forme gestionate și forme convenționale (sau, uneori, sunt numite 8.1 și 8.2 / 8.3).

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

Descrierea consolei de interogări 1C

Să începem analiza consolei de interogări cu o descriere a panoului principal de procesare:

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

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

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

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

Parametri de solicitare:

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

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

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

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

De asemenea, în panoul de sus există un buton pentru apelarea setărilor consolei de interogare:

Aici puteți specifica opțiunile de salvare automată a interogării și opțiunile de execuție a interogării.

Textul solicitării este introdus în câmpul de cerere de consolă. Acest lucru se poate face cu un set simplu de testare a interogărilor sau apelând un instrument special - generatorul de interogări.

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

De asemenea, în acest meniu există funcții utile precum curățarea sau adăugarea caracterelor de întrerupere de linie (“|”) la cerere sau obținerea codului de solicitare în această formă convenabilă:

Solicitare = Solicitare nouă;
Query.Text = ”
|ALEGE
| Monede.Link
| DE LA
| Manual.Monede AS Monede”;
QueryResult = Query.Execute();

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



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

Optimizarea interogărilor

Unul dintre cele mai importante puncte în îmbunătățirea productivității întreprinderii 1C 8.3 este optimizarecereri. Acest punct este, de asemenea, foarte important pentru trecerea certificării. Mai jos vom vorbi despre cauzele tipice ale performanței neoptimale ale interogărilor și despre metodele de optimizare.

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

Este necesar să se aplice filtre asupra detaliilor unui tabel virtual doar prin intermediul parametrilor BT. În niciun caz nu trebuie să utilizați construcția WHERE pentru selecție într-un tabel virtual, aceasta este o greșeală gravă din punct de vedere al optimizării. În cazul selecției folosind WHERE, de fapt, sistemul va primi TOATE înregistrările și abia apoi le va selecta pe cele necesare.

DREAPTA:

ALEGE

DIN
Registrul de acumulare. Decontari reciproce cu deponentii organizatiilor. Sold (
,
Organization = &Organizare
AND Individual = &Individual) CUM Decontări reciproce cuDepositorsOrganizationsBalances

GRESIT:

ALEGE
Decontări reciproce cuDeponențiiOrganizațiiSolduri.SumaSold
DIN
Registrul de acumulare. Decontări reciproce cu deponenții organizațiilor. Solduri(,)
UNDE
Acordări reciproce cuDepositorsOrganizationsBalances.Organization = &Organizare
ȘI decontări reciproce cu DepositorsOrganizationsBalances.Individual = &Individual

Obținerea valorii unui câmp de tip compus printr-un punct

La preluarea datelor de tip compus într-o interogare punctată, sistemul se alătură la stânga exact atâtea tabele câte tipuri sunt posibile în câmpul tipului compus.

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

GRESIT:

ALEGE
RecordSet.Registrar.Date,
RecordSet.Number
DIN
Registrul de acumulare.Organizarea mărfurilor ca un set de înregistrări

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

DREAPTA:

ALEGE
ALEGERE
WHEN GoodsOrg.Registrar LINK Document.Vânzarea de BunuriServicii
THEN EXPRESS(GoodsOrg.Registrar AS Document.Vânzarea de bunuriServicii).Data
WHEN GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
APOI EXPRIMĂ (Registrul de organizare a mărfurilor ca document. Primirea bunurilor/serviciilor). Data
END AS Data,
BunuriOrg.Cantitate
DIN
ÎnregistrareAcumulare.MarfuriOrganizatii AS BunuriOrg

Sau a doua opțiune - adăugarea unor astfel de informații la recuzită, de exemplu, în cazul nostru - adăugarea unei date.

DREAPTA:

ALEGE
BunuriOrganizații.Data,
MărfuriOrganizaţii.Cantitate
DIN
RegisterAcumulare.GoodsOrganizations AS GoodsOrganizations

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

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

GRESIT:

ALEGE…

LEFT JOIN (
SELECT FROM Registrul de informații.Limite
UNDE …
A SE GRUPA CU…
) DE …

DREAPTA:

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

ALEGE…
DIN Document.Realizarea BunuriServicii
Limite LEFT JOIN
DE …;

Conectarea înregistrărilor la tabele virtuale

Există situații când, la conectarea unei mese virtuale la altele, sistemul nu funcționează optim. În acest caz, pentru a optimiza performanța interogării, puteți încerca să plasați tabelul virtual într-un tabel temporar, amintindu-vă să indexați câmpurile unite în interogarea tabelului temporar. Acest lucru se datorează faptului că VT-urile sunt adesea conținute în mai multe tabele fizice ale SGBD, ca urmare, este compilată o subinterogare pentru selecția lor, iar problema este similară cu paragraful anterior.

Utilizarea filtrelor pe câmpurile neindexate

Una dintre cele mai frecvente greșeli la compilarea interogărilor este utilizarea condițiilor pe câmpurile neindexate, aceasta contrazice regulile de optimizare a interogărilor. SGBD nu poate efectua interogarea optim dacă interogarea este filtrată după câmpuri neindexate. Dacă se ia un tabel temporar, este necesară și indexarea câmpurilor de conexiune.

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

  1. Indexul conține toate câmpurile enumerate în condiție.
  2. Aceste câmpuri se află chiar la începutul indexului.
  3. Aceste selecții merg într-un rând, adică valorile care nu participă la condiția de interogare nu se „pune” între ele.

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

Utilizarea SAU logic în condiții

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

Un curs video gratuit foarte util despre dezvoltarea și optimizarea interogărilor, recomandat cu tărieîncepători și nu numai!

Pentru a afișa câmpuri de referință într-un raport, este necesar să obțineți reprezentarea câmpului de referință în cerere și să o utilizați în ieșire, și nu linkul în sine. Această secțiune descrie câteva caracteristici ale câmpului „Vizualizare” și funcții pentru obținerea vizualizărilor - View(). Puteți citi mai multe despre afișarea câmpurilor de referință în secțiunea „Ieșire câmp de referință”.

Reprezentarea câmpului

Fiecare tabel de obiecte din baza de informații are un câmp virtual - „Reprezentare”. Acest câmp conține reprezentarea textuală a obiectului. Într-o interogare, este posibil să primiți acest câmp în același mod ca și alte câmpuri de tabele, cu toate acestea, nu pot fi efectuate operații pe acest câmp. Această caracteristică se datorează faptului că acest câmp este virtual și, de fapt, la primirea acestui câmp din baza de date, interogarea primește mai multe câmpuri, iar atunci când primește valoarea câmpului din rezultatul interogării, convertește valorile primite într-o sfoară. Astfel, singurul lucru care se poate face cu câmpul „Vizualizare” este să îl obțineți în rezultatul interogării.

Ca urmare, nu este recomandat să ordonați rezultatul unei interogări după câmpul „Vizualizare”, deoarece aceasta nu va produce rezultatul dorit - rezultatul interogării va fi ordonat în ordinea crescătoare a referințelor obiectului. Puteți citi mai multe despre acest lucru în secțiunea „Particularitățile ordonării după câmpuri de referință”.

Vizualizare funcție()

Funcția de vizualizare este concepută pentru a obține o reprezentare textuală a oricărei valori care poate fi obținută folosind limbajul de interogare. Funcția View() funcționează atât pentru tipurile de referință, cât și pentru cele primitive. Pentru tipurile de referință, rezultatul funcției este complet similar cu obținerea câmpului „Vizualizare” din referință transmis ca parametru de funcție. Pentru tipurile primitive, rezultatul funcției este un șir în care a fost convertită valoarea transmisă ca parametru. Particularitatea acestei funcții este că rezultatul ei nu poate fi folosit într-o expresie. Această caracteristică este legată de faptul că conversia valorilor într-un șir se realizează deja atunci când se primesc date din rezultatul interogării, deoarece conversia unei valori arbitrare într-un șir atunci când se execută o solicitare pe server nu se realizează, din cauza faptului că la conversia valorilor într-un șir, trebuie luate în considerare setările locale.

Utilizarea funcției View() are o serie de avantaje față de utilizarea câmpului View. De exemplu, dacă câmpul din care este derivată vizualizarea poate conține atât tipuri de referință, cât și tipuri primitive, obținerea câmpului „Reprezentare” printr-un punct dintr-un astfel de câmp nu va avea ca rezultat extragerea de reprezentări pentru valorile tipului primitiv. Dacă, pentru un astfel de câmp, se aplică funcția Representation(), atunci reprezentarea șirului se va obține indiferent de tipul de valoare conținută în câmp. În plus, dacă funcția View() este aplicată unui câmp care este o referință la mai mult de trei tabele, limbajul de interogare preia numai valorile de referință din baza de date și preia valorile de vizualizare cu unul sau mai multe întrebări. Acest comportament vă permite să obțineți mai eficient vizualizări pentru câmpurile care se referă la un număr mare de tabele (de exemplu, la orice director), datorită faptului că interogarea executabilă nu va conține un număr mare de conexiuni care sunt necesare pentru a obține câmpurile care alcătuiesc vederea.

Utilizarea funcției View() poate fi utilă și la obținerea unei reprezentări a unui câmp - o enumerare, în cazul executării unei cereri prin intermediul unei conexiuni COM

Cerere . Text = "ALEGE | usStorageUnits.Reference | DE LA | Reference.usStorageUnits AS usStorageUnits // 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 compozit) |UNDE | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyReference) | SAU OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyReference) | 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 | ALEGEREA | CÂND SE EXPRIMĂ(Conformitatea agDocumentului.DocumentBU AS Document.Bunuri/Servicii de intrare) REFERINȚĂ Document.Bunuri/Servicii de intrare | ATUNCI ""Recepția Bunurilor de Servicii"" | 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” | ELSE """" | 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 să indicați în interogare că nu este necesar să executați interogarea (de exemplu, trebuie să returnați în mod programatic un rezultat al interogării goale, în funcție de o anumită condiție - Query.Text = StrReplace(Query.Text, "WHERE Doc.Link = &DocumentLink" , "UNDE SĂ MINȚI");). 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ă nuCerere.Alerga().Gol() Apoi // Exemplul 10. selectarea după condiția unei date goale: |UNDE | tbRows.CancellationDate = DATETIME(1, 1, 1)

Programarea 1C constă nu numai în scrierea unui program. 1C este un lingot de acțiuni ale utilizatorului și date cu care lucrează.

Datele sunt stocate în baza de date. Interogările 1C sunt o modalitate de a obține date din baza 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 SKD, acesta este cea mai mare parte a raportului.

Aşezaţi-vă. Ia o pauza. Ia-o ușurel. 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 vă permite să specificați ce date trebuie să obținem din baza de date.

De asemenea, este bilingv - adică poți scrie în rusă sau în engleză. Este extrem de asemănător cu limbajul de interogare SQL și cei care știu acest lucru se pot relaxa.

Cum sunt utilizate cererile 1C

Când un utilizator pornește 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.

Cererile 1C sunt:

  • Cereri automate 1C
    generate 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 vor fi solicitate datele pentru această coloană.
  • Cereri 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()
  • Solicitări manuale 1C (scrise de programator special ca o solicitare)
    Puteți scrie singur o interogare 1C în cod și o puteți executa.

Crearea și executarea cererilor 1C

Solicitarea 1C este textul real al cererii în limbajul de interogare 1C.
Textul poate fi scris de mână. Adică luați și scrieți (dacă cunoașteți această limbă).

Deoarece 1C promovează conceptul de programare vizuală, unde se poate face mult sau aproape totul fără a scrie cod cu pixuri, există un obiect special Query Constructor care vă permite să desenați textul interogării 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.

După ce textul cererii 1C este gata, acesta trebuie executat. Pentru aceasta, există un obiect în codul 1C Request (). Iată un exemplu:

Solicitare = Solicitare nouă();
Query.Text = „SELECT
| Nomenclatură.Link
| DE LA
| Director.Nomenclatura AS Nomenclatura
|UNDE
| Nomenclatură.Serviciul";
Selecție = Query.Execute().Select();

Raport (Selectare. 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 descărcat într-un tabel obișnuit:
Selecție = Request.Execute().Upload(); //Rezultat - tabel de valori

Sau pur și simplu mergeți linie cu linie.
Selecție = Query.Execute().Select();
While Selection.Next() Loop
//Fă ceva cu rezultatele interogării
EndCycle;

Lucrul cu solicitări 1C

Principiile de bază ale cererilor 1C

Principiile de bază ale construirii unei cereri 1C -
SELECT Listă de câmpuri FROM TableName WHERE Condiții

Un exemplu de construire a unei astfel de interogări 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.Nomenclator
UNDE
//specificați selecția
ProductType = &Service //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. Este necesar doar să scrieți „Director” în loc de „Director”, de exemplu „Director. Nomenclatură” sau „Document. Vânzări de bunuri și servicii” sau „Registrul de acumulare. Vânzări”.

Pentru registre, există tabele suplimentare (virtuale) care vă permit să obțineți cifre totale.

Informații Register.RegisterName.LastSlice(&Date) - Solicitare 1C din registrul de informații, dacă este periodic, la o anumită dată

Acumulare Register.RegisterName.Remains(&Date) - 1C cerere din registrul de sold pentru o anumită dată

Acumulare Register.RegisterName.Turnovers(&StartDate, &EndDate) – interogarea 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 calcula pentru noi (adăugați de exemplu).

ALEGE
//Quantity(FieldName) – numără cantitatea
//Field AS OtherName - redenumește câmpul
Cantitate (Referință) AS Cantitate Documente efectuate
DIN

UNDE
Susținut

Această interogare 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ă calculăm numărul de documente pentru fiecare organizație folosind o interogare 1C.

ALEGE
//doar câmpul documentului
Organizare,
// numără numărul
Cantitate(Referință) AS CantitateBy Organizations
DIN
Document.Vânzarea de Bunuri/Servicii
UNDE
Susținut
A SE GRUPA CU

Organizare

Această interogare 1C ne va returna numărul de documente pentru fiecare organizație (se mai spune „în contextul organizațiilor”).

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

ALEGE
//doar câmpul documentului
Organizare,
// numără numărul

//calculați suma

DIN
Document.Vânzarea de Bunuri/Servicii
UNDE
Susținut
A SE GRUPA CU
//ar trebui 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 câmpul documentului
Organizare,
// numără numărul
Cantitate (Referință) AS Cantitate după organizații,
//calculați suma
Amount(DocumentAmount) AS Sumă
DIN
Document.Vânzarea de Bunuri/Servicii
UNDE
Susținut
A SE GRUPA CU
//ar trebui 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 General

Limbajul de interogare 1C este extins și complex și nu vom lua în considerare toate caracteristicile 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
  • Subinterogări
  • cerere de lot
  • Creați-vă propriile mese virtuale
  • Interogare din tabelul de valori
  • Utilizarea funcțiilor încorporate pentru obținerea unei valori și manipularea valorilor.

Constructor de interogări 1C

Pentru a nu scrie textul interogării cu mâinile tale, există un constructor de interogare 1C. Doar faceți clic dreapta oriunde în modul și selectați Query Builder 1C.

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

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

Pe fila Condiții din 1C Query Builder, puteți selecta filtrele dorite în același mod (prin glisarea câmpurilor prin care veți face selecția). Asigurați-vă că selectați condiția corectă.

În fila Comandă este indicată sortarea. În fila Totaluri - însumând totalurile.

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