1s saab taotlusesse kuupäeva. Kuidas määrata päringus tühja kuupäeva? Teisenda kuupäevaks

Väga sageli peate 1C päringutes töötama kuupäevadega. Eriti kui päring on üles ehitatud metaandmeobjektidele, mis sisaldavad perioodilist teavet. Reeglina on need registrid (info, akumulatsioon, arvestus, raamatupidamine). Mõelge 1C päringukeele kõige sagedamini kasutatavatele funktsioonidele kuupäevadega töötamiseks. Ehitame näiteid 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:
    DATETIME (aasta, kuu, päev, tund, minut, sekund)
    Tavaliselt tundi, minutit ja sekundit ei täpsustata. Võtame väikese näite. Sisestage päringukonsooli järgmine tekst:

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

    Päringu 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 DATETIME(1, 1, 1). Näitena valime inforegistrist TöötajadOrganisatsioonid kirjed, mida ei täideta Valmimisperiood:

    SELECT Organisatsioonide töötajad.Periood, Organisatsioonide töötajad.Töötaja, Organisatsioonide töötajad.Ametikoht, Organisatsioonide töötajad.Organisatsioonide osakond FROM Teaberegistrist.Organisatsioonide töötajad AS Organisatsioonide töötajad WHERE Organisatsioonide töötajad.Valmisperiood (1, = DATETIME(1, = DATETIME) 1, 1)

  • PERIOODI ALGUS

    Määratud kuupäeva puhul tagastab perioodi alguse, millesse see kuulub.
    Süntaks:
    PERIOODI 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ÜMNEND, POOL AASTA
    Sisestage päringukonsooli:

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

    Taotlus tagastatakse - 01.01.2016
    Ja nüüd näide. Nagu teate, on registri sagedus TöötajadOrganisatsioonidüks päev. Koostame päringu, milles kuvatakse tegeliku arvestusperioodi asemel kuu alguse kuupäev.

    VALI PERIOODI ALGUS (Organisatsioonide töötajad.Periood, KUU) AS Kuu algus, Organisatsioonide töötajad.Töötaja, Organisatsioonide töötajad.Ametikoht, Organisatsioonide töötajad.Organisatsiooni osakond Inforegistrist.Organisatsioonide töötajad AS Organisatsioonide töötajad

  • LÕPPPERIOOD

    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.
    Taotlus:

    VALI LÕPPPERIOOD(KUUPÄEVKELLAAEG(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 ajapilu.
    Süntaks:
    LISAKUUPÄEV (kuupäev, perioodi tüüp, arv)
    PeriodType võtab samad väärtused mis funktsioonil PERIOODI ALGUS
    Võtame näiteks veebruari:

    VALI LISAKUUPÄEV(KUUPÄEV, KELLAAEG(2016, 2, 15), KUU, 2)

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

  • KUUPÄEVADE ERINEVUS

    Arvutab kahe kuupäeva erinevuse määratud ühikutes.
    Süntaks:
    DATEDIFF (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 käsitleti 1C päringukeele kõige sagedamini kasutatavaid funktsioone. Ülejäänuid kasutatakse harva. Vajadusel leiate näiteid nendega töötamise kohta 1C platvormi sisseehitatud abist.

Tüüp "Kuupäev" 1C-s on üks neljast peamisest andmetüübist koos numbri, stringi ja tõeväärtusega. Kuupäevad on konfiguratsioonides üldlevinud – selle andmetüübiga töötamist on arenduse ajal võimatu vältida. Seetõttu on parem alustada päringute kirjutamist, saades juba aru, kuidas kuupäevi töödelda, millised on nendega töötamise võimalused, kuidas neid salvestatakse. Vaatame näiteid kõigist erinevate kuupäevadega päringute kirjutamise nüanssidest.

Näited kuupäevadega töötamise kohta 1C päringutes

Esiteks peate päringusse hankima kuupäeva soovitud vormingus - koos ajaga või ilma. Selle ülesande täitmiseks on mitu võimalust:

  1. Läbi parameetri. See meetod on ainus viis praeguse seansi kuupäeva hankimiseks;
  2. Hankige päringus olev kuupäev valikuväljalt;
  3. Teisendage arvväärtustest funktsiooni DATETIME() abil.

Kõige tavalisem ülesanne dokumentidega töötamisel on tühja kuupäeva kontrollimine 1C päringus. Sel juhul on kõige lihtsam võrrelda muutujat või välja tühja kuupäevaga, mis saadakse funktsiooni DATETIME(1,1,1) abil:

DATETIME(1, 1, 1)

Sarnase käsuga saate päringusse suvalise kuupäeva ja kellaaja. Samal ajal saab neid määrata kuni sekundini, määrates parameetriteks 6 numbrit. Kui kasutatakse ainult 3 numbrit, seatakse tundideks, minutiteks ja sekunditeks 0 (päeva alguses). Näiteks peame päringus valima 2018. aasta jaanuari esimese 10 päeva dokumendid:

SELECT Kviitung Arvelduskontole.Viide AS Viide FROM Dokumendist.Kviitung Arvelduskontole AS Kviitung arvelduskontole WHERE Kviitung arvelduskontole.Kuupäev BETWEEN DATETIME(2018, 1, 1, 0, 0, 0) AND DATETIME(2018,1, 0) 10, 23, 59, 59)

Sisseehitatud 1C-keeles päringus saate mitte ainult valida erinevaid välju ega vastu võtta parameetreid. On palju funktsioone, mis muudavad kuupäeva vormindamise konkreetse ülesande jaoks lihtsaks. Kui töötate päringus sageli kuupäevadega, peaksite teadma järgmisi käske:

  • PERIOODI ALGUS. Parameetritena määrake kuupäev ja kellaaeg, mille kontekstis on vaja saada kuupäeva algus. Kasutatakse kuupäeva teisendamiseks ajatule vormingusse. Selleks peate määrama teise parameetri - "DAY";
PERIOOD ALGUS(,) PERIOD ALGUS(&Kuupäev, PÄEV) periood>kuupäev>
  • LÕPPPERIOOD. Sarnane käsk, mis tagastab viimase kuupäeva parameetrites määratud ühikute kontekstis;
  • LISADA. Võimaldab saada kuupäeva, mis on teatud arvu määratud ajaühikute võrra suurem. Kuupäev, ajaühik ja number on määratud funktsiooni parameetritena;
LISAKUUPÄEV(,) LISAKUUPÄEV(&Kuupäev, PÄEV, 10) loendus>tüüp>kuupäev>
  • KUUPÄEVADE ERINEVUS Saab kuupäevade erinevuse määratud ühikutes;
DATEDIFF(,) DATEDIFF(&Kuupäev1, &Kuupäev2, PÄEV) tüüp>kuupäev2>kuupäev1>
  • NÄDALAPÄEV. Tagastab ühe nädalapäeva järjekorranumbri.

Neid funktsioone õigesti rakendades saab arendaja lahendada üsna mittetriviaalseid ülesandeid. Näiteks praeguse kuupäeva nädalapäeva nime saamine päringus stringina:

SELECT WHENWEEKDAY(&CurrentDate) = 1 THEN "Esmaspäev" WHENWEEKDAY(&CurrentDate) = 2 THEN "Teisipäev" WHENWEEKDAY(&CurrentDate) = 3 THEN "Kolmapäev" WHENWEEKDAY(&CurrentDate) " WHEN DAYWEEK(&CurrentDate) = 6 THEN "laupäev" MUU "Pühapäev" LÕPP

1C päringu tüüpide teisendamine numbrist või stringist kuupäevaks on töömahukas ülesanne. Numbritest saate kuupäeva funktsiooni DATETIME abil, stringist - kombineerides funktsiooni SUBSTRING ja konstruktsiooni SELECT WHEN THEN ELSE. Sellest lähtuvalt eelistavad arendajad saada kuupäeva moodulis teistest tüüpidest ja edastada see päringule parameetri abil. Kahjuks ei ole see alati teostatav, seega peate taotluses kuupäeva vormingut muutma.

Virtuaalsete registri tabelitest andmete saamise parameetrina on võimalik 1C päringus määrata kuupäev. Selles rollis saate kasutada ka kõiki ülaltoodud funktsioone. Kuid siin on oluline vältida seda, et 1C päringu tühi kuupäev mõjutaks koodi täitmise lõpptulemust, seega on hädavajalik kontrollida.

1C päringutes ja ka platvormi 1C:Enterprise sisseehitatud keeles on kuupäevadega töötamise funktsioonid. Need aitavad lihtsustada kuupäevade teisendamist päringutes ja vältida suure hulga parameetrite kasutamist. Vaatleme neid funktsioone.

Kuidas määrata 1C päringutes kuupäev konstandiks

DATETIME (aasta, kuu, päev, tund, minut, sekund). Valikud Aasta, kuu ja päev on nõutavad, teised mitte. Kui te kellaaega ei määra, määrab süsteem päeva alguse.

Taotlus. Tekst= "VALI
DATETIME (2016,09,28,12,22,00)"
; // Tulemus: 28. september 2016 12:22:00

Lisaks saab selle funktsiooni parameetritena määrata ainult selgesõnalisi numbreid. Muude funktsioonide väärtusi ei saa parameetritena määrata. Näiteks see konstruktsioon ei tööta:

Taotlus. Tekst= "VALI
DATETIME(aasta(allikas.kuupäev),09,28,12,22,00)
Alates Directory.Source AS Source"
;

Kuidas saada 1C päringutes aasta algust või lõppu, poolaastat, kvartalit, kuud, kümnendit, nädalat, päeva, tundi, minutit

Selleks kasutatakse järgmisi funktsioone:

  • Algusperiood (kuupäev, periood)
  • Lõppperiood(kuupäev, periood)

Parameetrina kuupäev edastatud väärtus koos tüübiga Kuupäev. Parameeter Periood .

Taotlus. Tekst= "VALI
Algusperiood(DATETIME(2016;09;28;12;22,00), DEKAAD)"
; // Tulemus: 21. september 2016 0:00:00

Taotlus. Tekst= "VALI
Lõppperiood(DATETIME(2016;09;28;12;22,00), KVARTALI)"
; // Tulemus: 30. september 2016 23:59:59

Nagu näidetest näha, saab nendes funktsioonides kasutada ka muid pesastatud funktsioone.

Kuidas saada 1C päringutes kuupäevast aasta, aastapäev, kvartal, kuu, nädal, nädalapäev, päev, tund, minut, sekund

Selleks on olemas vastavad funktsioonid, milles peate parameetrina edastama kuupäeva.

  • Funktsioon YEAR (kuupäev)- tagastab aastanumbri;
  • Funktsioon AASTA PÄEV (kuupäev)- tagastab aasta päeva numbri;
  • Funktsioon KVARTALI (kuupäev)- tagastab kvartali numbri;
  • Funktsioon KUU (kuupäev)- tagastab kuu numbri;
  • Funktsioon NÄDAL (kuupäev)- tagastab aasta nädala numbri;
  • Funktsioon NÄDALA PÄEV (kuupäev)- tagastab nädala päeva numbri (esmaspäev - 1, pühapäev - 7);
  • Funktsioon PÄEV (kuupäev)- tagastab kuu päeva numbri;
  • Funktsioon HOUR (kuupäev)- tagastab tunni;
  • Funktsioon MINUT (kuupäev)- tagastab minuteid;
  • Funktsioon TEINE (kuupäev)- tagastab sekundid.

Taotlus. Tekst= "VALI
YEAR(DATETIME(2016,09,28,12,22,00))"
; // Tulemus: 2016

Taotlus. Tekst= "VALI
NÄDAL(KUUPÄEVKELLAAEG(2016,09,28,12,22,00))"
; // Tulemus: 40

Taotlus. Tekst= "VALI
DAYWEEK(DATETIME(2016,09,28,12,22,00))"
; // Tulemus: 3

Taotlus. Tekst= "VALI
PÄEVAAASTA(KUUPÄEV AEG(2016,09,28,12,22,00))"
; // Tulemus: 272

Taotlus. Tekst= "VALI
DAY(DATETIME(2016,09,28,12,22,00))"
; // Tulemus: 28

Kuidas lisada või lahutada kuupäevast aasta, poolaasta, kvartal, kuu, kümnend, nädal, päev, tund, minut, sekund 1C päringutes

Selleks kasutatakse funktsiooni AddKDate(kuupäev, periood, väärtus).

Parameetrina kuupäev edastatud väärtus koos tüübiga Kuupäev. Parameeter Periood võib võtta ühe järgmistest väärtustest: TEINE, MINUT, TUND, PÄEV, NÄDAL, KÜMND, KUU, KVARTALI, POOLAASTA, AASTA.

Parameeter Tähendus näitab lisatud perioodide arvu. Kui periood on vaja lahutada, siis parameeter Tähendus peab olema negatiivne.

Taotlus. Tekst= "VALI
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0), POOL AASTAT, 1)"
; // Tulemus: 28. märts 2017 12:22:00

Taotlus. Tekst= "VALI
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0), DECAD, -1)"
; // Tulemus: 18. september 2016 12:22:00

Kuidas arvutada kuupäevade erinevust 1C päringutes

Selleks kasutatakse funktsiooni ErinevusKuupäev(kuupäev1, kuupäev2, periood).

Parameeter Kuupäev1 on kuupäev, mis tuleb lahutada.

Parameeter Kuupäev2 - kuupäev, millest lahutada.

Parameeter Periood võib võtta ühe järgmistest väärtustest: TEINE, MINUT, TUND, PÄEV, KUU, KVARTALI, AASTA. See näitab, millistes ühikutes me tahame tulemust saada

Taotlus. Tekst= "VALI
Erinevus KUUPÄEV(KUUPÄEV KELLAAEG(2016, 9, 28, 12, 22, 0), KUUPÄEV AEG(2017, 9, 28, 12, 22, 0), KVARTALI)"
; // Tulemus: 4

Taotlus. Tekst= "VALI
Erinevus KUUPÄEV(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME(2017, 9, 28, 12, 22, 0), sekund)"
; // Tulemus: 31 536 000

Kõikides funktsioonides peale funktsiooni KUUPÄEV KELLAAEG, parameetrina kuupäev võib olla mitte ainult konkreetne kuupäeva väärtus (konstant või päringu parameeter), vaid ka lähtetabeli väljad.

Kõigil 1C konfiguratsioonides eksisteerivatel dokumentidel ja sellest tulenevalt peaaegu kõigil registritel peab olema vähemalt üks atribuut kuupäevatüübiga, 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ühja kuupäeva;
  • Mis vahe on kuupäeval ja kellaajal.

Need on küsimused, millele püüame oma artiklis vastata.

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

Kuna enamik juhtimisotsuseid ja raamatupidamist ei nõua aja täpsust, mis ületab 1 sekundi, otsustasid 1C platvormi arendajad, et see väärtus on kuupäevavormingu miinimumpiir. Seega peab iga programmi sündmuse aega kirjeldav atribuut 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 esikohale panema päeva, siis sündmuse kuu ja lõpus aasta;
  2. USA elanikud alustavad kuupäeva kuuga;
  3. Tšehhid, poolakad ja sloveenid salvestavad perioodi formaadis "Aasta - Kuu - Päev".

Just viimast vormingut kasutab 1C platvorm.

Teisenda kuupäevaks

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

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

Oluline on mõista, et kuupäeva aasta peab sisaldama nelja numbrit, sealhulgas sündmuse aastatuhandet ja sajandit, kuu, päev, tunnid ja sekundid peavad koosnema kahest tähemärgist, sealhulgas eesolevatest nullidest.

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

Riis. 2

Teisel real jätsime välja sündmuse tunnid, minutid ja sekundid, mis ei mõjutanud meie koodi jõudlust vähimalgi määral.

Kuupäevade kasutamise omadused 1C päringutes

Enamiku 1C platvormi poolt kasutatavate andmetüüpide jaoks on eelnevalt määratletud tühised väärtused. Numbrite puhul on see 0, linkide puhul saab defineerida väärtuse EmptyReference(), kuupäeva puhul loetakse pöördloenduse alguse kuupäev tühjaks väärtuseks, sellega kaasnevad ka vastavat tüüpi andmed tuleb päringu parameetrite määramisel võrrelda.

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

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 saab sisestada päringukoodi (joonis 5) vastava tingimuse ja kasutada päringufunktsiooni DateTime().

Riis. 5

Taotluse antud tekstis jätsime aasta, kuu ja päeva eesolevad nullid välja ning ei määranud ka tunde, minuteid ja sekundeid ning programm, nagu öeldakse, sõi selle oletuse ära.

Kuupäev ja ajapiirang

Veel üks huvitav fakt päringute ja kuupäeva vahelise seose kohta on ajahetke mõiste kasutamine erinevatele andmebaasitabelitele viidates.

Tehnilises dokumentatsioonis primitiivse tüübi Date kirjeldamisel märgitud täpsus "kuni millisekund" avaldub kõige selgemalt akumulatsiooniregistri virtuaalsetest tabelitest kirjete valimisel: kui akumulatsiooniregistris on lisaks käibe tabelile ka Jääkide ja jääkide ja käivete tabelid, siis teatud aja jooksul tehtud valik nendes võib anda erinevaid tulemusi.

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

  1. Enne müügidokumendi rakendamist kell 12 tundi 31 minutit 36 ​​sekundit olid saldod nomenklatuuri Suhkur järgi 30 kg;
  2. Dokument kandis märgitud ajal maha 10 kg;
  3. Aruanne, mis on koostatud dokumendi kuupäeval kell 12 tundi 31 minutit 36 ​​sekundit vastavalt Jäägi tabelile, näitab tasakaalu 30 kg;
  4. Sama aruanne saldode ja käivete tabelis samal ajal näitab saldo 20 kg.

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

Probleem on selles, et tabelis Remains on periood seatud avatud segmendiks, see tähendab, et aruande koostamise ajal tehtud liikumisi ei võeta arvesse, st aega võetakse aruande algusest. parameetris määratud teine. Samal ajal võetakse tabeli Käibe ning Jääkide ja Käibe tabeli 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äärake ajapunkt, mis on 1 sekundi võrra suurem kui määratud;
  2. Kasutage ainult saldode ja käibe tabelit (toimivuse seisukohalt mitte kõige optimaalsem variant);
  3. Kasutage terminit ääris.

Viimast võimalust saab esitada joonisel fig. 6.

Meie objekti esimeses parameetris märgime kuupäeva, mille kohta aruanne tuleb genereerida, teine ​​parameeter määrab piiri tüübi. Kuna meie jaoks on oluline, et antud kuupäeva liikumised oleksid valikus, peame selle parameetri seadma asendisse “Kaasa arvatud”.