Verificați că data este goală. Convertiți la data

Destul de des este nevoie să lucrați cu variabile de tip „Date”. În acest articol ne vom uita la tehnicile de bază - trecerea datei curente, verificarea unei valori goale, a unei date arbitrare.

Când scrieți interogări, deseori trebuie să comparați datele cu data curentă. Limbajul 1C încorporat are funcția CurrentDate(). Vă permite să determinați ora și data curente pe computer. Pentru a efectua operațiuni cu data curentă, trebuie să treceți valoarea acestei funcții ca parametru la cerere.

Mai jos este o interogare care selectează toate fișierele atașate rapoartelor de cheltuieli cu o dată de creare până în prezent:

ExampleRequest = Solicitare nouă;
Exemplu Request.Text = "
|SELECT
| AdvanceReportAttachedFiles.Link
|DIN
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
|UNDE
| AdvanceReportAttachedFiles.Date< &ТекДата»;
Exemplu Request.SetParameter("CurrentDate", CurrentDate());

Data personalizată

Funcția discutată mai sus vă permite să comparați și, prin urmare, să faceți o selecție pentru orice perioadă. Această metodă vă permite să specificați o selecție strictă în cerere fără a utiliza parametri suplimentari.

Vă rugăm să rețineți că atunci când utilizați această funcție în exemplul de mai sus, am trecut doar trei numere (an, lună, zi) ca parametri de intrare. Ultimele trei (oră, minut, secundă) sunt opționale și, dacă lipsesc, sunt înlocuite cu „0”, adică începutul zilei.

Acest exemplu va prelua toate fișierele atașate rapoartelor de cheltuieli până la sfârșitul anului trecut 2016. În acest sens, vom indica ora, minutul și secunda pentru a compara punctul de timp „31 decembrie 2016 23:59:59”.

ALEGE
AdvanceReportAttachedFiles.Link
DIN
Directory.AdvanceReportAttachedFiles AS AdvanceReportAttachedFiles
UNDE
AdvanceReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Data goală

Cel mai simplu mod de a verifica o variabilă pentru a vedea dacă aceasta conține o dată goală este să utilizați o comparație simplă. În acest exemplu, folosind o interogare, vom selecta toate încasările de numerar în contul pentru care data de intrare nu este completată.

Când lucrați cu date 1C, ordinea tipică a părților date este an, lună, zi, oră, minute, secunde. În acest caz, pot fi sărite ore, minute, secunde.

Când creați o dată dintr-un șir („cast to date”), o puteți specifica într-un format localizat (zi.lună.an ore:minute:secunde), dar numai în întregime.

De exemplu:
//Lucrul cu date 1C - convertiți o dată în 1C din părți - an, lună, zi (plus ora opțională)
Data = Data(2012,10,30); //nu este timp
Data = Data(2012,10,30,12,00,00); //cu timpul

//Lucrul cu date 1C - convertiți o dată în 1C dintr-un șir, diferite metode
Data = Data("20121030"); //an lună zi
Data = Data("30/10/2012 12:00:00"); //format localizat, doar integral

//Lucrul cu date 1C - specificarea valorii datei fără turnare, direct
Data = "20121030"; //nu este timp
Data = "20121030120000"; //cu timpul

Lucrul cu date 1C - Data goală 1C

Pentru a verifica completarea datei 1C, aceasta este comparată cu „data goală”. Dacă în cartea/documentul de referință există un atribut cu tipul de dată, dacă utilizatorul nu completează acest câmp, atunci valoarea acestuia va fi și „data goală”.

„Data goală” este 01/01/0001 00:00:00.

De exemplu:
EmptyDate = "00010101000000";
Dacă RequiredDate = "00010101000000" atunci
Raport(„Nu ați completat o dată foarte necesară”);
endIf;

Lucrul cu datele 1C - Data în detalii (directoare, documente etc.)

Când specificați tipul de atribut, puteți specifica să utilizați:

  • Doar data (ora este atunci întotdeauna 00:00:00)
  • Numai oră (data este atunci întotdeauna 01/01/0001)
  • Data si ora

Obținerea datei

Pentru a obține data și ora, utilizați funcția 1C CurrentDate().

Locul unde este numită această funcție este foarte important - pe client sau pe server. Pentru mai multe informații, consultați subiectul „Mod de performanță/Performanță”. Se întâmplă adesea ca timpul de pe mașinile client să fie ușor diferit, așa că încearcă să folosească ora serverului peste tot - chiar dacă este setat incorect pe server, atunci cel puțin toți clienții vor avea aceeași oră incorectă.

Pentru a obține data serverului (data setată în sistemul de operare al computerului server), de obicei este creat un modul comun în configurație cu caseta de selectare „Server” bifată în proprietăți și este creată o funcție în el
//funcția este localizată într-un modul comun, de exemplu cu numele Server Functions
//în proprietățile modulului comun caseta de selectare „Server” este bifată și caseta de selectare „Client” nu este bifată
Funcția GetServerDate() Export
Returnează data curentă();
EndFunction

//apelarea acestei funcții pentru utilizare dintr-un alt modul arată astfel
DocumentObject.Date = ServerFunctions.GetServerDate(); //ModuleName.FunctionName()

Tot in thin client, direct langa functiile modulului, este indicat unde va fi executat:

Începutul și sfârșitul zilei

Pentru data „30.10.2012”:

  • data de începere a zilei arată astfel „30/10/2012 00:00:00”
  • data de sfârșit a zilei arată astfel: „30/10/2012 23:59:59”

Folosit în rapoarte și interogări care necesită obținerea de date pentru o perioadă - zi, lună, an.

De exemplu, perioada de la „01/01/2012 00:00:00” la „31/01/2012 00:00:00” este incorectă deoarece nu include o zi a lunii (dar include o secundă de ultima zi a lunii).

Lucrul cu datele 1C - Compararea datelor

Data conține data și ora. La compararea datelor (fără a lua în considerare timpul), acestea sunt de obicei reduse la începutul zilei (lună, an).

De exemplu:
Data1 = Data("30/10/2012 12:00:00");
Dacă StartDay(Date1) = StartDay(DocumentLink.Date) Atunci
Notify("Documentul a fost introdus la data specificată");
endIf;

Pentru orice eventualitate, un exemplu de comparare a datelor dintr-o perioadă:
Dacă DocumentLink.Date >= Începutul lunii(CurrentDate()) și
DocumentLink.Date

Lucrul cu datele 1C - Modificarea datei

Data este numărul de secunde. Dacă vrem nu numai să aflăm dacă o dată este mai mare decât alta, ci și cât de mai mare, atunci obținem diferența în secunde.

De exemplu:
FromBeginning Of Day = CurrentDate() – Beginning Of Day(CurrentDate());
Raport ("De la începutul zilei " + Linia (De la începutul zilei) + " au trecut secunde");
Raport("De la începutul zilei " + Line(De la începutul zilei/60) + " au trecut minute");
Raport ("De la începutul zilei " + Linia (De la începutul zilei/60/60) + " au trecut ore");

De asemenea, putem schimba data; atunci când schimbăm, adunăm sau scădem numărul de secunde:
StartThisDay = StartDay(CurrentDate());

Start ofPreviousDay = Start ofDay (StartofThisDay – 1); //eliminați a doua - făcând „ieri” și luați începutul zilei din „ieri”

Începutul zilei precedente = Începutul acestei zile – 24*60*60; //o altă metodă - scade 24 de ore - 24 (ore) * 60 (minute) * 60 (secunde)

Lucrul cu datele 1C - Moment în timp

Un punct în timp este o reprezentare extinsă a unei date care se aplică documentelor (și, prin urmare, registrelor).

Este necesar să se compare ora documentelor dacă data și ora documentelor sunt aceleași. În consecință, poate fi utilizat pentru selecție în interogări.

Un punct de timp poate fi obținut dintr-un document în următoarele moduri:
//metoda 1
DocumentTimePoint = DocumentLink.TimeTime();

De asemenea, puteți compara un punct în timp cu o dată/oră:
TimePointReference = New TimePoint(Începutul zilei(CurrentDate()));
Dacă DocumentRef.TimePoint().Compare(TimeTimeReference) = -1 Atunci
Notify("Documentul a fost introdus mai devreme decât astăzi");
endIf;
//Dacă un document este introdus cu data de astăzi la 00:00:00, atunci este încă introdus - astăzi

Lucrul cu datele 1C - Formatarea datei

Instrumente pentru identificarea legăturilor, a datelor sau a șirurilor goale. Să vedem cum să verificați dacă există un link, o dată sau o linie goală într-o solicitare 1C.

Puteți defini date nule utilizând operatori speciali.

Informațiile din baza de date 1C sunt solicitate (și apoi primite) folosind un instrument precum limbajul de interogare (Query). Sunt scrise în latină și chirilică. Iar una dintre comenzile de cuvinte cheie (operatorii) atunci când se primesc informații este cuvântul de comandă SELECT (engleză) în combinație cu unele construcții. Iată exemple de construire a sarcinilor solicitate care ne interesează pe această temă:

Se verifică conținutul NULL

Această sarcină este efectuată de operatorul SELECT în combinație cu construcția „IS NULL”:

SELECTAȚI
Comenzi Rămâne.Client,
ComenziRemaining.QuantityRemaining
DIN
ÎnregistrareAcumulări.Comenzi.Rămâne AS OrdersRemains
UNDE
OrdersRemaining.QuantityRemaining ESTE NULL

Controlul datei

O dată goală într-o solicitare 1C este introdusă folosind construcția „DATETIME(1, 1, 1, 0, 0, 0)”:

SELECTAȚI
InvoiceIncomingSupplier.Link,
Factura Furnizor Sosire Data sosirii
DIN
Document. Factură furnizor AS Factură furnizor
UNDE
InvoiceIncomingSupplier.IncomingDate = DATETIME(1, 1, 1, 0, 0, 0)

Verificare de referință

Valorile intra-referință inexistente (pentru planuri de conturi, directoare etc.) sunt verificate folosind construcția „VALUE(Directory.Name…EmptyLink)”:

Verificarea șirurilor

Liniile goale sunt detectate folosind un spațiu între ghilimele „”:

SELECTAȚI
Cumpărători.Link
DIN
Director Cumpărători AS Cumpărători
UNDE
Buyers.Code = ""

Mai multe despre link-urile întrerupte și regulate

Un „liliac” este o legătură care duce (punctează) către un element inexistent. Prin inexistent înțelegem unul care nu se află în baza de date. Este util să știți despre astfel de link-uri, cel puțin pentru a primi notificări de la sistem într-o formă mai ușor de înțeles. Și înregistrarea, ștergerea și deschiderea obiectelor ireale nu are sens.

Platformele 1C nu au mijloace interne pentru a le întrerupe. De asemenea, trebuie să înțelegeți că în afara celor „defectate”, există „legături goale” speciale în sistem, care ar trebui să fie distinse unele de altele.
Acesta poate fi găsit fără a interoga baza de date:

În sistemul 1C-7.7

Pentru „bit”, metoda Link.Selected() și funcția EmptyValue() returnează zero. Pentru „gol” - în primul caz este zero, iar în al doilea caz este unul. Pentru „normal” - unu și zero. Se pare că în 1C-7.7 „rupt” nu este o valoare inexistentă care nu este considerată selectată.

În sistemul 1C-8.x

Totul este diferit - în ambele cazuri (pentru „rupt” și „normal”) metoda returnează False, iar funcția returnează True. Soluția este următoarea: pentru metoda „întreruptă”, metoda Link.GetObject() returnează funcția „Nedefinit”. Pentru „gol” - „Eroare de metodă de context” este aruncată. Pentru „normal” - valoarea este returnată conform documentației; Se dovedește că în 1C-8.x cel „rupt” nu va fi o funcție inexistentă de tip referință care returnează o valoare a obiectului nedefinit.

De unde vin ei

Când navighează către o adresă inexistentă a unui link întrerupt, utilizatorului i se arată, în cel mai bun caz, o notificare că obiectul nu a fost găsit, în cel mai rău caz, o imagine a paginii serverului. Cea mai proastă trăsătură a lor este secretul lor. De aici și dificultatea de a verifica corectitudinea acestora. În timpul lucrului cu configurația, aceasta este rafinată și actualizată în mod constant. Unele obiecte trebuie șterse, structura se modifică. Iar referința la elementul șters rămâne în structuri și algoritmi. Astfel, adresele inexistente rămân în sistem după ce elementul în sine (împreună cu adresa) este șters.

Publicația de astăzi a analizat construcția specială a interogărilor. Sunt date exemple de design. Acest lucru va fi util atunci când căutați valori goale.

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ă a fi data de început; cu aceasta trebuie comparate detaliile tipului corespunzător atunci când 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”.

Foarte des în interogările 1C trebuie să lucrați cu datele. Mai ales atunci când solicitarea se face către obiecte de metadate care conțin informații periodice. De regulă, acestea sunt registre (informații, acumulare, calcul, contabilitate). Să ne uităm la cele mai frecvent utilizate funcții ale limbajului de interogare 1C pentru lucrul cu date. Vom construi exemple pe baza registrului de informații AngajatiOrganizatii Configurații ZUP versiunea 2.5.

  • DATA ORA

    Vă permite să obțineți o dată într-o solicitare (cu sau fără oră) specificând anul, luna, ziua, ora, minutul, secunda.
    Sintaxă:
    DATETIME(Anul, Luna, Ziua, Ora, Minutul, Secunda)
    De obicei, ora, minutul și secunda nu sunt indicate. Să dăm un mini exemplu. Introduceți următorul text în Consola de interogări:

    SELECTARE DATETIME (2016, 1, 1)

    Ca urmare a executării cererii, obținem data - 01/01/2016
    De altfel, este greu de imaginat o situație în care data să fie indicată astfel într-o cerere. La urma urmei, atunci când trebuie să specificați o perioadă, sunt utilizați parametrii. Dar există un caz când această funcție are o valoare deosebită. Acesta este momentul în care trebuie să indicăm o dată goală în câmpurile sau în condițiile de solicitare. Permiteți-mi să vă reamintesc că pentru limba 1C o dată goală are forma - 0001.01.01. Astfel, pentru a obține o dată goală într-o cerere, trebuie doar să specificați DATETIME(1, 1, 1). De exemplu, să selectăm din registrul de informații AngajatiOrganizatiiînregistrări care nu sunt completate Perioada de finalizare:

    SELECTAȚI angajați organizaționali.Perioadă, angajați organizaționali.Angajați, angajați organizaționali.Posiție, angajați organizaționali.Divizia organizațională FROM Informații de înregistrare.Angajații organizaționali ca angajați organizaționali WHERE Angajații organizaționali.Perioada de finalizare = DATETIME(1, 1, 1)

  • ÎNCEPUT DE PERIOADA

    Pentru data specificată, returnează începutul perioadei căreia îi aparține.
    Sintaxă:
    ÎNCEPUTUL PERIOADEI (Data, Tipul perioadei)
    PeriodType poate lua următoarele valori: MINUT, ORA, ZI, SĂPTĂMÂNĂ, LUNA, TRIMESTRE, AN, DECENIU, JUMĂTATE DE AN
    În Consola de interogări, introduceți:

    SELECTARE ÎNCEPUTUL PERIOADAI(DATETIME(2016, 1, 15), MONTH)

    Solicitarea va reveni - 01.01.2016
    Și acum un exemplu. După cum știți, periodicitatea registrului AngajatiOrganizatiiîntr-o zi. Să creăm o interogare în care va fi afișată data de începere a lunii în loc de perioada reală de înregistrare.

    SELECTAȚI ÎNCEPUTUL PERIOADEI(Angajații organizațiilor.Perioada, LUNA) AS Începutul lunii, angajații organizațiilor.Angajații, angajații organizațiilor.Poziția, angajații organizațiilor.Divizia organizației DIN Registrul informații.Angajații organizațiilor ca angajații organizațiilor

  • SFÂRȘIT DE PERIOADA

    Sintaxa este aceeași ca pentru începutul perioadei. Și după cum sugerează și numele, returnează sfârșitul perioadei după dată și tipul perioadei. Nu o vom lua în considerare în detaliu. Să ne limităm la un mini exemplu.
    Cerere:

    SELECTAȚI sfârșitul perioadei(DATETIME(2016, 1, 15), MONTH)

    Revine 31.01.2016 23:59:59
    După cum puteți vedea, valoarea este returnată exact la secundă.

  • ADDKDATE

    Adaugă la dată numărul specificat de intervale de timp.
    Sintaxă:
    ADDKDATE(Data, PeriodType, Cantitate)
    PeriodType ia aceleași valori ca și pentru funcție ÎNCEPUT DE PERIOADA
    De exemplu, să alegem data din februarie:

    SELECTAȚI ADDKDATE(DATETIME(2016, 2, 15), MONTH, 2)

    Primim data 15/04/2016 0:00:00 În ciuda faptului că februarie este o lună scurtă, ziua datei primite este aceeași cu cea inițială. Este foarte convenabil să nu trebuie să te gândești la numărul de zile în luni.
    Cantitatea poate fi și negativă. Apoi intervalul este numărat în sens invers.

  • DATA DIFERENTATA

    Calculați diferența dintre două date în unitățile specificate.
    Sintaxă:
    DIFERENTĂ DE DATE (Data de început, Data de încheiere, Tipul perioadei)
    Tipul perioadei poate lua următoarele valori: AL DOILEA, MINUT, ORA, ZI, LUNA, TRIMESTRE, AN
    De exemplu:

    SELECTAȚI DATA DIFERENTĂ(DATETIME(2016, 2, 15), DATETIME(2016, 3, 1), DAY)

    revine 15

Aici am analizat cele mai frecvent utilizate funcții ale limbajului de interogare 1C. Restul sunt folosite destul de rar. Dacă este necesar, exemple de lucru cu aceștia pot fi găsite în ajutorul încorporat în platforma 1C.