1s dacă valoarea goală atunci. Convertiți la data

Acest articol va analiza modalități de a verifica o valoare goală în funcție de tipul de atribut verificat, inclusiv un link gol.

Valoarea NULL este returnată în cazul în care atributul pur și simplu nu există. Tipul în acest caz va fi, de asemenea, NULL. De exemplu, uniți două mese folosind o îmbinare stânga. În cazul în care nu se găsește nicio valoare în tabelul din dreapta pentru tabelul din stânga, va fi returnat NULL.

Verificarea acestei valori se poate face folosind construcțiile „IS NULL” și „ ”. În primul caz, este returnat True sau False. În al doilea caz, puteți seta imediat o valoare diferită în cazul în care este returnat NULL.

Solicitarea 1C 8.3 de mai jos va returna o listă de persoane de contact pentru acei parteneri care nu au un segment specificat.

ALEGE
Contact PersonsPartners.Link
DIN
Director. Persoane de contact ale partenerilor AS Persoane de contact ale partenerilor
INTERNAL JOIN Directory.Segmente de parteneri AS Segmente de parteneri
Persoane de contact software ale Partners.Owner = Segmente ale Partners.Parent
UNDE
Segmentele partenerului

Data goală

Valoarea este verificată pentru o dată goală, comparând-o cu construcția DATETIME(1, 1, 1, 0, 0, 0). Un exemplu de utilizare este dat mai jos:

Link gol în cererea 1C

În cazul în care atributul returnat este de tip referință, de exemplu, este un element al unui director, document etc., se folosește următoarea construcție: VALUE(Directory.DirectoryName.EmptyLink).

În exemplul de mai jos, interogarea selectează toți partenerii care nu au specificată o regiune de afaceri.

Pentru a verifica „ValueFilled” trebuie să faceți condiția opusă:

Parteneri.BusinessRegion<>VALUE(Directory.BusinessRegions.EmptyLink)

Linie goală

Pentru a verifica tipurile de șiruri, se face o comparație cu un alt eșantion. În acest caz - "".

Interogarea de mai jos va selecta toți partenerii cu un nume gol.

Când lucrează cu interogări, orice programator trebuie să interacționeze cu valori goale într-un fel sau altul. Ce înțelegem prin valoare goală?

O valoare nulă este fie nicio valoare, fie valoarea implicită pentru tipul de date. Cu tipurile primitive, totul este destul de simplu: valoarea implicită este o valoare inițială care servește ca punct de plecare.

Tipuri de valori nule

Să ne uităm la tipurile de valori goale care pot fi întâlnite sau necesare într-o interogare.

  • Pentru tipul Number, valoarea goală este zero – 0.
  • Pentru tipul String – un șir gol – „”.
  • Pentru tipul Data – 1 ianuarie a primului an – 01/01/0001 00:00:00. De la această dată, timpul este numărat în 1C.*
  • Pentru tipul boolean, valoarea implicită este din punct de vedere tehnic Fals, dar logic ambele valori ale tipului sunt completate. Prin urmare, a decide dacă o valoare goală este falsă sau nu se bazează pe logica unui anumit algoritm.

*Atenție, în afara 1C există diferite sisteme de numărare a datelor cu puncte de plecare diferite.

Valoarea lipsă corespunde pe deplin numai tipului Nul. Acest tip conține o singură valoare, ceea ce indică nicio valoare.

Tip similar Nedefinit conține de asemenea o singură valoare, dar Nedefinit nu înseamnă absența datelor, ci doar imposibilitatea determinării valorii implicite pentru tip. Undefined este valoarea implicită pentru tipurile compozite, inclusiv cele care nu sunt definite în mod explicit. De exemplu, o valoare dintr-un rând nou al unui tabel de valori dintr-o coloană pentru care tipul nu este definit în mod explicit.

Co referinţă tipuri există mult mai puțină incertitudine. Toate tipurile de referință oferă o valoare nulă. O valoare goală este aceeași referință care indică tipul de date, dar fără un identificator unic pentru valoarea specifică. Datorită acestui lucru, putem trata un link gol ca și cum ar fi unul obișnuit și putem aplica toate metodele oferite de platformă, lucrând cu el ca și cum ar fi o valoare cu drepturi depline.

Lucrul cu valori nule într-o interogare

Indiferent dacă trebuie să introduceți în mod explicit o valoare nulă într-un rezultat al unei interogări sau să comparați valorile existente cu o valoare nulă, trebuie să știți cum să descrieți valorile nule în interogarea dvs.

Tipuri Număr, șir, boolean sunt descrise în cerere ca în limbajul încorporat:

SELECT 0 AS ExampleTypeNumber, „Bună lume” AS ExampleTypeString, True AS ExampleTypeBoolean

Nedefinit, fiind în esență un tip primitiv, este descris în mod similar:

Selectați Batch.Period din Registrul de acumulare.Lot ca lot unde rămâne.DocumentBatch = Nedefinit

Valorile de referință goale sunt puțin mai dificil de definit. Toate obiectele de referință au o valoare de serviciu predefinită EmptyReference. Datorită acestui fapt, este posibil să selectați o legătură goală într-un singur mod - prin funcția Value:

Selectați Valoare(Directory.Nomenclature.EmptyLink) Cum se golește Nomenclatura

Posibilitățile de lucru cu valori Null sunt oarecum mai bogate. Ca și alte tipuri primitive, Null este descris în același mod ca și în limbajul încorporat. În plus, există un operator special Is Null și o funcție IsNull.

  • Operatorul Is Null vă permite să creați o expresie logică care compară valoarea selectată cu valoarea Null.
  • Funcția IsNull returnează primul argument dacă nu este Null, iar al doilea argument în caz contrar.

Expresiile care definesc valori goale pot fi folosite în orice secțiune de interogare care acceptă expresii. De exemplu, puteți adăuga un link gol la secțiunea Selectare sau o verificare Nulă la Condiție.

Exemple practice

Folosind funcția Value

Selectați Products.Link As Nomenclature, Products.Link = Value(Directory.Nomenclature.EmptyLink) Like ThisLinkEmpty From TueProducts As TueProducts

Folosind operatorul Este nul

Selectați Products.Link ca nomenclatură, Products.Link este nul ca acesta LinkEmpty din TueProducts As TueProducts

Null la stânga sau alăturare completă

Se verifică Null

Exemplul demonstrează o situație practică obișnuită când, cu o alăturare stângă, nu există nicio potrivire pentru prima masă în a doua. În acest caz, toate câmpurile celui de-al doilea tabel vor fi Nule.

Selectați TueProducts.Link As Nomenclature, Remains.QuantityRemaining As Cantitate, Remains.QuantityRemaining este nul ca NoRemaining din TueProducts ca TueProducts Conexiune din stânga RegisterAccumulations.ProductsInWarehouses.Remains As Remains By TueProducts.Link = Remains.Nomenclature

Gestionarea valorilor nule

Modificarea interogării anterioare pentru a demonstra o tehnică comună pentru obținerea unor valori implicite pentru a le înlocui pe cele lipsă. În acest exemplu, folosind funcția IsNull, valoarea rămasă lipsă este înlocuită cu un 0 corect logic.

Selectați TueProducts.Link As Nomenclature, IsNull (Remaining.QuantityRemaining, 0) As Quantity From TueProducts ca TueProducts Conexiune din stânga RegisterAccumulations.ProductsInWarehouses.Remains As Remains By TueProducts.Link = Remains.Nomenclature

În acest articol, am analizat diferite tipuri de valori goale și proprietățile acestora, am studiat modalități de definire a diferitelor tipuri de valori goale în interogări, iar în partea practică ne-am convins de ușurința de aplicare a materialului discutat.

Query.Text = "SELECT | UseStorageUnits.Link | FROM | Directory.useStorageUnits AS UseStorageUnits // Exemplul 1. comparație cu o valoare booleană goală: | WHERE | UseStorageUnits. Allow SelectionFromBackupZone = False // Exemplul 2. dar dacă acest boolean este definit , atunci este mai bine așa: // condiție pentru un boolean negativ: | NU unități de stocare Permite selecție din zona de rezervă // Exemplu 3. selecție bazată pe condiția unui câmp necompletat care are tipul „director. tip” |. WHERE |. Zona de selecție activă = VALOARE (Directoar). OurDocument.EmptyLink) // Exemplul 3b, documente de diferite tipuri" (câmp compus) | WHERE | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyLink) | SAU OurInformationRegister.Document = VALUE(DocumentLink).EmpDocument SAU...(etc. - listăm secvențial condițiile pentru toate tipurile posibile ale acestui câmp compus)) // Exemplul 4. sau invers, dacă trebuie să selectați o valoare completată de tipul „șir”, atunci condiția va ajuta: |. UNDE | StorageUnits.Name > """" // Exemplul 5. dacă trebuie să selectați documente de un anumit tip, cu un tip de date compus, de exemplu în registrul "RunningTasks", resursa "Task" are un tip compozit, printre valorile cărora este posibil documentul „Selectare” |UNDE | EXPRESS(Informații RegisterExecutedTasks.Task AS Document.Selection) LINK Document.Selection // Exemplul 5a. Un alt exemplu similar, când trebuie să selectați documente de un anumit tip | ALEGEREA | CÂND SE EXPRIMĂ (ag Corespondența Documentelor. DocumentBU AS Document. Recepția Bunurilor și Serviciilor) LINK Document Recepția Bunurilor și Serviciilor | ATUNCI ""Recepția de bunuri și servicii"" | CÂND SE EXPRIMĂ (ag Corespondența documentelor. DocumentBU AS Document. Vânzări de bunuri și servicii) LINK Document de vânzări de bunuri și servicii | APOI ""Vânzări de bunuri și servicii"" | ELSE """" | END AS DocumentView // Exemplu 6. selecție bazată pe condiția unei valori nedefinite: | SavedSettings.User = NEDEFINIT // Exemplu 7. selecția după tipul de mișcare „Incoming” a registrului de acumulare, „Cheltuială” - similar): | RegProductsInRetail.MovementType = VALUE(AccumulationMovementType.Receipt) // Exemplul 8. Cum se indică într-o solicitare că nu este necesar să se execute cererea (de exemplu, trebuie să întoarceți programatic, în funcție de anumite condiții, un rezultat al cererii necompletate - Cerere. Text = StrReplace(Query.Text, „WHERE Doc.Link = &DocumentLink”, „UNDE ESTE FALSE”);). Pentru a face acest lucru, trebuie doar să adăugați condiția „Unde este fals”. Apropo, indiferent de volumul de date solicitat în eșantion, o astfel de solicitare va fi executată instantaneu. |UNDE este FALS // Exemplul 9. Verificarea ca rezultatul unei interogări să conţină date: If NOT Query.Execute().Empty() Then // Exemplul 10. selectarea unei date goale: |WHERE | tbStrings.CancellationDate = DATETIME(1, 1, 1)

Toate documentele existente în configurații 1C și, în consecință, aproape toate registrele trebuie să aibă cel puțin un atribut cu tipul Date, motiv pentru care fiecare dezvoltator trebuie să cunoască și să înțeleagă:

  • Cum se convertesc parametrii de alte tipuri în tipul în cauză;
  • Cum să determinați o dată goală într-o cerere 1C;
  • Care este diferența dintre o dată și o limită de timp?

La aceste întrebări vom încerca să răspundem în articolul nostru.

Ce este o dată și cum să o determinăm

Deoarece luarea majorității deciziilor de management și păstrarea înregistrărilor nu necesită o precizie a timpului care depășește 1 secundă, dezvoltatorii platformei 1C au decis că această valoare ar fi minimul absolut în formatul de dată. Astfel, fiecare atribut care descrie ora unui eveniment din program trebuie să conțină:

  • Anul în care a avut loc evenimentul;
  • Luna acestui eveniment;
  • Zi.

Nu este necesar să indicați: oră, minut și secundă. Dacă acești trei parametri sunt omiși și nu există condiții suplimentare, programul setează automat ora la începutul zilei.

Formatele de date existente în lume au diferențe semnificative:

  1. În Rusia, suntem obișnuiți să punem întâi ziua, apoi luna evenimentului, iar la sfârșitul anului;
  2. Rezidenții SUA încep data cu luna;
  3. Cehii, polonezii și slovenii înregistrează perioade în formatul An – Lună – Zi.

Acesta din urmă format este pe care îl folosește platforma 1C.

Convertiți la data

Pentru a obține un parametru cu tipul Date din mai multe valori sau dintr-un șir, trebuie să utilizați codul prezentat în Fig. 1

După cum se poate vedea din figura de mai sus, puteți determina data fie folosind o linie, fie împărțind această linie în părțile sale componente folosind o virgulă, rezultatul nu se va schimba.

Este important de înțeles că anul datei trebuie să conțină patru cifre, inclusiv mileniul și secolul evenimentului, luna, ziua, orele și secundele trebuie să aibă două caractere, inclusiv zerourile inițiale.

Numărătoarea inversă a timpului din program începe de la începutul zilei de 1 ianuarie 0001. Pentru codul de mai sus, această valoare poate fi determinată într-unul din două moduri (Figura 2).

Orez. 2

În a doua linie, am omis orele, minutele și secundele evenimentului, ceea ce nu a afectat deloc performanța codului nostru.

Caracteristici de utilizare a datei în interogările 1C

Pentru majoritatea tipurilor de date utilizate de platforma 1C, există valori predefinite de gol. Pentru numere, acesta este 0 pentru legături, puteți defini valoarea EmptyLink() pentru o dată, valoarea goală este de obicei considerată data de început; setarea parametrilor de solicitare.

Este important de înțeles că, chiar dacă nu sunt specificate numere în valoarea unui atribut de formular care are tipul în cauză, adică fereastra arată ca (Fig. 3), aceasta nu înseamnă că nu este specificat nimic în ea; compararea acestui parametru cu un șir gol nu va funcționa.

Orez. 3

După ce am primit o dată goală, o putem specifica ca parametru la cererea noastră, adică să folosim construcția (Fig. 4)

Cu toate acestea, există momente când este mai bine să verificați în interiorul corpului cererii, fără a trece o dată goală ca parametru. Pentru a face acest lucru, puteți introduce condiția corespunzătoare în codul de solicitare (Fig. 5) și puteți utiliza funcția de solicitare DateTime().

Orez. 5

În textul de solicitare de mai sus, am omis zerourile de început ale anului, lunii și zilei și, de asemenea, nu am indicat orele, minutele și secundele, iar programul, după cum se spune, a distrus această presupunere.

Limită de dată și oră

Un alt fapt interesant referitor la relația dintre interogări și date este utilizarea conceptului de „punct în timp” la accesarea diferitelor tabele de baze de date.

Precizia „până la o milisecundă” specificată în documentația tehnică atunci când se descrie tipul de Date primitive se manifestă cel mai clar la selectarea înregistrărilor din tabelele virtuale ale registrului de acumulare: dacă registrul de acumulare, în plus față de tabelul Cifra de afaceri, are Remaining. și Tabelele rămase și Cifra de afaceri, apoi eșantionarea din acestea se efectuează pentru un anumit timp, poate da rezultate diferite.

Pentru a înțelege cum și de ce se întâmplă acest lucru, luați în considerare un exemplu simplu:

  1. Înainte ca documentul de vânzare să fie efectuat la 12 ore 31 minute 36 secunde, soldurile conform nomenclatorului zahărului erau de 30 kg;
  2. Documentul a șters 10 kg la ora specificată;
  3. Raportul generat la data documentului la 12 ore 31 minute 36 secunde conform tabelului rămas va arăta soldul de 30 kg;
  4. Același raport de pe masa Rămășițe și Cifra de afaceri pentru același timp va arăta un sold de 20 kg.

Care este motivul acestui comportament și cum să îl evitați?

Problema este că în tabelul Rest, perioada este specificată ca un segment deschis, adică mișcările efectuate în momentul generării raportului nu sunt luate în considerare, adică timpul este luat la începutul celui de-al doilea specificat. în parametru. Totodată, pentru tabelul Cifra de afaceri și pentru tabelul Rămășițe și Cifra de afaceri se iau în considerare limitele de timp, adică timpul se ia la sfârșitul secundei specificate.

Există mai multe căi de ieșire din această situație:

  1. Când utilizați tabelul Rămășițe, indicați un punct de timp cu 1 secundă mai mare decât cel specificat;
  2. Folosiți doar tabelul Resturi și Cifra de afaceri (nu cea mai optimă opțiune din punct de vedere al performanței);
  3. Utilizați conceptul de graniță.

Ultima opțiune poate fi reprezentată de codul prezentat în Fig. 6.

În primul parametru al obiectului nostru indicăm data pentru care trebuie generat raportul, al doilea parametru determină tipul de chenar. Deoarece este important pentru noi ca mișcările de la o anumită dată să fie incluse în selecție, trebuie să setăm acest parametru în poziția „Inclusiv”.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva