Võrdlus tühja kuupäevaga 1c päringus

Kõikidel 1C konfiguratsioonides olemasolevatel dokumentidel ja seetõttu peaaegu kõigil registritel peab olema vähemalt üks muutuja tüübiga kuupäev, mistõttu peab iga arendaja teadma ja mõistma:

  • Kuidas teisendada muud tüüpi parameetreid kõnealuseks tüübiks;
  • Kuidas määrata 1C päringus tühi kuupäev;
  • Mis vahe on kuupäeval ja kellaajal.

Just nendele küsimustele püüame oma artiklis vastata.

Mis on kuupäev ja kuidas seda määrata

Kuna enamik juhtimisotsuseid ja raamatupidamist ei nõua ajatäpsust üle 1 sekundi, otsustasid 1C platvormi arendajad, et see väärtus on kuupäevavormingus maksimaalne miinimum. Seega peab iga muutuja, mis kirjeldab programmi sündmuse toimumise aega, sisaldama:

  • Sündmuse toimumise aasta;
  • Selle sündmuse kuu;
  • päev.

Valikuline: tund, minut ja sekund. Kui need kolm parameetrit ära jätta ja lisatingimusi pole, seab programm kellaaja automaatselt päeva algusele.

Maailmas olemasolevatel kuupäevavormingutel on oluline erinevus:

  1. Venemaal oleme harjunud panema esikohale päeva, seejärel sündmuse kuu ja lõpus - aasta;
  2. USA elanikud alustavad kuupäeva kuuga;
  3. Tšehhid, poolakad ja sloveenid kirjutavad perioodi vormingus “Aasta – kuu – päev”.

See on viimane vorming, mida 1C platvorm kasutab.

Teisenda kuupäevaks

Kuupäevatüübiga parameetri saamiseks mitmest väärtusest või stringist peate kasutama joonisel fig. 1

Nagu ülaltoodud jooniselt näha, saab kuupäeva määrata nii ühe rea abil kui ka selle rea koma abil osadeks jagades tulemus ei muutu.

Oluline on mõista, et kuupäeva aastaarv peab sisaldama nelja numbrit, sealhulgas sündmuse aastatuhande ja sajandi, kuu, päeva, tundide ja sekundite arv – peab olema kahe tähemärgi pikkune, sealhulgas eesolevad nullid.

Programmis algab loendus 1. jaanuaril 0001 päeva algusest. Ülaltoodud koodi puhul saab selle väärtuse määrata kahel viisil (joonis 2).

Riis. 2

Teises reas jätsime välja sündmuse tunnid, minutid ja sekundid, mis ei mõjutanud kuidagi meie koodi jõudlust.

Kuupäeva kasutamise omadused 1C päringutes

Enamiku 1C platvormi kasutatavate andmetüüpide jaoks on eelnevalt määratletud tühised väärtused. Numbrite puhul on see 0, linkide puhul saab määrata väärtuse EmptyReference (), kuupäeva puhul on tavaks lugeda alguskuupäeva tühjaks väärtuseks, just sellega tuleb võrrelda vastava väärtuse üksikasju. tüüp päringu parameetrite määramisel.

Oluline on mõista, et isegi kui kõnealuse tüübi vormiatribuudi väärtuses pole näidatud numbreid, st aken näeb välja selline (joonis 3), ei tähenda see, et selles pole midagi määratud. selle parameetri võrdlemine tühja stringiga ei toimi.

Riis. 3

Pärast tühja kuupäeva saamist saame selle oma päringu parameetrina määrata, st kasutada konstruktsiooni (joonis 4)

Siiski on aegu, kus on parem kontrollida päringu keha seest ilma tühja kuupäeva parameetrina sisestamata. Selleks saate sisestada päringu koodis vastava tingimuse (joonis 5) ja kasutada päringu DateTime funktsiooni ().

Riis. 5

Antud päringutekstis jätsime ära aasta, kuu ja päeva eesotsad nullid, samuti ei märkinud tunde, minuteid ja sekundeid ning programm, nagu öeldakse, sõi selle oletuse ära.

Kuupäeva ja kellaaja piir

Veel üks huvitav fakt päringute ja kuupäevade vahelise seose kohta on ajahetke kontseptsiooni kasutamine erinevatele andmebaasitabelitele viidates.

Tehnilises dokumentatsioonis primitiivse Kuupäevatüübi kirjeldamisel märgitud täpsus "kuni millisekund" avaldub kõige selgemalt akumulatsiooniregistri virtuaalsetest tabelitest kirjete valimisel: kui akumulatsiooniregistris on lisaks tabelile Käibe tabelid Jäänud ja Jäänud. ja Käibed, siis nende jaoks teatud aja jooksul tehtud valik võib anda erinevaid tulemusi.

Et mõista, kuidas ja miks see juhtub, kaaluge lihtsat näidet:

  1. Enne müügidokumendi vormistamist kell 12 tundi 31 minutit 36 ​​sekundit olid suhkru nomenklatuuri järgi jäägid 30 kg;
  2. Dokumenti märgitud ajal kanti maha 10 kg;
  3. Aruanne, mis on koostatud dokumendi kuupäeva seisuga 12 tundi 31 minutit 36 ​​sekundit vastavalt Saldode tabelile, näitab ülejäänud 30 kg;
  4. Sama aruanne tabelis Jäägid ja Käibed samal ajal näitab jääki 20 kg.

Mis on sellise käitumise põhjus ja kuidas seda vältida?

Probleem on selles, et tabelis Remains on periood määratud avatud segmendiga, see tähendab, et aruande koostamise ajal tehtud liikumisi ei võeta arvesse, st aega võetakse teise määratud alguses. parameetris. Samal ajal võetakse tabeli Turns ja Remaining AND Käive puhul arvesse ajalimiite, st aega võetakse määratud sekundi lõpus.

Sellest olukorrast on mitu väljapääsu:

  1. Jääkide tabeli kasutamisel märkige määratud ajast 1 sekundi võrra suurem ajapunkt;
  2. Kasutage ainult tabelit Jäägid ja Käibed (mitte toimivuse seisukohalt kõige optimaalsem variant);
  3. Kasutage piiri mõistet.

Viimast valikut saab esitada joonisel fig. 6.

Meie objekti esimeses parameetris märgime kuupäeva, millal on vaja aruanne genereerida, teine ​​parameeter määrab piiri tüübi. Kuna meie jaoks on oluline, et valimisse kaasataks antud kuupäeva liikumised, peame selle parameetri seadma asendisse "Kaasa arvatud".

Väga sageli peate 1C taotlustes töötama kuupäevadega. Eriti kui päring on koostamisel metaandmeobjektidele, mis sisaldavad perioodilist teavet. Reeglina on need registrid (info, akumulatsioon, arvestus, raamatupidamine). Vaatleme 1C päringukeele kõige sagedamini kasutatavaid funktsioone kuupäevadega töötamiseks. Näiteid ehitatakse inforegistri põhjal TöötajadOrganisatsioonid ZUP-i konfiguratsioonide versioon 2.5.

  • KUUPÄEV KELLAAEG

    Võimaldab teil saada päringus oleva kuupäeva (koos ajaga või ilma), määrates aasta, kuu, päeva, tunni, minuti, sekundi.
    Süntaks:
    KUUPÄEV KELLAAEG (aasta, kuu, päev, tund, minut, sekund)
    Tavaliselt tundi, minutit ja sekundit ei täpsustata. Toome väikese näite. Sisestage päringukonsooli järgmine tekst:

    VALI KUUPÄEV KELLAAEG (2016, 1, 1)

    Päringu täitmise tulemusena saame kuupäeva - 01.01.2016
    Tegelikult on raske ette kujutada olukorda, kus kuupäev sel viisil päringus ära märgitakse. Lõppude lõpuks, kui peate perioodi määrama, kasutatakse parameetreid. Kuid on juhtumeid, kui see funktsioon on eriti väärtuslik. See on siis, kui peame määrama väljadele või päringutingimustele tühja kuupäeva. Lubage mul teile meelde tuletada, et 1C keele puhul näeb tühi kuupäev välja selline - 0001.01.01. Seega, et päringus oleks tühi kuupäev, piisab täpsustamisest KUUPÄEV KELLAAEG (1, 1, 1)... Näitena valime inforegistrist TöötajadOrganisatsioonid kanded, mida ei täideta Valmimisaeg:

    SELECT Organisatsioonide töötajad Periood, Organisatsioonide töötajad Töötaja, Organisatsioonide töötajad Ametikoht, Organisatsioonide töötajad Organisatsiooni allüksus Inforegistrist Organisatsioonide töötajad AS Organisatsioonide töötajad WHERE Organisatsioonide töötajad.

  • PERIOODI ALGUS

    Tagastab selle perioodi alguse, millesse see määratud kuupäeval kuulub.
    Süntaks:
    PERIOOD ALGUS (kuupäev, perioodi tüüp)
    PeriodType võib võtta järgmisi väärtusi: MINUT, TUND, PÄEV, NÄDAL, KUU, KVARTALI, AASTA, KÜMNDE, POOLAASTA
    Sisestage päringukonsooli:

    VALI PERIOODI ALGUS (KUUPÄEV KELLAAEG (2016, 1, 15), KUU)

    Soov tagastatakse - 01.01.2016
    Nüüd näiteks. Nagu teate sagedust registris TöötajadOrganisatsioonidüks päev. Koostame päringu, milles kuvatakse kehtiva arvestusperioodi asemel kuu alguse kuupäev.

    VALI PERIOODI ALGUS (Organisatsioonide töötajad. Periood, KUU) Kuu alguseks Organisatsioonide töötajad Töötaja, Organisatsioonide töötajad Ametikoht, Organisatsioonide töötajad Organisatsiooni allüksus.

  • PERIOODI LÕPP

    Süntaks on sama, mis perioodi alguse puhul. Ja nagu nimigi ütleb, tagastab see perioodi lõpu kuupäeva ja perioodi tüübi järgi. Me ei kaalu üksikasjalikult. Piirdume väikese näitega.
    Päring:

    VALI PERIOODI LÕPP (KUUPÄEV KELLAAEG (2016, 1, 15), KUU)

    Tagastab 31.01.2016 23:59:59
    Nagu näete, tagastatakse väärtus sekundi täpsusega.

  • LISADA

    Lisab kuupäevale määratud arvu ajavahemikke.
    Süntaks:
    LISA KUUPÄEVALE (kuupäev, perioodi tüüp, arv)
    PeriodType aktsepteerib samu väärtusi, mis funktsiooni puhul PERIOODI ALGUS
    Võtame näiteks veebruarikuu kuupäeva:

    VALI LISA KUUPÄEVALE (DATETIME (2016, 2, 15), MONTH, 2)

    Kuupäevaks saame 15.04.2016 0:00:00 Vaatamata sellele, et veebruar on lühike kuu, on saadud kuupäeva päev sama, mis originaalil. See on väga mugav, et ei pea mõtlema päevade arvule kuudes.
    Arv võib olla negatiivne. Seejärel loendatakse intervalli vastupidises suunas.

  • ERINEVUS

    Arvutab kahe kuupäeva erinevuse määratud ühikutes.
    Süntaks:
    KUUPÄEVADE DIFFERENCE (alguskuupäev, lõppkuupäev, perioodi tüüp)
    Perioodi tüüp võib võtta järgmisi väärtusi: TEINE, MINUT, TUND, PÄEV, KUU, KVARTALI, AASTA
    Näiteks:

    VALI KUUPÄEVA ERINE (KUUPÄEV KELLAAEG (2016, 2, 15), KUUPÄEV KELLAAEG (2016, 3, 1), PÄEV)

    tagastab 15

Siin vaadeldi 1C päringukeele kõige sagedamini kasutatavaid funktsioone. Ülejäänuid kasutatakse harva. Vajadusel leiate näiteid nendega töötamise kohta 1C platvormi sisseehitatud abist.

1C kuupäevadega töötamisel on tüüpiline kuupäevaosade järjekord aasta, kuu, päev, tund, minutid, sekundid. Sel juhul saab vahele jätta tunde, minuteid, sekundeid.

Stringist kuupäeva loomisel ("cast to date") saate määrata lokaliseeritud vormingus (päev.kuu.aasta tunnid: minutid: sekundid), kuid ainult täielikult.

Näiteks:
// 1C kuupäevadega töötamine - teisendage kuupäev osadest 1C-ks - aasta, kuu, päev (pluss valikuline aeg)
Kuupäev = Kuupäev (2012,10,30); // pole aega
Kuupäev = Kuupäev (2012,10,30,12,00,00); //ajaga

// 1C kuupäevadega töötamine – teisendage kuupäev stringist 1C-ks, erinevatel viisidel
Kuupäev = kuupäev ("20121030"); // aasta, kuu, päev
Kuupäev = kuupäev ("30.10.2012 12:00:00"); // lokaliseeritud vorming, ainult täismahus

// 1C kuupäevadega töötamine – kuupäeva väärtuse määramine ilma ülekandmiseta, otse
Kuupäev = "20121030"; // pole aega
Kuupäev = "20121030120000"; //ajaga

Kuupäevadega 1C töötamine – tühi kuupäev 1C

1C kuupäeva täiuse kontrollimiseks võrreldakse seda "tühja kuupäevaga". Kui teatmeteoses/dokumendis on kuupäevatüübiga atribuut, kui kasutaja ei ole seda välja täitnud, siis on ka selle väärtuseks “tühi kuupäev”.

"Tühi kuupäev" on 01.01.0001 00:00:00.

Näiteks:
EmptyDate = "00010101000000";
Kui RequiredDate = "00010101000000", siis
Raport ("Te ei ole täitnud väga vajalikku kuupäeva");
EndIf;

Kuupäevadega töötamine 1C – kuupäev üksikasjades (teatmikud, dokumendid jne)

Atribuudi tüübi määramisel saate määrata kasutuse:

  • Ainult kuupäev (kell on siis alati 00:00:00)
  • Ainult kellaaeg (kuupäev on siis alati 01.01.0001)
  • Päev ja aeg

Kuupäeva saamine

Kuupäeva ja kellaaja hankimiseks kasutage funktsiooni 1C CurrentDate ().

Väga oluline koht on see, kus seda funktsiooni kutsutakse – kliendis või serveris. Täpsemalt vaadake teemat "Jõudlusrežiim / Jõudlus". Tihti juhtub, et kellaaeg on klientmasinatel veidi erinev, mistõttu püütakse igal pool kasutada serveriaega – isegi kui see pole serveris õigesti seadistatud, siis on vähemalt kõigil klientidel sama vale aeg.

Serveri kuupäeva (serverarvuti operatsioonisüsteemis määratud kuupäeva) saamiseks luuakse tavaliselt konfiguratsioonis ühine moodul, mille atribuutides on märgitud ruut "Server" ja selles luuakse funktsioon.
// funktsioon asub ühises moodulis, näiteks nimega ServerFunctions
// ühise mooduli atribuutides on märkeruut "Server" ja märkeruut "Klient" pole määratud
Funktsioon GetServerDate () Eksport
Return CurrentDate ();
EndFunction

// selle funktsiooni kutsumine kasutamiseks teisest moodulist näeb välja selline
DocumentObject.Date = ServerFunctions.GetServerDate (); //ModuleName.FunctionName ()

Samuti on õhukeses kliendis otse moodulite funktsioonidest näidatud, kus see käivitatakse:

Päeva algus ja lõpp

Kuupäeva "30.10.2012" jaoks:

  • päeva alguskuupäev näeb välja selline "30/10/2012 00:00:00"
  • lõppkuupäev näeb välja selline "30/10/2012 23:59:59"

Seda kasutatakse aruannetes ja päringutes, mis nõuavad andmeid perioodi – päev, kuu, aasta – kohta.

Näiteks periood 01/01/2012 00:00:00 kuni 31/01/2012 00:00:00 on vale, kuna see ei sisalda ühte kuu päeva (kuid see sisaldab ühte sekundit viimasest kuu päev).

Kuupäevadega töötamine 1C – Kuupäevade võrdlemine

Kuupäev sisaldab kuupäeva ja kellaaega. Kuupäevade võrdlemisel (kellaaeg välja arvatud) tuuakse need tavaliselt päeva (kuu, aasta) algusesse.

Näiteks:
Kuupäev1 = kuupäev ("30.10.2012 12:00:00");
Kui StartDay (Date1) = Alguspäev (DocumentRef.Date) Siis
Aruanne ("Dokument sisestati määratud kuupäevaks");
EndIf;

Igaks juhuks näide perioodi kuupäevade võrdlemisest:
Kui DocumentRef.Date> = Alguskuu (CurrentDate ()) ja
DocumentRef.Date

Kuupäevadega töötamine 1C – Kuupäeva muutmine

Kuupäev on sekundite arv. Kui tahame mitte ainult teada saada, kas üks kuupäev on teisest suurem, vaid ka kui palju rohkem, siis saame vahe sekundites.

Näiteks:
DayStart = CurrentDate () - DayStart (CurrentDate ());
Raport ("Kuna päeva algus on möödas" + String (Päeva algusest) + "sekundid");
Raport ("Alates päeva algusest on möödas" + String (Päeva algusest / 60) + "minutid");
Raport ("Alates päeva algusest on möödas" + String (Päeva algusest / 60/60) + "tunnid");

Samuti saame muuta kuupäeva, muutmisel lisame või lahutame sekundite arvu:
StartThisDay = alguspäev (praegune kuupäev ());

BeginningPreviousDay = BeginningDay (BeginningThisDay – 1); // eemaldage teine ​​- tehes "eile" ja võtke päeva algus "eilsest"

StartPreviousDay = StartThisDay - 24 * 60 * 60; // teine ​​viis - lahutame 24 tundi - 24 (tunnid) * 60 (minutid selgus) * 60 (sekundit)

Kuupäevadega töötamine 1C – ajahetk

Ajahetk on dokumentidele (ja vastavalt ka registritele) kohaldatav pikendatud kuupäeva esitus.

Dokumentide esitamise kellaaega on vaja võrrelda, kui dokumentide kuupäev ja kellaaeg on samad. Sellest lähtuvalt saab seda kasutada päringute filtreerimisel.

Ajahetke saab dokumendist hankida järgmistel viisidel:
// 1. meetod
DocumentMomentTime = DocumentRef.Timepoint ();

Samuti saate võrrelda ajahetke kuupäeva/kellaajaga:
Moment of Time Status = uus ajahetk (päeva algus (praegune kuupäev ()));
Kui DocumentRef.MomentTime (). Võrdle (TimeTimeStandard) = -1 Siis
Raport ("Dokumenti tutvustati varem kui täna");
EndIf;
// Kui dokument sisestati tänaseks kuupäevaks 00:00:00, siis sisestati see ikkagi - täna

Kuupäevadega töötamine 1C – Kuupäeva vormindamine

Selles artiklis vaadeldakse nullväärtuse kontrollimise viise olenevalt registreeritava atribuudi tüübist, sealhulgas nulllingist.

Väärtus NULL tagastatakse siis, kui rekvisiite lihtsalt pole. Sel juhul on tüüp samuti NULL. Näiteks ühendate kaks tabelit vasakpoolse ühenduse kaudu. Juhul, kui paremas vasakpoolses tabelis ei leitud väärtusi, tagastatakse NULL.

Selle väärtuse kontrollimiseks saab kasutada konstruktsioone "IS NULL" ja "". Esimesel juhul tagastab see tõese või vale. Teisel juhul saate NULL tagastamise korral kohe määrata erineva väärtuse.

Allolev taotlus 1C 8.3 tagastab kontaktisikute loendi nende partnerite jaoks, kellel pole määratud segmenti.

VALI
Kontaktpartnerid.Link
FROM
Kataloog.Partneride kontaktisikud KUI PARTNERI KONTAKTISIKUD
SISEMINE ÜHENDUS Kataloog.SegmentsPartners AS SegmentsPartners
Tarkvarapartneri kontaktid.Omanik = Partner Segments.Parent
KUS
Partner Segments.Ref ON NULL

Tühi kuupäev

Tühja kuupäeva valideerimine viiakse läbi, võrreldes seda DATE TIME (1, 1, 1, 0, 0, 0) konstruktsiooniga. Kasutamise näide on toodud allpool:

Tühi link 1C taotluses

Juhul, kui tagastatud atribuudil on näiteks viitetüüp, see on mõne sõnastiku, dokumendi vms element, kasutatakse järgmist konstruktsiooni: VALUE (Directory.ReferenceName.EmptyRef).

Allolevas näites valib päring kõik partnerid, kellel pole äripiirkonda määratud.

"ValueFilled" kontrollimiseks peate tegema vastupidise tingimuse:

Partnerid.Äripiirkond<>VÄÄRTUS (kataloog.Äriregioonid.Tühilink)

Tühi rida

Stringitüüpide kontrollimiseks tehakse võrdlus teise mustriga. Sel juhul - "".

Allolev päring valib kõik tühja nimega partnerid.

Mingil hetkel tekib vajadus töötada "Kuupäeva" tüüpi muutujatega. Selles artiklis vaatleme põhilisi tehnikaid - praeguse kuupäeva edastamine, tühja väärtuse kontrollimine, suvaline kuupäev.

Päringute kirjutamisel on sageli vaja võrrelda andmeid jooksva kuupäevaga. Sisseehitatud 1C keeles on CurrentDate () funktsioon. See võimaldab teil määrata arvutis praeguse kellaaja ja kuupäeva. Praeguse kuupäevaga toimingute tegemiseks on vaja päringu parameetrina edastada selle funktsiooni väärtus.

Allpool on päring, mis valib kõik kuluaruannetele lisatud failid, mille loomise kuupäev on praegu:

NäideRequest = Uus taotlus;
NäideRequest.Text = "
| VALI
| Advance Report Attached Files.Link
| ALT
| Reference.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
| KUS
| Advance Report Attached Files.Date< &ТекДата»;
ExampleRequest.SetParameter ("CurrentDate", CurrentDate ());

Kohandatud kuupäev

Ülaltoodud funktsioon võimaldab teil võrrelda ja seega teha valiku mis tahes perioodi kohta. See meetod võimaldab teil määrata päringus range valiku ilma täiendavaid parameetreid kasutamata.

Pange tähele, et kasutades seda funktsiooni ülaltoodud näites, edastasime sisendparameetritena ainult kolm numbrit (aasta, kuu, päev). Viimased kolm (tund, minut, sekund) on valikulised ja puudumisel asendatakse 0-ga, st päeva algusega.

Selle näite puhul saate kõik kuluaruannetele lisatud failid kuni eelmise 2016. aasta lõpuni. Sellega seoses märgime ära tunni, minuti ja sekundi, et võrrelda ajahetkega "31. detsember 2016 23:59:59".

VALI
Advance Report Attached Files.Link
FROM
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles
KUS
Advance Report Attached Files.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Tühi kuupäev

Lihtsa võrdlusega on muutujat kõige lihtsam kontrollida, kas see sisaldab tühja kuupäeva. Selles näites valime päringu abil kõik raha laekumised pangakontole, mille laekumise kuupäeva ei täideta.