1c funktsioonid päringus kuupäevadega töötamiseks. Kuidas määrata päringus tühja kuupäeva? Teisenda kuupäevaks

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 soovitud vormingu kuupäeva - 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(,) PERIOOD 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 hankimise 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 päringutes kuupäevade teisendamist 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. Te ei saa parameetritena määrata muude funktsioonide väärtusi. 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 aastat, aastapäeva, kvartalit, kuud, nädalat, nädalapäeva, päeva, tundi, minutit, sekundit

Selleks on vastavad funktsioonid, milles tuleb parameetrina kuupäev edastada.

  • Funktsioon YEAR (kuupäev)- tagastab aasta numbri;
  • 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ÄEVKELLAAEG(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, DEKAAD, 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 AASTA, 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(KUUPÄEV KELLAAEG(2016, 9, 28, 12, 22, 0), KUUPÄEV AEG(2017, 9, 28, 12, 22, 0), sekund)"
; // Tulemus: 31 536 000

Kõigis funktsioonides, välja arvatud funktsioon KUUPÄEV KELLAAEG, parameetrina kuupäev võib olla mitte ainult konkreetne kuupäevaväärtus (konstant või päringu parameeter), vaid ka lähtetabeli väljad.

43
NULL – puuduvad väärtused. Mitte segi ajada nulliga! NULL ei ole arv, ei võrdu tühikuga, nullviide, määratlemata. NULL on tüüpi moodustav väärtus, st. on NULL-tüüp ja seda tüüpi üks väärtus. NULL... 26
1C platvormi andmebaasi tabelite päringute moodustamiseks ja täitmiseks kasutatakse programmeerimiskeele Request spetsiaalset objekti. See objekt luuakse konstruktsiooni New Request kutsumisega. Mugav soov... 18
Artiklis on kasulikke nippe 1C v.8.2 päringutega töötamiseks, samuti teavet, mis päringukeele kohta pole nii hästi teada. Ma ei püüa anda päringukeele täielikku kirjeldust, vaid tahan keskenduda ainult ... 13
LIKE – operaator, mis kontrollib, kas string on mustriga sarnane. LIKE analoog SQL-is. Operaator LIKE võimaldab võrrelda sellest vasakul määratud avaldise väärtust paremal määratud mallistringiga. Avaldise väärtus...

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 platvormi 1C 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, et esikohale pannakse päev, 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 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 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 platvormi 1C 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äevade puhul loetakse pöördloenduse alguse kuupäev tühjaks väärtuseks, just sellega peavad olema vastavat tüüpi andmed. 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 poleks 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 sisu ilma tühja kuupäeva parameetrina sisestamata. Selleks saab sisestada päringukoodi (joonis 5) vastava tingimuse ja kasutada päringufunktsiooni DateTime().

Riis. 5

Taotluse ülaltoodud tekstis jätsime aasta, kuu ja päeva eesolevad nullid välja ning ei täpsustanud 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 selgemini akumulatsiooniregistri virtuaalsetest tabelitest kirjete valimisel: kui akumulatsiooniregistris on lisaks tabelile Käive Jääkide ja Jääkide Ja Käibete 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ääkide 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, st aruande koostamise ajal tehtud liikumisi ei võeta arvesse, st aega võetakse aruande algusest. parameetris määratud teine. Samas käibe ja käibe tabeli puhul võetakse 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 valikut 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”.