Exprimați un șir ca număr într-o interogare.

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(AcumulationMovementType.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 poate fi 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 complex. 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 documentului de primire a bunurilor, în timp ce la accesarea detaliilor documentului Data și numărul prin Registrator, nu există o legătură 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 MASĂ GOL 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 JOIN 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 mărfuri 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, trebuie 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. Cuprins 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 câmpurilor 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.Q) AS Cantitate,
SUM(DocProducts.Amount) AS Sumă
DIN
Document.Admission.Products 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(). Atunci când proiectați interogări generice, este util să accesați o proprietate a obiectelor METADATE(), cu care puteți determina numele tabelului pentru un link (de exemplu, pentru un document va fi ceva de genul acesta - Link . METADATA().NAME), trecut printr-un parametru la o procedură universală.

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 de echilibrare a 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!). Atunci 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” Final

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 de interogare exterioare î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 aceeași formă ș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 parametrul 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 solicitare 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.Sumă

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 tabulară). 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 „Ghidul dezvoltatorului 1C 8.2” și pe Internet.

Î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 Număr de zile”;

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ă) AS Persoană fizică, //cont predefinit VALUE(Planul de conturi. Auto-contabil.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 //altfel solicitarea va returna pur și simplu Suma „SELECT | SELECT | WHEN TTCReceipts.Amount > 7500 | THEN TTCReceipts.Amount - 300 | ELSE TTCReceipts.Amount | END AS AmountWithDiscount | FROM |

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

Sintaxă: EXPRESS(Nume Câmp AS Nume Tip)

Exemplu de utilizare:

Query.Text = "SELECT VARIOUS | Sales.Registrar.Number, | SELECT | WHEN Sales.Registrar LINK Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | WHEN Sales.Registrar LINK Document.Implementation | THEN EXPRESS(Sales.Registrar AS Document.Implementation) |. END AS Număr |.

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, trebuie 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 Remaining |. Nomenclatură AS Nr. |.

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 |Acumulare 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 Remaining.Registrar LINK Document.Receipt of GoodsServices | THEN ""Chitare" |. ELSE ""Consum" |. END AS Tipul de Mișcare |.

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 se află î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. 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 o literă 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:

Solicitare.Text = //selectează înregistrările la care cititorul are drepturi "SELECTARE DIVERSE | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" ;

De asemenea, construcția VARIOUS poate fi utilizată 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”;

9. Design COMANDA DE- organizează datele după un anumit câmp. Dacă câmpul este o legătură, atunci când setați steag COMANDA AUTOMATA Sortarea va avea loc în funcție de reprezentarea link-ului dacă indicatorul este dezactivat, atunci linkurile sunt sortate după vechimea adresei link-ului în memorie.

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

Exemplu de utilizare:

Query.Text = "SELECT | Resturi libere. Nomenclator AS Nomenclator, | Resturi libere. Depozit AS Depozit, | Resturi libere rămase. În stoc rămase | DIN | Înregistrați acumulări. Resturi libere. Rămase AS gratuite rămase BY | COMANDA | |. Nomenclatura |.

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) AS INSTOCK |FROM | 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.Nomenclatură, |.

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 numai în mesele virtuale.

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

Exemplu de utilizare:

Request.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.WHRemains ERE |CompensationRPORemaining.CompensationRemaining<>0 | Și CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. Design REZULTATE... GENERAL- utilizat 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 utilizează totaluri pentru fiecare câmp după construcția TOTAL, datele sunt grupate. Există o construcție GENERAL opțională. Veți vedea un exemplu de rezultat al cererii mai jos.

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

Exemplu de utilizare:

Solicitare.Text = "SELECT | 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 Contrapartide Calcule AS |. TOTAL |. | GENERAL |

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.

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 acesta

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. Este imposibil să grupați după câmpuri cu 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ă vrem să primim informații de contact din registrul de informații ContactInformation și, în același timp, să indicăm într-un câmp separat de cerere 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 la utilizarea operatorului 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.

Î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 probleme 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 primire, 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.