Primerjava s praznim datumom v zahtevi 1s

Vsi dokumenti, ki obstajajo v konfiguracijah 1C, in posledično skoraj vsi registri morajo imeti vsaj en atribut z vrsto datuma, zato mora vsak razvijalec vedeti in razumeti:

  • Kako pretvoriti parametre drugih vrst v zadevno vrsto;
  • Kako določiti prazen datum v poizvedbi 1C;
  • Kakšna je razlika med datumom in časovno omejitvijo.

To so vprašanja, na katera bomo poskušali odgovoriti v našem članku.

Kaj je datum in kako ga določiti

Ker večina vodstvenih odločitev in računovodstva ne zahteva časovne natančnosti, ki presega 1 sekundo, so se razvijalci platforme 1C odločili, da bo ta vrednost najnižja omejitev v formatu datuma. Tako mora vsak atribut, ki opisuje čas dogodka v programu, vsebovati:

  • Leto dogodka;
  • Mesec tega dogodka;
  • dan.

Neobvezno: ura, minuta in sekunda. Če so ti trije parametri izpuščeni in ni dodatnih pogojev, program samodejno nastavi čas na začetek dneva.

Oblike datumov, ki obstajajo na svetu, imajo pomembno razliko:

  1. V Rusiji smo navajeni, da na prvo mesto postavimo dan, nato mesec dogodka in na koncu leto;
  2. Prebivalci ZDA začnejo datum z mesecem;
  3. Čehi, Poljaki in Slovenci beležijo obdobje v formatu »Leto – mesec – dan«.

To je zadnji format, ki ga uporablja platforma 1C.

Pretvori v datum

Če želite dobiti parameter z vrsto datuma iz več vrednosti ali iz niza, morate uporabiti kodo, prikazano na sl. eno

Kot je razvidno iz slike, lahko datum določite tako s pomočjo ene vrstice, z delitvijo te vrstice na njene sestavne dele z vejico pa se rezultat ne bo spremenil.

Pomembno je razumeti, da mora letnica datuma vsebovati štiri števke, vključno z tisočletjem in stoletjem dogodka, mesec, dan, ure in sekunde morajo biti dolgi dva znaka, vključno z vodilnimi ničlami.

Odštevanje v programu se začne od začetka dneva 1. januarja 0001. Za zgornjo kodo lahko to vrednost določimo na enega od dveh načinov (slika 2).

riž. 2

V drugi vrstici smo izpustili ure, minute in sekunde dogodka, kar pa ni niti najmanj vplivalo na delovanje naše kode.

Značilnosti uporabe datumov v poizvedbah 1C

Za večino podatkovnih tipov, ki jih uporablja platforma 1C, obstajajo vnaprej določene vrednosti void. Za številke je to 0, za povezave lahko določite vrednost EmptyReference(), za datume se datum začetka odštevanja šteje za prazna vrednost, z njim morajo biti podrobnosti ustrezne vrste primerjati pri nastavljanju parametrov poizvedbe.

Pomembno je razumeti, da tudi če v vrednosti atributa obrazca zadevne vrste ni podanih številk, torej okno izgleda tako (slika 3), to ne pomeni, da v njem ni nič navedeno, primerjava tega parametra s praznim nizom ne bo deloval.

riž. 3

Ko prejmemo prazen datum, ga lahko podamo kot parameter naši zahtevi, torej uporabimo konstrukcijo (slika 4)

Vendar pa obstajajo časi, ko je bolje preveriti v telesu zahteve, ne da bi kot parameter vnesli prazen datum. Če želite to narediti, lahko v kodo poizvedbe (slika 5) vnesete ustrezen pogoj in uporabite funkcijo poizvedbe DateTime().

riž. pet

V zgornjem besedilu zahteve smo izpustili vodilne ničle iz leta, meseca in dneva, prav tako nismo navedli ur, minut in sekund, program pa je, kot pravijo, to predpostavko pojedel.

Datum in časovna omejitev

Drugo zanimivo dejstvo v zvezi z razmerjem med poizvedbami in datumom je uporaba koncepta "časovne točke" pri sklicevanju na različne tabele baze podatkov.

Natančnost "do milisekunde", ki je navedena v tehnični dokumentaciji pri opisu primitivnega tipa Datum, se najbolj jasno kaže pri izbiri zapisov iz virtualnih tabel registra akumulacije: če ima akumulacijski register poleg tabele Promet Preglednice Remains in RemainsAnd Turnovers, potem lahko izbira na njih, izvedena za določen čas, daje različne rezultate.

Če želite razumeti, kako in zakaj se to zgodi, si oglejte preprost primer:

  1. Pred izvedbo prodajne listine ob 12. uri 31 minut 36 sekund so bila stanja po nomenklaturi Sladkor 30 kg;
  2. Dokument je ob navedenem času odpisal 10 kg;
  3. Poročilo, ustvarjeno na datum dokumenta ob 12 urah 31 minut 36 sekund po tabeli ostankov, bo prikazalo tehtnico 30 kg;
  4. V istem poročilu na tabeli Stanje in promet bo hkrati prikazano stanje 20 kg.

Kaj je razlog za to vedenje in kako se mu izogniti?

Težava je v tem, da je v tabeli Preostanki obdobje nastavljeno kot odprt segment, to pomeni, da se premiki, ki so bili izvedeni v času, ko je bilo poročilo ustvarjeno, niso upoštevani, torej se vzame čas na začetku sekundo, določeno v parametru. Hkrati se za tabelo Promet in za tabelo Preostanki in promet upoštevajo časovne omejitve, torej čas se vzame ob koncu določene sekunde.

Obstaja več izhodov iz te situacije:

  1. Ko uporabljate tabelo Residuals, podajte časovno točko, ki je 1 sekundo večja od podane;
  2. Uporabljajte samo tabelo Stanja in promet (ni najbolj optimalna možnost v smislu uspešnosti);
  3. Uporabite izraz meja.

Slednjo možnost lahko predstavimo s kodo, prikazano na sl. 6.

V prvem parametru našega objekta navedemo datum, za katerega naj se ustvari poročilo, drugi parameter določa vrsto meje. Ker je za nas pomembno, da so premiki na določen datum vključeni v izbor, moramo ta parameter nastaviti na položaj »Vključno«.

Zelo pogosto morate pri poizvedbah 1C delati z datumi. Še posebej, če je zahteva vgrajena v metapodatkovne objekte, ki vsebujejo periodične informacije. Praviloma so to registri (informacije, akumulacija, izračun, računovodstvo). Razmislite o najpogosteje uporabljenih funkcijah jezika poizvedb 1C za delo z datumi. Na podlagi informacijskega registra bomo zgradili primere EmployeesOrganizations ZUP konfiguracije različice 2.5.

  • DATUM ČAS

    Omogoča vam, da v poizvedbi dobite datum (s časom ali brez), tako da navedete leto, mesec, dan, uro, minuto, sekundo.
    sintaksa:
    DATETIME(leto, mesec, dan, ura, minuta, sekunda)
    Običajno ura, minuta in sekunda niso določeni. Vzemimo mini primer. V poizvedbeno konzolo vnesite naslednje besedilo:

    IZBIRA DATUM URA (2016, 1, 1)

    Kot rezultat poizvedbe dobimo datum - 01.01.2016
    Pravzaprav si je težko predstavljati situacijo, v kateri bo datum v zahtevi naveden na ta način. Konec koncev, ko morate določiti obdobje, se uporabljajo parametri. Toda obstaja primer, ko je ta funkcija posebne vrednosti. To je takrat, ko moramo v poljih ali v pogojih poizvedbe podati prazen datum. Naj vas spomnim, da je za jezik 1C prazen datum videti tako - 0001.01.01. Tako je za pridobitev praznega datuma v zahtevi dovolj, da navedete DATETIME(1, 1, 1). Za primer izberimo iz registra informacij EmployeesOrganizations evidence, ki niso izpolnjene Obdobje dokončanja:

    IZ registra informacij IZBERITE Zaposleni v organizacijah.Obdobje, Zaposleni v organizacijah.Zaposleni, Zaposleni v organizacijah.Položaj, Zaposleni v organizacijah.Oddelek organizacij IZ Registra informacij.Zaposleni v organizacijah KOT Uslužbenci organizacij KJE Zaposleni v organizacijah.Obdobje dokončanja(1 = DATUM ČAS 1, 1)

  • ZAČETEK OBDOBJA

    Za določen datum vrne začetek obdobja, ki mu pripada.
    sintaksa:
    ZAČETEK OBDOBJA (datum, vrsta obdobja)
    PeriodType ima lahko naslednje vrednosti: MINUTA, URA, DAN, TEDEN, MESEC, ČETRETJE, LETO, DESETLJETJE, POL LETA
    V konzolo za poizvedbe vnesite:

    IZBERITE ZAČETEK OBDOBJA(DATUM URA(2016, 1, 15), MESEC)

    Zahtevek se bo vrnil - 01.01.2016
    In zdaj primer. Kot veste, frekvenca registra EmployeesOrganizations nekega dne. Ustvarimo poizvedbo, v kateri bo namesto dejanskega obdobja zapisov prikazan datum začetka meseca.

    IZ Informacijskega registra IZBERITE ZAČETEK OBDOBJA (Zaposleni v organizacijah. Obdobje, MESEC) KAO Začetek meseca, Zaposleni v organizacijah. Zaposleni, Zaposleni v organizacijah. Položaj, Zaposleni v organizacijah. Oddelek organizacije IZ Informacijskega registra. Zaposleni v organizacijah AS Zaposleni v organizacijah

  • KONEC OBDOBJA

    Sintaksa je enaka kot za začetek obdobja. In kot pove že ime, vrne konec obdobja po datumu in vrsti obdobja. Ne bomo podrobno obravnavali. Omejujemo se na mini primer.
    povpraševanje:

    IZBERITE KONEC OBDOBJA(DATUM URA(2016, 1, 15), MESEC)

    Vrne 31.01.2016 23:59:59
    Kot lahko vidite, se vrednost vrne natančno na sekundo.

  • DODAJTE

    Datumu doda določeno število časovnih presledkov.
    sintaksa:
    DODAJ (datum, vrsta obdobja, število)
    PeriodType ima enake vrednosti kot za funkcijo ZAČETEK OBDOBJA
    Za primer vzemimo februar:

    IZBERITE DODATNI DATUM(DATUM URA(2016, 2, 15), MESEC, 2)

    Dobimo datum 15.04.2016 0:00:00 Kljub temu, da je februar kratek mesec, je dan prejetega datuma enak prvotnemu. Zelo priročno je, da vam ni treba razmišljati o številu dni v mesecih.
    Število je lahko tudi negativno. Nato se interval šteje v nasprotni smeri.

  • DATUMSKA RAZLIKA

    Izračuna razliko med dvema datumoma v določenih enotah.
    sintaksa:
    DATEDIFF(Datum začetka, Končni datum, Vrsta obdobja)
    Vrsta obdobja ima lahko naslednje vrednosti: SEKUNDA, MINUTA, URA, DAN, MESEC, ČETRETJE, LETO
    Na primer:

    IZBIRA DATUMSKA RAZLIKA(DATETIME(2016, 2, 15), DATETIME(2016, 3, 1), DAY)

    vrne 15

Tu so bile obravnavane najpogosteje uporabljene funkcije poizvedovalnega jezika 1C. Ostalo se redko uporablja. Če je potrebno, lahko najdete primere dela z njimi v pomoči, vgrajeni v platformo 1C.

Pri delu z datumi 1C je tipičen vrstni red delov datuma leto, mesec, dan, ura, minuta, sekunda. V tem primeru lahko preskočite ure, minute, sekunde.

Pri ustvarjanju datuma iz niza (»prenos na datum«) lahko podate v lokalizirani obliki (dan.mesec.leto ure:minute:sekunde), vendar le v celoti.

Na primer:
// Delo z datumi 1C - pretvori datum v 1C iz delov - leto, mesec, dan (plus neobvezni čas)
Datum = Datum(2012,10,30); //ni časa
Datum = Datum(2012,10,30,12,00,00); //s časom

//Delo z datumi 1C - pretvorite datum v 1C iz niza, na različne načine
Datum = Datum("20121030"); //leto, mesec, dan
Datum = Datum ("30. 10. 2012 12:00:00"); //lokalizirana oblika, samo polna

//Delo z datumi 1C - določanje vrednosti datuma brez ulivanja, neposredno
Datum = "20121030"; //ni časa
Datum = "20121030120000"; //s časom

Delo z datumi 1C - Prazen datum 1C

Za preverjanje polnosti datuma 1C ga primerjamo s "praznim datumom". Če je v imeniku/dokumentu atribut z vrsto datuma, če uporabnik tega polja ni izpolnil, bo njegova vrednost tudi “prazen datum”.

"Prazen datum" je 01.01.0001 00:00:00.

Na primer:
EmptyDate = "00010101000000";
Če je želeni datum = "00010101000000" Potem
alert("Niste izpolnili zahtevanega datuma");
EndIf;

Delo z datumi 1C - Datum v podrobnostih (imeniki, dokumenti itd.)

Ko podajate vrsto atributa, lahko določite uporabo:

  • Samo datum (čas je potem vedno 00:00:00)
  • Samo čas (datum je potem vedno 01.01.0001)
  • datum in čas

Pridobivanje datuma

Za pridobitev datuma in ure se uporablja funkcija 1C CurrentDate().

Kraj, kjer se ta funkcija kliče, je zelo pomemben - na odjemalcu ali na strežniku. Za podrobnosti glejte temo »Način izvajanja/čas izvajanja«. Pogosto se zgodi, da je čas na odjemalskih strojih nekoliko drugačen, zato poskušajo strežniški čas uporabiti povsod – tudi če na strežniku ni pravilno nastavljen, bodo imeli vsaj vsi odjemalci enak napačen čas.

Za pridobitev datuma strežnika (datuma, ki je nastavljen v operacijskem sistemu strežniškega računalnika), se običajno v konfiguraciji ustvari skupni modul s potrditvenim poljem "Server" v lastnostih in v njem se ustvari funkcija
//funkcija se nahaja v skupnem modulu, na primer z imenom ServerFunctions
// v lastnostih splošnega modula je nastavljeno potrditveno polje "Server" in potrditveno polje "Odjemalec" ni nastavljeno
Funkcija GetServerDate() Izvoz
Vrni trenutni datum();
Končne funkcije

// klic te funkcije za uporabo iz drugega modula izgleda takole
DocumentObject.Date = ServerFunctions.GetServerDate(); //ModuleName.FunctionName()

Prav tako je v tankem odjemalcu neposredno poleg funkcij modula označeno, kje se bo izvajal:

Začetek in konec dneva

Za datum "30.10.2012":

  • začetni datum dneva izgleda takole "10/30/2012 00:00:00"
  • datum konca dneva izgleda takole "30.10.2012 23:59:59"

Uporablja se v poročilih in poizvedbah, ki zahtevajo podatke za obdobje - dan, mesec, leto.

Na primer, obdobje od "01/01/2012 00:00:00" do "01/31/2012 00:00:00" ni pravilno, ker ne vključuje enega dneva v mesecu (vključuje pa eno sekundo zadnji dan v mesecu).

Delo z datumi 1C - Primerjava datumov

Datum vsebuje datum in čas. Pri primerjavi datumov (brez upoštevanja časa) se običajno pripeljejo na začetek dneva (mesec, leto).

Na primer:
Datum1 = Datum ("30. 10. 2012 12:00:00");
Če je začetni dan(Datum1) = Začetni dan(DokumentRef.Datum) Potem
alert("Dokument vnesen na določen datum");
EndIf;

Za vsak slučaj primer primerjave datumov v obdobju:
Če DocumentReference.Date >= MonthStart(TrenutniDatum()) in
Referenca dokumenta.Datum

Delo z datumi 1C - Spreminjanje datuma

Datum je število sekund. Če želimo ne le ugotoviti, ali je en datum večji od drugega, ampak tudi koliko več, potem dobimo razliko v sekundah.

Na primer:
Začetni dan = Trenutni datum() – Začetni dan(Trenutni datum());
Poročilo("Od začetka dneva je minilo" + String(FROMDayStart) + "sekunde");
Poročilo("Od začetka dneva je minilo " + Niz (OD začetka dneva / 60) + "minute");
Poročilo("Od začetka dneva je minilo " + Niz (OD začetka dneva / 60/60) + "ure");

Spremenimo lahko tudi datum, pri spreminjanju dodamo ali odštejemo število sekund:
StartThisDay = StartDay(TrenutniDatum());

ZačetekPrejšnjiDan = Začetni dan(ZačetekTaDan - 1); // odstrani drugo - delaš "včeraj" in vzemi začetek dneva od "včeraj"

StartPreviousDay = StartThisDay - 24*60*60; //drugače - odštej 24 ur - 24 (ure) * 60 (izkazale se minute) * 60 (sekunde)

Delo z datumi 1C - Trenutek časa

Časovna točka je razširjena predstavitev datuma, ki velja za dokumente (in s tem registre).

Če sta datum in ura dokumentov enaka, je treba primerjati čas dokumentov. V skladu s tem se lahko uporablja za izbore v poizvedbah.

Točko časa lahko dobite iz dokumenta na naslednje načine:
//metoda 1
DocumentTimeMoment = DocumentReference.MomentTime();

Točko v času lahko primerjate tudi z datumom/časom:
MomentInTimeReference = New MomentInTime(StartDay(TrenutniDatum()));
Če je DocumentReference.TimeIn().Compare(InTimeReference) = -1 Potem
Pokaži("Dokument je vnesen prej kot danes");
EndIf;
//Če je dokument vpisan z današnjim datumom ob 00:00:00, potem se vseeno vnese - danes

Delo z datumi 1C - Oblikovanje datumov

V tem članku bomo razpravljali o načinih preverjanja prazne vrednosti, odvisno od vrste atributa, ki se preverja v , vključno z ničelno referenco.

Vrednost NULL se vrne, ko atribut preprosto ne obstaja. Tip v tem primeru bo tudi NULL. Na primer, združite dve tabeli prek levega spoja. V primeru, da za levo tabelo v desni ne najdemo vrednosti, se vrne NULL.

Preverjanje te vrednosti se lahko izvede s konstrukcijo "IS NULL" in "". V prvem primeru se vrne True ali False. V drugem primeru lahko takoj nastavite drugo vrednost v primeru, ko se vrne NULL.

Spodnja poizvedba 1C 8.3 bo vrnila seznam kontaktnih oseb za tiste partnerje, ki nimajo nabora segmentov.

IZBERI
ContactPartners.Link
IZ
Imenik. Kontaktne osebe partnerjev AS Kontaktne osebe partnerjev
NOTRANJI SPOJ
PO ContactPartners.Owner = SegmentsPartners.Parent
KJE
SegmentsPartners.Reference JE NULL

prazen datum

Vrednost se preveri za prazen datum tako, da jo primerjamo s konstrukcijo DATETIME(1, 1, 1, 0, 0, 0). Spodaj je naveden primer uporabe:

Prazna povezava v zahtevi 1C

V primeru, ko ima vrnjeni atribut referenčni tip, na primer, je element nekega imenika, dokumenta itd., se uporabi naslednja konstrukcija: VALUE(Catalog.CatalogName.EmptyReference).

V spodnjem primeru poizvedba izbere vse partnerje, ki nimajo določene poslovne regije.

Če želite preveriti "ValueFilled", morate narediti nasprotni pogoj:

Partners.BusinessRegion<>VALUE(Catalog.BusinessRegions.EmptyReference)

Prazna vrstica

Za preverjanje vrst nizov se izvede primerjava z drugim vzorcem. V tem primeru - "".

Spodnja poizvedba bo izbrala vse partnerje s praznim imenom.

Ko je pogosto treba delati s spremenljivkami tipa "Datum". V tem članku si bomo ogledali glavne tehnike - prenos trenutnega datuma, preverjanje prazne vrednosti, poljuben datum.

Pri pisanju poizvedb je pogosto treba primerjati podatke s trenutnim datumom. Vgrajeni jezik 1C ima funkcijo CurrentDate(). Omogoča vam, da določite trenutni čas in datum na vašem računalniku. Za izvajanje operacij s trenutnim datumom je treba vrednost te funkcije posredovati zahtevi kot parameter.

Spodaj je poizvedba, ki izbere vse datoteke, priložene vnaprejšnjim poročilom z dosedanjim datumom ustvarjanja:

RequestExample = Nova zahteva;
Primer Zahteva.Besedilo ="
|IZBERI
| Predhodno poročilo AttachedFiles.Link
| OD
| Directory.Advance ReportAttachedFilesAS AdvanceReportAttachedFiles
|KJE
| Predhodno poročilo AttachedFiles.Date< &ТекДата»;
Primer poizvedbe.SetParameter("Trenutni datum", Trenutni datum());

poljuben datum

Zgoraj obravnavana funkcija vam omogoča primerjavo in s tem izbiro za katero koli obdobje. Ta metoda vam omogoča, da določite strogo izbiro v poizvedbi brez uporabe dodatnih parametrov.

Upoštevajte, da smo z uporabo te funkcije v zgornjem primeru posredovali samo tri številke (leto, mesec, dan) kot vhodne parametre. Zadnje tri (ura, minuta, sekunda) so neobvezne in, če jih ni, se nadomestijo z "0", torej z začetkom dneva.

V okviru tega primera bodo prejete vse datoteke, priložene vnaprejšnjim poročilom do konca lanskega leta 2016. V zvezi s tem bomo določili uro, minuto in sekundo za primerjavo s točko v času "31. december 2016 23:59:59".

IZBERI
Predhodno poročilo AttachedFiles.Link
IZ
Imenik.Priložene datoteke vnaprejšnjega poročila AS Priložene datoteke vnaprejšnjega poročila
KJE
Predhodno poročilo AttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

prazen datum

Najlažji način za preverjanje spremenljivke, ali vsebuje prazen datum, je preprosta primerjava. V tem primeru bomo s poizvedbo izbrali vse gotovinske prejemke na račun, ki nimajo izpolnjenega datuma prihoda.