1c interogare tip compus expres

Deci, să începem. O interogare este un obiect special în 1C 8.2 care este folosit pentru a genera și executa interogări către tabelele 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 de interogare, ce câmpuri trebuie selectate, ce sortări și grupări se aplică 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ă și diferențe. Printre principalele avantaje ale limbajului de interogare încorporat, merită remarcată dereferința câmpurilor, prezența tabelelor virtuale, lucrul convenabil cu totaluri și câmpurile netipizate în interogări. Dezavantajele sunt că nu puteți utiliza o interogare ca câmp de ieșire, nu puteți utiliza proceduri stocate și nu puteți converti un șir într-un număr.

1. Pentru a crește lizibilitatea cererii și a reduce numărul de parametri de cerere, puteți utiliza un literal pentru a accesa datele de configurare predefinite în cerere VALOARE (REPREZENTAREA VALORII). Ca reprezentare a valorilor, valorile enumerarilor, date predefinite ale directoarelor, planuri de tipuri de calcul, planuri de tipuri de caracteristici, planuri de conturi, link-uri goale, valori ale punctelor de traseu, valori ale transferurilor de sistem ( de exemplu, tipul de mișcare de acumulare, tipul de cont) pot fi utilizate.

WHERE City = VALUE(Directory.Cities.Moscow)

WHERE City = VALUE(Directory.Cities.EmptyLink)

WHEREProductType = VALUE(Enumeration.ProductTypes.Service)

WHEREMovementType = VALUE(MovementTypeAccumulation.Incoming)

UNDE este Route Point =

Valoare

Expresia dintre 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 folosind un cuvânt cheie FILTREAZĂ DUPĂ.

3. Trebuie să vă asigurați că atunci când utilizați aliasuri, nu apare un câmp ambiguu. În caz contrar, sistemul nu va înțelege ce obiect trebuie accesat.

Exemplu de solicitare cu un câmp ambiguu:

ALEGE

Bunuri rămaseRemaining.QuantityRemaining

Director.Nomenclatura AS Nomenclatura

LEFT CONNECTION Înregistrați acumulările de bunuri rămase

Software Remaining ProductsRemaining.Nomenclature = Nomenclature.Link

Este necesar să corectați alias-ul tabelului, de exemplu, astfel: „Directory.Nomenclature AS Nomenclature1” și „Nomenclature.Link” ar trebui corectate în consecință cu „Nomenclature1.Link”.

4.Uneori este util să obțineți o reprezentare a câmpurilor de referință folosind un cuvânt cheie PERFORMANŢĂîmpreună cu un link astfel încât să nu existe acces repetat la baza de date. Acest lucru este util când se afișează rezultatul unei interogări într-un tabel.

ALEGE

REPREZENTARE(Document.Contraparte) CA Destinatar,

PREZENTARE(Document.Base)

Document.Factura AS Document

5. Utilizați într-o cerere EXPRESS(Tip de câmp AS) vă permite să eliminați tabelele inutile dintr-o conexiune cu un câmp de tip de date compus. Accelerând astfel executarea cererii.

Exemplu (registrar este un câmp cu tip compozit pentru tabelul fizic al registrului de acumulare a bunurilor rămase, în cerere se selectează Data și Numărul documentelor Primirea mărfurilor, în timp ce la accesarea detaliilor documentului Data și Numărul prin Registrator, nu există o conexiune multiplă a tabelului de registru cu tabelele de documente care sunt registratori pentru Registrul Resturilor de Bunuri):

ALEGE DIVERSE
EXPRESS(Mărfuri rămase.Registrul AS Document.Recepția mărfurilor).Număr AS NUMĂR DE PRESTAȚIE,

EXPRESS(Mărfuri rămase.Registrul AS Document.Recepția mărfurilor).Date AS RECEIPT DATE

DIN
Registrul acumulărilor de bunuri rămase ca bunuri rămase
UNDE
(EXPRESS(Mărfuri rămase. Înregistrare ca document.Recepție de mărfuri) NU ESTE NUL)

6. Când în configurația 1C există utilizatori care au drepturi limitate asupra anumitor obiecte de configurare, cuvântul cheie trebuie utilizat în cererea către astfel de obiecte PERMIS astfel încât cererea să fie executată fără eroare (Selectați Permis...)

7. Când îmbinați tabele care conțin tabele imbricate (de exemplu, un document cu o parte tabelară), cuvântul cheie poate fi util TABUL GOLIT când, de exemplu, unul dintre documente nu are o parte tabelară.

COMBINA TOTUL

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ă îmbinarea rândurilor de tabele (în ambele tabele nu există niciun câmp prin care acestea să poată fi unite). Acest lucru se poate realiza prin utilizarea construcției " FULL CONNECTION Tabel de TRUE" Dacă tabelele au mai multe rânduri, rezultatul va fi un număr de rânduri egal cu produsul dintre numărul 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 conecta astfel de tabele, puteți utiliza produsul cartezian al tabelelor, în care toate combinațiile de rânduri din ambele tabele vor apărea în tabelul rezultat. Trebuie să ne amintim că dacă există 0 rânduri într-unul dintre tabele, atunci produsul cartezian va fi 0, deci o îmbinare completă va fi mai bună. În general, în loc de o conexiune completă PRIN 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 CONEXIUNEA STÂNGA cu o alta masa cu conditie PRIN ADEVĂRAT.

Exemplu (desigur, conceput, pentru Full Join):

ALEGE

K. Contrapartidă

Enumerare Gen AS Gen

CONEXIUNE COMPLETĂ (Selectați primul 1 D. Contraparte DIN document. Vânzări de bunuri CUM D Aranjați după D. Momentul de 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 să grupați VARIATîn cerere, deoarece această 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ă ieșiți un număr limitat de linii. Pentru a face acest lucru, ar trebui să specificați cuvântul cheie în descrierea cererii PRIMUL iar după el - numărul necesar de linii.

Exemplu pentru PRIMUL:

Selectați Primele 5

Directory.Nomenclature.Name,

Director.Nomenclatură.PurchasingPrice

Filtrează după

Director.Nomenclatură.PurchasePrice Descendent

Exemplu pentru VARIAT:

Selectați Diverse

Document.Consumabil.Contraparte

10. Funcțiile de agregare dintr-o interogare pot fi utilizate fără un cuvânt cheie GRUP. În acest caz, toate rezultatele vor fi grupate într-o singură linie.

Alege

Sumă (Factură. Sumă) Ca Sumă

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 select field dereferencing. Dacă sursa de date este un tabel imbricat (partea tabelară a documentului), atunci în câmpurile de selecție puteți accesa și câmpurile tabelului principal (de exemplu, prin câmpul Link, accesați câmpul tabelului principal Cont)

ALEGE


Primirea Bunurilor și Serviciilor Bunuri Cantitate AS Cantitate.
Primirea Bunurilor și Serviciilor Bunuri.Link.Contraparte
DIN

UNDE
Primirea de bunuri și serviciiGoods.Link = &Link

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 de câmpuri de interogare, puteți accesa liber detaliile câmpurilor de grupare.

ALEGE

Nomenclatura de primire a bunurilor și serviciilor.

Codul de primire a bunurilor și serviciilor.

SUM (Recepția Bunurilor și Serviciilor Bunuri. Cantitate) AS Cantitate,

Document. Primirea Bunurilor și Serviciilor

A SE GRUPA CU

Nomenclatura de primire a bunurilor și serviciilor.

Ajutorul 1C spune că, dacă există grupare, numai câmpurile de grupare și funcțiile de agregare pentru câmpurile de selecție pot participa la câmpurile de selecție a interogării. Există un caz excepțional când funcțiile agregate sunt aplicate câmpurilor unui tabel imbricat. În acest caz, în lista câmpurilor de selecție, este posibilă accesarea câmpurilor din tabelul de nivel superior, fără a grupa rezultatele după aceste câmpuri.

ALEGE

Primirea Bunurilor și Serviciilor (SUMA (Cantitate), Nomenclatură).

Primirea Bunurilor și Serviciilor Contraparte

Documentul Primirea Bunurilor și Serviciilor CUM Primirea Bunurilor și Serviciilor

A SE GRUPA CU

Recepția Bunurilor și Serviciilor (Nomenclatură).

12. Uneori, în loc să specificați orice câmp din grupare, este util să includeți următorul parametru în câmpurile de selecție a interogării:

ALEGE
DocProducts.Nomenclature,
&Contraparte,
&Perioadă,
SUM(DocProducts.Quantity * DocProducts.K) AS Cantitate,
SUM(DocProducts.Amount) AS Sumă
DIN
Document.Admitere.Produse AS DocProducts
UNDE
DocProducts.Link = &Link

A SE GRUPA CU
DocProducts.Nomenclatură

Și apoi setați parametrul în corpul cererii:

Request.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 parametrii 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 de solicitare;

OrderingType = ?(UNILE VARIABILE,"","DESC");

Query.Text = "Selectați... Aranjați BY Field1 " + OrderType + "...";

Query.Text = "Selectați Câmp1...";

Dacă UNELE VARIABILE = 1 Atunci

Request.Text = Request.Text + ",Field2 ...";

endIf;

B) utilizați parametrii în diferite părți ale cererii (de exemplu, în secțiunea surse de date a cererii), apoi metoda limbajului încorporat - STREPLACE(). Când proiectați interogări universale, este util să accesați proprietatea 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ă.

Alege

DocTch.Nomenclatura,

&Unele DocTC AS DocTC

Și apoi setați parametrul în corpul solicitării

Request.Text = StrReplace(Request.Text, "&SomeDocTCH", "Document."+Link.Metadata().Name+".Products");

Parametrii pot fi utilizați în condiții de interogare pentru a activa o condiție opțională &Parametru SAU NU SomeProperty:

Request.SetParameter(“&Parameter”, “Counterparty.Name="”Ivanov”””);

Folosind un literal ADEVĂRAT puteți elimina anumite filtre din cerere

Request.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 o denumire generalizată pentru sursa de date. Pentru a crea interogări pentru tabele de același tip, similare ca structură, poate fi 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 secțiunile de condiții sau parametri ai tabelelor virtuale ale designerului de interogări, se folosește tehnica de evidențiere a unui spațiu între paranteze, apoi elementul „Query Designer” apare în meniul contextual și la editarea unei interogări imbricate, întreaga interogare între paranteze este evidențiată în condiție.

Exemplu de interogare imbricată:

Produs B (Selectați produsul...)

16. La proiectarea rapoartelor ACS în interogări pentru echilibrarea registrelor, este mai convenabil și mai corect să folosiți expresia ca parametru Perioadă AddToDate(EndPeriod(Period,DAY),SECOND,1), deoarece soldurile virtuale se obțin la începutul perioadei, fără a include ultima secundă. Tehnica +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 Limită cu momentul în care documentul include (și nu la data document +1 secundă!), și conform vechii metode de postare - la momentul documentului (și nu la data documentului!). Când analizați cifra 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ă furnizarea ultimei date a intervalului la sfârșitul zilei). Pentru câmpul standard „Începutul perioadei”, în câmpul „Expresie” trebuie să introduceți „&Perioada.Data de începere" Și pentru câmpul standard „Sfârșitul perioadei” în câmpul „Expresie” scrieți „ &Perioada.Data de încheiere”. O mulțime de informații utile despre limbajul de interogare pot fi găsite nu în asistentul de sintaxă, ci în ajutorul complet al configuratorului 1C 8.2 (butonul F1)

17.Funcția de interogare EsteNull(este mai convenabil să scrieți versiunea în limba engleză EsteNull) este de obicei folosit 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 (Parametrul 1, Parametrul 2) poate înlocui cu succes designul ALEGERE CÂND... ATUNCI..ALTĂ....Sfârșit, când pentru orice 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 EsteNull convertește tipul celui de-al doilea argument în tipul primului argument, care trebuie luat în considerare dacă tipurile de argument sunt diferite!

IsNull(Reg.Remaining,0)

IsNull(Doc.Product, Doc1.Item)

18. La construcţia condiţionată ALEGERE Există o sintaxă alternativă pentru cazul simplu de testare a egalității la o anumită valoare, dar este, totuși, nedocumentată:

Alegere expresie Când 1 Apoi „Ridicat” Când 2 Apoi „Mijloc” Altfel „Scăzut”

19. Operator de verificare a valorii NULL Da Null(Putem recomanda utilizarea versiunii în limba engleză Este nul). Această construcție a apărut deoarece orice operație care compară 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 Null- greșit, dar corect Da, nu 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. Uneori formularul operator este util ÎN pentru a verifica dacă există o potrivire cu una dintre valorile enumerate.

...Unde este produsul.Numele B („Electrocasnice”, „Computere”)

Pentru cărțile de referință, formularul de operator poate fi util ÎN verificări de apartenență la ierarhie.

...Unde este Nomenclatura ÎN IERARHIE (&Grup)

Operator ÎN adesea folosit pentru a verifica dacă o valoare este inclusă în rezultatul unei subinterogări.

Într-o subinterogare, puteți accesa câmpurile exterioare de interogare într-o condiție.

// Selectați numele produselor care au fost prezente

// în facturi

ALEGE

Produse.Nume

Director.Nomenclator CUM Produse

(ALEGE

FacturăCompoziție.Nomenclatură

Document.Invoice.Composition AS InvoiceComposition

InvoiceContent.Nomenclature = Products.Link)

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 o subinterogare

(expresia1, expresia2,...,expresiaN) În (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 face întotdeauna designerul de interogări STÂNGA alăturarea meselor (și schimbarea lor), indiferent de modul în care specificăm DREAPTA:

1C: Întreprinderea iubește „în stânga”.

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

22.La proiectarea rapoartelor ACS, trebuie să rețineț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, poate fi necesar să adăugați sortarea după un câmp de tabel virtual MOMENT DE TIMP, dar 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ă sortări: după dată și după link. De asemenea, puteți rezolva problema printr-un tabel temporar mutând interogarea imbricată într-o interogare separată. Pentru multe versiuni, această caracteristică sau eroare nu a fost remediată.

Un exemplu de cerere defectuoasă care primește ultimul document postat pentru contrapartea specificată (sau, mai degrabă, partea tabelară a documentului):

ALEGE

Consumabile.Număr linie,

ConsumableProducts.Product,

Articole consumabile.Cantitate,

Produse consumabile,

Articole consumabile.Sumă

Document.Consumabil AS D

Solutii posibile:

A) Înlocuiți cu FILTREAZĂ DUPĂ pe

COMANDA PENTRU D.Data DESC.

B) Puteți muta interogarea imbricată într-un tabel temporar:

Document.Consumabil AS D

Și D.Counterparty = &Counterparty

////////////////////////////////////////////////////////////////////////////////

ALEGE

Consumabile.Număr linie,

ConsumableProducts.Product,

Articole consumabile.Cantitate,

Produse consumabile,

Articole consumabile.Cant

Document.Consumabil.Bunuri AS ConsumabileBunfuri

C) Vă puteți referi la tabelul principal al documentului și abia apoi la partea tabulară

SELECTARE TOP 1

Numărul de linie,

Produs,

Cantitate,

Preț,

Sumă

Document.Consumabile AS Consumabile

Expense.Counterparty = &Contraparte

Și Consumabile.Realizat

FILTREAZĂ DUPĂ

Consumabil.Momentul Timpului SCADĂ

24. La accesarea tabelului principal al unui document (director), puteți accesa și datele tabelului subordonat (partea tabelară). Această oportunitate se numește dereferențierea câmpurilor de tabel. Un exemplu de sarcină este sarcina de a căuta documente care conțin un anumit produs în secțiunea tabelară.

Avantajul acestei interogări față de o interogare pe tabelul imbricat Receipt.Goods 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:

Acesta este, probabil, tot ce este în ea. Este clar că există încă multe întrebări în limbajul de interogare pe care nu le-am acoperit. Pentru a scrie acest articol, am folosit informațiile primite după finalizarea cursului de bază 1C 8.2 spec8.ru, precum și din cartea „1C 8.2 Developer’s Guide” și pe Internet.

Există puține mecanisme pentru a lucra cu șiruri în interogările 1C. În primul rând, liniile pot fi adăugate. În al doilea rând, puteți lua un subșir dintr-un șir. În al treilea rând, șirurile pot fi comparate, inclusiv după model. Asta este probabil tot ce se poate face cu șiruri.

Adăugarea șirurilor

Pentru a adăuga rânduri într-o interogare, se utilizează operația „+”. Puteți adăuga doar șiruri de lungime limitată.

SELECTAȚI „Nume: „ + Counterparties Coloana 1 FROM Counterparties AS Counterparties WHERE Link = &Link

Funcția subșir

SUBSTRING(<Строка>, <НачальнаяПозиция>, <Длина>)

Un analog al funcției Environment() din modelul obiect. Funcția Substring() poate fi aplicată datelor șirului și vă permite să selectați un fragment <Строки> , începând cu numărul caracterului <НачальнаяПозиция> (caracterele dintr-o linie sunt numerotate începând de la 1) și lungime <Длина> personaje. Rezultatul calculului funcției are un tip de șir de lungime variabilă, iar lungimea va fi considerată nelimitată dacă <Строка> are lungime și parametri nelimitați <Длина> nu este o constantă sau mai mare decât 1024.

Dacă lungimea șirului este mai mică decât cea specificată în al doilea parametru, atunci funcția va returna un șir gol.

Atenţie! Utilizarea funcției SUBSTRING() pentru a converti șiruri de lungime nelimitată în șiruri de lungime limitată nu este recomandată. În schimb, este mai bine să utilizați operatorul de distribuție EXPRESS().

Funcție similară

Dacă trebuie să ne asigurăm că un atribut șir îndeplinește anumite criterii, îl comparăm:

SELECT Counterparties Nume AS Coloana 1 FROM Counterparties AS Counterparties WHERE Counterparties.

Dar dacă ai nevoie de o comparație mai subtilă? Nu doar egalitate sau inegalitate, ci asemănarea cu un anumit tipar? Exact pentru asta a fost creată funcția SIMILAR.

LIKE — Operator pentru verificarea asemănării unui șir cu un model. Analog de LIKE în SQL.

Operatorul SIMILAR vă permite să comparați valoarea expresiei specificate în stânga acesteia cu șirul de model specificat în dreapta. Valoarea expresiei trebuie să fie de tip șir. Dacă valoarea expresiei se potrivește cu modelul, rezultatul operatorului va fi TRUE, în caz contrar va fi FALS.

Următoarele caractere din șirul șablon sunt caractere de serviciu și au o semnificație diferită de caracterul șir:

  • % (procent): o secvență care conține orice număr de caractere arbitrare;
  • _ (subliniere): un caracter arbitrar;
  • […] (unul sau mai multe caractere între paranteze drepte): orice caracter unic enumerat între paranteze drepte. Enumerarea poate conține intervale, de exemplu a-z, adică un caracter arbitrar inclus în interval, incluzând capetele intervalului;
  • [^...] (în paranteze drepte un semn de negație urmat de unul sau mai multe caractere): orice caracter unic, altul decât cele enumerate după semnul de negație.

Orice alt simbol înseamnă el însuși și nu poartă nicio sarcină suplimentară. Dacă unul dintre caracterele enumerate trebuie să fie scris ca el însuși, atunci trebuie să fie precedat de<Спецсимвол>. Eu insumi<Спецсимвол>(orice caracter adecvat) este definit în aceeași instrucțiune după cuvântul cheie SPECIAL CHARACTER.

În acest articol vom analiza posibilitățile de conversie de tip în limbajul de interogare 1C, care sunt oferite de funcția „Express”.
Să ne uităm la câteva opțiuni pentru utilizarea acestei funcții.
Și prima opțiune este rotunjirea numerelor.

Pentru a face acest lucru, trebuie să utilizați funcția Express în următorul format:

Expres(<Число>ca număr(<ДлинаЧисла>,<Точность>))

Unde:
Număr— câmpul care trebuie rotunjit
LungimeNumere— lungimea maximă a numărului
Precizie— precizia rotunjirii numerelor

Parametrii atât lungimea cât și precizia trebuie să fie numere întregi pozitive.
Vedeți cum funcționează această funcție în imaginea de mai jos.

Al doilea caz de utilizare este turnarea cu coarde. Foarte des, configurațiile folosesc șiruri de lungime nelimitată, ceea ce impune anumite restricții. De exemplu, nu putem compara șiruri de lungime nelimitată.
În interogarea de mai jos, câmpul FullName este de tip șir de lungime nelimitată, iar această interogare nu va funcționa.

Pentru ca acesta să funcționeze, este necesar să convertiți un câmp de lungime nelimitată într-un șir cu o anumită lungime, aceasta se face folosind funcția Express în următorul format:

Expres(<Строка>ca șir (<ДлинаСтроки>)

Unde
Lungimea liniei– lungimea maximă la care va fi redusă sfoara.
Să reluăm interogarea: în condiția vom converti un șir nelimitat într-un șir cu o anumită lungime. Atunci nu vor fi erori.

Să luăm în considerare ultima și, aș spune, cea mai importantă opțiune pentru aplicarea acesteia: atunci când lucrați cu câmpuri de tip compozit.
Mai jos sunt două interogări care folosesc câmpuri compuse. Prima este greșită, iar a doua este corectă.

Acestea. Când trebuie să obțineți un câmp de un tip complex, obțineți întotdeauna valoarea acestui câmp numai după turnarea tipului folosind funcția Express. În acest caz, documentele și cărțile de referință vor avea următorul format:

Expres(<Документ>ca document.<ИмяТаблицы>)
Expres(<Справочник>ca Director.< ИмяТаблицы >)
.

Unde
TableName— numele obiectului în .

Utilizați întotdeauna funcția expres atunci când lucrați cu tipuri compozite, aceasta optimizează foarte mult interogarea.

Dacă încă „înoți” în construcțiile limbajului de interogări și chiar și cele mai simple interogări îți provoacă dificultăți, atunci îți recomand cursul meu „Interogări în 1C de la începător la profesionist”. Unde acestea și multe alte întrebări sunt discutate mai detaliat.

Ce este special la acest curs:
Cursul este conceput pentru cei care nu sunt familiarizați cu limbajul de interogare în 1C;
Materialul educațional este bine aranjat și ușor de învățat;
Câteva zeci de lecții;
Exemple practice utile;
Toate lecțiile sunt prezentate într-un limbaj clar și simplu

Pentru cititorii mei, cupon de reducere de 25%: hrW0rl9Nnx

Încerc să lansez diverse articole gratuite interesante și tutoriale video cât mai des posibil. Prin urmare, voi fi foarte bucuros dacă îmi susțineți proiectul transferând orice sumă:

Puteți transfera orice sumă direct:
Yandex.Bani - 410012882996301
Web Money - R955262494655

Alăturați-vă grupurilor mele.

Mulți oameni interpretează funcția EXPRESS în limbajul de interogare 1C 8 ca un convertor de tip, dar nu este deloc destinată acestor scopuri. Detalii sub croiala...

Deci, mulți oameni cred în mod eronat că pot converti un câmp cu tip Liniaîn câmpul cu tip Număr sau link în linie. De fapt, operatorul EXPRESS poate converti:

  • setări de tip primitiv;
  • un câmp de tip compus într-un câmp de un singur tip;

Să ne uităm la aceste situații mai detaliat...

Conversia setărilor de tip primitiv

Să luăm în considerare o situație în care dorim să grupăm datele după un șir de tip nelimitat, de exemplu, un astfel de șir este adesea un comentariu în documente. În acest caz, nu vom putea grupa după comentariu; vom primi o eroare. Prin urmare, trebuie să convertim un șir de lungime nelimitată într-un șir de lungime limitată și apoi să îl grupăm. De exemplu, să numărăm numărul de documente cu aceleași comentarii:

ALEGE
EXPRESS(Admission.Comment AS LINE(300)) AS Comentariu,
QUANTITY(Incoming.Link) AS Link
DIN
Document. Hol de intrare AS Hol de intrare

A SE GRUPA CU
EXPRESS(Admitere.Comentariu AS ROW(300))

O altă situație este când cererea folosește calcule, la ieșire putem obține un număr cu un număr mare de zecimale (1100.001568794). Pentru a nu procesa acest număr după finalizarea interogării, îl puteți tăia imediat la lungimea necesară, dar este important să înțelegeți că numărul este tăiat și nu rotunjit. Exemplu:

ALEGE
Vânzări.Produs,
EXPRESS(Vânzări.Cantitate * Vânzări.Preț AS NUMĂR(15, 2)) AS Sumă
DIN

Conversia unui tip compus într-un singur tip

Registrele de înregistrare au adesea un tip compus pentru a-l converti într-un singur tip, utilizați constructul EXPRES Cu toate acestea, dacă în etapa de eșantionare încercați să convertiți documentul de implementare într-un document de chitanță, cererea va eșua cu siguranță cu o eroare, așa că înainte de a converti ar trebui să verificați tipul linkului. Aceasta este o prostie))) De ce sunt necesare toate acestea, vă întrebați. Răspund, acesta este unul dintre momentele de optimizare implicită a interogărilor în detrimentul conciziei scrisului. Să ne uităm la aplicarea acestui punct cu un exemplu.

Să presupunem că v-ați propus să obțineți numărul fiecărui registrator de la RN Sales. scrie o cerere:

ALEGE DIVERSE
Număr.Registrar.Vânzări
DIN
ÎnregistrareAcumulări.Vânzări CUM Vânzări

De fapt, nimic nu poate fi mai simplu. Dar 1C, în stadiul de execuție, transformă această solicitare fără conexiuni într-o solicitare cu atâtea conexiuni rămase câte registratori posibili avem. Acestea. dacă în acest registru sunt scrise 20 de documente, vom obține o interogare SQL cu 20 de uniuni rămase. De ce se întâmplă asta? Deoarece optimizatorul 1C încorporat nu procesează foarte bine câmpurile primite printr-un punct, în acest caz este atributul Number. Acestea sunt plăcintele, dacă deseori dorim să primim numărul documentului, atunci este cel mai rezonabil să îl includem în detaliile registrului sau să folosim operatorul EXPRESS, dar în detrimentul conciziei:

ALEGE DIVERSE
Număr.registrar.vânzări,
ALEGERE
WHEN Sales.Registrar LINK Document.Consumabil
THEN EXPRESS (Vânzări.Registrar AS Document.Consumable)
ALTA ALEGERE
WHEN Sales.Registrar LINK Document.Implementare
THEN EXPRESS(Vânzări.Registrar AS Document.Implementare)
Sfârşit
...
END AS Număr
DIN
ÎnregistrareAcumulări.Vânzări CUM Vânzări

Acum, alăturarea din stânga va implica un anumit tabel.

În general, ar trebui să vă referiți cu atenție la date printr-un punct, deoarece 1C în acest caz utilizează o îmbinare stângă în interogarea SQL, care poate afecta semnificativ performanța. Acesta este unul dintre punctele de optimizare.

Să ne uităm la restul acum.

Funcții pentru lucrul cu șiruri în interogări 1C

Există puține funcții și operatori pentru a lucra cu date șir în interogări 1C.

În primul rând, pot fi adăugate șiruri în interogări. Pentru a face acest lucru, utilizați operatorul „+”:

Cerere. Text = „SELECT
" "Linie: " " + Sursă.Nume
;

În al doilea rând, puteți selecta o parte a liniei. Pentru a face acest lucru, utilizați funcția SUBSTRUCȚIE. Funcția este similară cu limbajul 1C încorporat. Are trei parametri:

  1. Șir sursă.
  2. Numărul caracterului cu care trebuie să înceapă linia selectată.
  3. Personaje.

Cerere. Text= "ALEGE
SUBSTRING("
"Linie:" ", 4, 3) CA REZULTAT"; // Rezultat: ok

Funcţie ISNULL

NULL este un tip de date special pe platforma 1C:Enterprise. Este, de asemenea, singura valoare posibilă de acest tip. NULL poate apărea în interogări în mai multe cazuri: la conectarea surselor de interogare, dacă nu a fost găsită o valoare corespunzătoare într-unul dintre tabele; la accesarea detaliilor unui obiect inexistent; dacă a fost specificat NULL în lista câmpurilor de interogare (de exemplu, la combinarea rezultatelor selecției din mai multe tabele), etc.

Pentru că NULL nu este nici nul, nici șirul gol, nici măcar o valoare Nedefinit, este adesea util să îl înlocuiți cu un tip de date mai util. Pentru asta este concepută funcția. ISNULL.

Are doi parametri:

  1. Valoarea care se verifică.
  2. Valoarea cu care se înlocuiește primul parametru dacă se dovedește a fi NULL.

Cerere. Text= "ALEGE
ISNULL(Source.Remainder, 0) AS Remainder"
; // Dacă rezultatul solicitării este restul câmpului = NULL,
// apoi va fi înlocuit cu 0 și puteți efectua operații matematice cu el

Funcții PERFORMANŢĂȘi INTRODUCERE LEGĂTURĂ

Aceste funcții sunt concepute pentru a obține reprezentări în șir de diferite valori. Adică convertesc referințe, numere, booleeni etc. în text simplu. Diferența dintre ele este că funcția PERFORMANŢĂ convertește orice tip de date în text (șir) și funcția INTRODUCERE LEGĂTURĂ- numai linkuri și returnează valorile rămase așa cum sunt, neconvertite.

Cerere. Text= "ALEGE
REPREZENTARE(ADEVĂRAT) CA Boolean,
REPREZENTARE (4) ca număr,
REPREZENTARE (Source.Link) AS Link,
REPREZENTARE(DATETIME(2016,10,07)) AS Data"
;
// Boolean = „Da”, Număr = „4”, Link = „Document Încasare numerar Nr. comandă... de la...”
// Data="07.10.2016 0:00:00"

Cerere. Text= "ALEGE
REPRESENTATIONREFERENCE(TRUE) CA Boolean,
REPREZENTARE REFERINȚĂ(4) CA NUMĂR
PRESENTINGLINK(Source.Link) AS Link,
REPRESENTATIONREFERENCE(DATETIME(2016,10,07)) AS Data"
;
// Boolean = TRUE, Number = 4, Link = "Documentul Ordin de primire numerar nr.... de la..."
// Data=07.10.2016 0:00:00

Funcții TIPȘi VALORI DE TIP

Funcţie TIP returnează tipul de date al platformei 1C:Enterprise.

Cerere. Text= "ALEGE
TIP (număr)
TYPE (șir),
TIP (Document. Ordin de numerar pentru cheltuieli)"
;

Funcţie VALORI DE TIP returnează tipul valorii transmise acestuia.

Cerere. Text= "ALEGE
VALORI TIP (5) AS Număr,
TIP ("
"Linia" ") AS String,
TYPE (Source.Link) AS Referință
Din Directory.Source AS Source"
;
//Număr=Număr, String=Șir, Director = DirectoryLink.Source

Aceste funcții sunt convenabile de utilizat, de exemplu, atunci când trebuie să aflați dacă un câmp primit într-o solicitare este o valoare de un anumit tip. De exemplu, să obținem informațiile de contact ale contrapărților din registrul de informații ContactInformation (acolo sunt stocate contactele nu numai ale contrapărților, ci și ale organizațiilor, persoanelor fizice etc.):

Cerere. Text= "ALEGE

DIN

UNDE
VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)"
;

Funcţie SENS

Funcţie Sens vă permite să utilizați obiecte de configurare 1C direct într-o solicitare, fără a utiliza .

Să mai adăugăm o condiție la exemplul anterior. Trebuie doar să obțineți numerele de telefon ale contrapărților dvs.

Cerere. Text= "ALEGE
Informații de contact.Introducere
DIN
Registrul de informații Informații de contact CUM Informații de contact
UNDE
VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)
AND ContactInfo.Type = VALUE(Enum.ContactInfoTypes.Phone)"
;

Trebuie remarcat faptul că această funcție poate fi utilizată numai cu valori predefinite, adică. cu valori care pot fi accesate direct din configurator. Adică funcția SENS nu poate fi folosit cu elemente de director create de utilizatori, dar poate lucra cu enumerari, cu elemente de director predefinite, cu valori EmptyLink.

Operator LEGĂTURĂ

Operator LEGĂTURĂ este conceput pentru a verifica valorile returnate de o solicitare pentru a vedea dacă aparțin unui anumit tip de referință. Aceeași sarcină poate fi îndeplinită folosind funcții TIPȘi VALORI DE TIP(care au un domeniu mai larg și au fost discutate mai sus).

De exemplu, sarcina de selectare a informațiilor de contact pentru contrapărți ar putea fi rezolvată astfel:

Cerere. Text= "ALEGE
Informații de contact.Introducere
DIN
Registrul de informații Informații de contact CUM Informații de contact
UNDE
ContactInformation.Object LINK Directory.Contrapartide"
;

Operator EXPRES

Operator EXPRES utilizat în interogări 1C în două cazuri:

  • când trebuie să modificați caracteristicile unui tip primitiv;
  • atunci când trebuie să transformați un câmp cu un tip de date compus într-un câmp cu un singur tip.

Tipurile de date primitive includ: număr, șir, dată, boolean. Unele dintre aceste tipuri de date au caracteristici suplimentare. Tip Număr are lungime si precizie, tip linie - lungime sau nelimitat.

Operator EXPRES vă permite să schimbați nu tipul de date, ci caracteristicile suplimentare. De exemplu, el poate transforma un șir cu lungime nelimitată într-un șir cu lungime limitată. Acest lucru poate fi util dacă trebuie să grupați rezultatele interogării după un astfel de câmp. Nu puteți grupa după câmpuri cu o lungime nelimitată, așa că îl convertim într-un șir cu o lungime de 200 de caractere.

Cerere. Text= "ALEGE
CANTITATE (Sosire diferită de bunuri și servicii. Link) AS Link
DIN
Documentul Primirea Bunurilor și Serviciilor CUM Primirea Bunurilor și Serviciilor
A SE GRUPA CU
EXPRESS(Primirea bunurilor și serviciilor. Comentariu AS ROW (200))"
;

În unele cazuri, interogările către câmpuri cu un tip de date compus pot să nu fie procesate optim de platforma 1C. Acest lucru are ca rezultat timpi de interogare mai lungi, deci poate fi util să convertiți în avans un tip compus într-un singur tip.

Cerere. Text= "ALEGE
EXPRESS(Mișcarea mărfurilor. Cifra de afaceri. Comanda ca document. Comanda clientului).Data AS Data comenzii,
Mişcarea mărfurilor Cifra de afaceri.Nomenclatură
DIN
ÎnregistrareAcumulări.Mișcarea mărfurilor.Cifra de afaceri AS Mișcarea mărfurilor Cifra de afaceri
UNDE
Mișcarea mărfurilor Cifra de afaceri.Comandă LINK Document.Comandă client"
;

Operatori ALEGEREȘi ESTE NUL

Operator ALEGERE similar cu operatorul DACĂîn limbajul 1C încorporat, dar are o funcționalitate oarecum redusă.

Să presupunem că dorim să primim informații de contact din registrul de informații ContactInformation și, în același timp, să indicăm într-un câmp de cerere separat dacă aparține unei contrapărți sau unei persoane fizice.

Cerere. Text= "ALEGE
Informații de contact.Introducere,
ALEGERE
WHEN VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)
APOI "
Contrapartidă "
ALTA ALEGERE
WHEN VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Individuals)
APOI "
Individual"
ELSE "Altul" "
Sfârşit
TERMINĂ CA PROPRIETAR
DIN
Registrul informațiilor Informații de contact AS Informații de contact".
;

După cum se vede din exemplu, în design ALEGERE există întotdeauna o condiție după cuvânt CÂND; valoare aplicată dacă condiția este adevărată după cuvânt APOIși valoarea aplicată dacă condiția nu este îndeplinită, după cuvânt IN CAZ CONTRAR. Toate cele trei elemente de design ALEGERE sunt obligatorii. Omite element IN CAZ CONTRAR, la fel ca atunci când utilizați operatorul DACĂîn limbajul 1C încorporat, este imposibil. Tot de la operator ALEGERE nu există un analog al designului ELSEIF, dar poți investi unul ALEGEREîn altul, așa cum sa făcut în exemplul nostru.

Operator ESTE NUL folosit în proiectare ALEGERE pentru a compara un câmp de interogare cu tipul NULL.

Cerere. Text= "ALEGE
ALEGERE
CÂND VALOAREA ESTE NULĂ, atunci 0
ELSE Sens
SFÂRŞIT"
;

În plus, operatorul ESTE NUL poate fi folosit în condiții de interogare, cum ar fi într-o propoziție UNDE.