1c sjekker datoen er tom. Konverter til dato

Ganske ofte er det behov for å jobbe med variabler av typen "Dato". I denne artikkelen vil vi se på de grunnleggende teknikkene - passere gjeldende dato, se etter en tom verdi, en vilkårlig dato.

Når du skriver spørringer, må du ofte sammenligne data med gjeldende dato. Det innebygde 1C-språket har CurrentDate()-funksjonen. Den lar deg bestemme gjeldende klokkeslett og dato på datamaskinen. For å utføre operasjoner med gjeldende dato, må du sende verdien av denne funksjonen som en parameter til forespørselen.

Nedenfor er en spørring som velger alle filer vedlagt utgiftsrapporter med en opprettelsesdato frem til nå:

ExampleRequest = Ny forespørsel;
Eksempel Request.Text = "
|VELG
| AdvanceReportAttachedFiles.Link
|FRA
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
|HVOR
| AdvanceReportAttachedFiles.Date< &ТекДата»;
Eksempel Request.SetParameter("CurrentDate", CurrentDate());

Egendefinert dato

Funksjonen diskutert ovenfor lar deg sammenligne og derfor gjøre et valg for en hvilken som helst periode. Denne metoden lar deg spesifisere et strengt utvalg i forespørselen uten å bruke ekstra parametere.

Vær oppmerksom på at når vi bruker denne funksjonen i eksemplet ovenfor, har vi bare gitt tre tall (år, måned, dag) som inputparametere. De tre siste (time, minutt, sekund) er valgfrie og, hvis de er fraværende, erstattes de med "0", det vil si begynnelsen av dagen.

Dette eksemplet vil hente alle filer vedlagt utgiftsrapporter frem til slutten av fjoråret 2016. I denne forbindelse vil vi angi time, minutt og sekund for å sammenligne tidspunktet "31. desember 2016 23:59:59".

VELGE
AdvanceReportAttachedFiles.Link
FRA
Directory.AdvanceReportAttachedFiles AS AdvanceReportAttachedFiles
HVOR
AdvanceReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Tom dato

Den enkleste måten å sjekke en variabel for å se om den inneholder en tom dato, er å bruke en enkel sammenligning. I dette eksemplet, ved å bruke en spørring, vil vi velge alle kontantkvitteringer til kontoen der innkommende dato ikke er fylt inn.

Når du arbeider med 1C-datoer, er den typiske rekkefølgen av datodeler år, måned, dag, time, minutter, sekunder. I dette tilfellet kan timer, minutter, sekunder hoppes over.

Når du oppretter en dato fra en streng ("cast to date"), kan du spesifisere den i et lokalisert format (dag.måned.år timer:minutter:sekunder), men bare i sin helhet.

For eksempel:
//Arbeid med 1C-datoer - konverter en dato til 1C fra deler - år, måned, dag (pluss valgfri tid)
Dato = Dato(2012;10;30); //ingen tid
Dato = Dato(2012,10,30,12,00,00); //med tiden

//Arbeid med 1C-datoer - konverter en dato til 1C fra en streng, forskjellige metoder
Dato = Dato("20121030"); //år måned dag
Dato = Dato("10/30/2012 12:00:00"); //lokalisert format, bare i sin helhet

//Arbeid med 1C-datoer - spesifisere datoverdien uten støping, direkte
Dato = "20121030"; //ingen tid
Dato = "20121030120000"; //med tiden

Arbeid med 1C-datoer - Tom dato 1C

For å kontrollere 1C-datoen for fullstendighet, sammenlignes den med "tomdatoen". Hvis det er et attributt med datotypen i oppslagsboken/dokumentet, hvis brukeren ikke fyller ut dette feltet, vil verdien også være "tom dato".

"Tom dato" er 01/01/0001 00:00:00.

For eksempel:
EmptyDate = "00010101000000";
Hvis RequiredDate = "00010101000000" Deretter
Report("Du fylte ikke inn en veldig nødvendig dato");
slutt om;

Arbeide med datoer 1C - Dato i detaljer (kataloger, dokumenter, etc.)

Når du spesifiserer typen attributt, kan du spesifisere å bruke:

  • Bare datoen (klokken er da alltid 00:00:00)
  • Kun tid (datoen er da alltid 01/01/0001)
  • Dato og tid

Får datoen

For å få dato og klokkeslett, bruk 1C CurrentDate()-funksjonen.

Stedet hvor denne funksjonen kalles er veldig viktig - på klienten eller på serveren. For mer informasjon, se emnet "Ytelsemodus/Ytelse". Det hender ofte at tiden på klientmaskiner er litt forskjellig, så de prøver å bruke servertiden overalt – selv om den er satt feil på serveren, så vil i alle fall alle klienter ha samme feiltid.

For å få serverdatoen (datoen satt i operativsystemet til serverdatamaskinen), opprettes vanligvis en felles modul i konfigurasjonen med avkrysningsboksen "Server" i egenskapene, og en funksjon opprettes i den.
//funksjonen ligger i en felles modul, for eksempel med navnet Server Functions
//i egenskapene til fellesmodulen er avkrysningsboksen "Server" merket og avkrysningsboksen "Klient" er ikke merket
Funksjon GetServerDate() Eksport
Returner CurrentDate();
EndFunction

//å kalle denne funksjonen for bruk fra en annen modul ser slik ut
DocumentObject.Date = ServerFunctions.GetServerDate(); //Modulenavn.Funksjonsnavn()

Også i den tynne klienten, rett ved siden av modulfunksjonene, er det indikert hvor den skal utføres:

Start og slutt på dagen

For datoen "30/10/2012":

  • startdatoen for dagen ser slik ut "30/10/2012 00:00:00"
  • sluttdatoen for dagen ser slik ut: "10/30/2012 23:59:59"

Brukes i rapporter og spørringer som krever innhenting av data for en periode - dag, måned, år.

For eksempel er perioden fra "01/01/2012 00:00:00" til "01/31/2012 00:00:00" feil fordi den ikke inkluderer én dag i måneden (men inkluderer ett sekund av siste dag i måneden).

Arbeide med 1C-datoer - Sammenligning av datoer

Dato inneholder dato og klokkeslett. Ved sammenligning av datoer (uten å ta hensyn til tid), reduseres de vanligvis til begynnelsen av dagen (måned, år).

For eksempel:
Dato1 = Dato("10/30/2012 12:00:00");
Hvis StartDay(Dato1) = StartDay(DocumentLink.Date) Da
Notify("Dokumentet ble lagt inn på den angitte datoen");
slutt om;

Bare i tilfelle, et eksempel på sammenligning av datoer i en periode:
Hvis DocumentLink.Date >= Begynnelsen av måneden(CurrentDate()) og
DocumentLink.Date

Arbeide med datoer 1C - Endring av dato

Datoen er antall sekunder. Hvis vi ikke bare vil finne ut om en date er større enn en annen, men også hvor mye større, så får vi forskjellen i sekunder.

For eksempel:
FromBeginning Of Day = CurrentDate() – Beginning Of Day(CurrentDate());
Rapport("Siden begynnelsen av dagen " + Linje(Fra begynnelsen av dagen) + " sekunder har gått");
Rapport("Siden begynnelsen av dagen " + Linje(Fra begynnelsen av dagen/60) + " minutter har gått");
Rapport("Siden begynnelsen av dagen " + Linje(Fra begynnelsen av dagen/60/60) + " timer har gått");

Vi kan også endre datoen når vi endrer, legger vi til eller trekker fra antall sekunder:
StartThisDay = StartDay(CurrentDate());

Start ofPreviousDay = Start ofDay(StartofThisDay – 1); //fjern den andre - gjør "i går" og ta begynnelsen av dagen fra "i går"

Start av forrige dag = Start av denne dagen – 24*60*60; //en annen metode - trekk fra 24 timer - 24 (timer) * 60 (minutter) * 60 (sekunder)

Arbeid med datoer 1C - Moment in time

Et tidspunkt er en utvidet fremstilling av en dato som gjelder dokumenter (og dermed registre).

Det er påkrevd å sammenligne tidspunkt for dokumenter hvis dato og klokkeslett for dokumentene er de samme. Følgelig kan den brukes til valg i spørringer.

Et tidspunkt kan hentes fra et dokument på følgende måter:
//metode 1
DocumentTimePoint = DocumentLink.TimeTime();

Du kan også sammenligne et tidspunkt med en dato/tid:
TimePointReference = New TimePoint(Start of Day(CurrentDate()));
Hvis DocumentRef.TimePoint().Compare(TimeTimeReference) = -1 Da
Notify("Dokumentet ble lagt inn tidligere enn i dag");
slutt om;
//Hvis et dokument legges inn med dagens dato kl. 00:00:00, så legges det fortsatt inn - i dag

Arbeide med datoer 1C - Datoformatering

Verktøy for å identifisere tomme lenker, datoer eller strenger. La oss se på hvordan du kan se etter en tom lenke, dato eller linje i en 1C-forespørsel.

Du kan definere nulldata ved å bruke spesielle operatorer.

Informasjon fra 1C-databasen etterspørres (og mottas deretter) ved hjelp av et verktøy som spørringsspråk (Query). De er skrevet på latin og kyrillisk. Og en av nøkkelordkommandoene (operatorene) ved mottak av informasjon er kommandoordet SELECT (engelsk) i kombinasjon med noen konstruksjoner. Her er eksempler på å lage forespurte oppgaver som interesserer oss om emnet:

Ser etter NULL-innhold

Denne oppgaven utføres av SELECT-operatøren i kombinasjon med "IS NULL"-konstruksjonen:

PLUKKE UT
OrderRemains.Customer,
BestillingerRemaining.QuantityRemaining
FRA
RegisterAccumulations.Orders.Remains AS OrderRemains
HVOR
BestillingerRemaining.QuantityRemaining ER NULL

Datokontroll

En tom dato i en 1C-forespørsel legges inn ved å bruke konstruksjonen "DATETIME(1, 1, 1, 0, 0, 0)":

PLUKKE UT
InvoiceIncomingSupplier.Link,
Faktura Leverandør Faktura
FRA
Dokument. InvoiceSupplier AS InvoiceSupplier
HVOR
InvoiceIncomingSupplier.IncomingDate = DATOTIME(1, 1, 1, 0, 0, 0)

Referansesjekk

Ikke-eksisterende intrareferanseverdier (for kontoplaner, kataloger osv.) kontrolleres ved å bruke "VALUE(Directory.Name...EmptyLink)"-konstruksjonen:

Strengesjekk

Tomme linjer oppdages ved å bruke et mellomrom i anførselstegn "":

PLUKKE UT
Buyers.Link
FRA
Katalog Kjøpere AS Kjøpere
HVOR
Buyers.Code = ""

Mer om ødelagte og vanlige lenker

En "flaggermus" er en lenke som fører (peker) til et ikke-eksisterende element. Med ikke-eksisterende mener vi en som ikke er i databasen. Det er nyttig å vite om slike lenker, i det minste for å motta varsler fra systemet i en mer forståelig form. Og å ta opp, slette og åpne uvirkelige objekter gir ingen mening.

1C-plattformer har ikke interne midler for å kutte dem av. Du må også forstå at utenfor de "ødelagte" er det spesielle "tomme lenker" i systemet, som bør skilles fra hverandre.
Du kan finne ut dette uten å spørre i databasen:

I 1C-7.7-systemet

For "biten", returnerer Link.Selected()-metoden og EmptyValue()-funksjonen null. For "tom" - i det første tilfellet er det null, og i det andre tilfellet er det en. For "normal" - en og null. Det viser seg at i 1C-7.7 er "ødelagt" ikke en ikke-eksisterende verdi som ikke anses som valgt.

I 1C-8.x-systemet

Alt er annerledes - i begge tilfeller (for "ødelagt" og "normal") returnerer metoden False, og funksjonen returnerer True. Løsningen er denne: For «broken»-metoden returnerer Link.GetObject()-metoden «Undefined»-funksjonen. For "tom" - "Kontekstmetodefeil" blir kastet. For "normal" - verdien returneres i henhold til dokumentasjonen; Det viser seg at i 1C-8.x vil "broken" ikke være en ikke-eksisterende funksjon av en referansetype som returnerer en udefinert objektverdi.

Hvor kommer de fra

Når du navigerer til en ikke-eksisterende adresse til en ødelagt kobling, får brukeren i beste fall et varsel om at objektet ikke ble funnet, i verste fall et bilde av serversiden. Deres verste egenskap er hemmelighold. Derav vanskeligheten med å kontrollere riktigheten. Mens du jobber med konfigurasjonen, foredles og oppdateres den hele tiden. Noen objekter må slettes, strukturen endres. Og referansen til det slettede elementet forblir i strukturene og algoritmene. Dermed forblir ikke-eksisterende adresser i systemet etter at selve elementet (sammen med adressen) er slettet.

Dagens publikasjon så på spesiell spørringskonstruksjon. Eksempler på design er gitt. Dette vil være nyttig når du søker etter tomme verdier.

Alle dokumenter som eksisterer i 1C-konfigurasjoner, og følgelig må nesten alle registre ha minst ett attributt med datotypen, og det er derfor hver utvikler trenger å vite og forstå:

  • Hvordan konvertere parametere av andre typer til den aktuelle typen;
  • Hvordan bestemme en tom dato i en 1C-forespørsel;
  • Hva er forskjellen mellom en dato og en tidsbegrensning?

Det er disse spørsmålene vi vil prøve å svare på i artikkelen vår.

Hva er en dato og hvordan bestemmer du den

Siden det å ta de fleste ledelsesbeslutninger og føre journal ikke krever tidsnøyaktighet som overstiger 1 sekund, bestemte utviklerne av 1C-plattformen at denne verdien ville være det absolutte minimum i datoformatet. Derfor må hvert attributt som beskriver tidspunktet for en hendelse i programmet inneholde:

  • Året hendelsen fant sted;
  • Måneden for denne hendelsen;
  • Dag.

Det er ikke nødvendig å angi: time, minutt og sekund. Hvis disse tre parameterne utelates og det ikke er noen tilleggsbetingelser, stiller programmet automatisk klokken til begynnelsen av dagen.

Datoformatene som eksisterer i verden har betydelige forskjeller:

  1. I Russland er vi vant til å sette dagen først, deretter måneden for begivenheten, og på slutten av året;
  2. Innbyggere i USA starter datoen med måneden;
  3. Tsjekkere, polakker og slovenere rekordperioder i formatet År – Måned – Dag.

Det er sistnevnte format som 1C-plattformen bruker.

Konverter til dato

For å få en parameter med datotypen fra flere verdier eller fra en streng, må du bruke koden vist i fig. 1

Som det fremgår av figuren ovenfor, kan du bestemme datoen enten ved å bruke én linje eller ved å dele denne linjen i komponentene ved hjelp av et komma, resultatet vil ikke endres.

Det er viktig å forstå at året for datoen må inneholde fire sifre, inkludert årtusenet og århundret for hendelsen, måneden, dagen, timer og sekunder må være to tegn lange, inkludert innledende nuller.

Tidsnedtellingen i programmet starter fra begynnelsen av dagen den 1. januar 0001. For koden ovenfor kan denne verdien bestemmes på en av to måter (Figur 2).

Ris. 2

I den andre linjen utelot vi timene, minuttene og sekundene av hendelsen, noe som ikke påvirket ytelsen til koden vår i det hele tatt.

Funksjoner ved bruk av dato i 1C-spørringer

For de fleste datatyper som brukes av 1C-plattformen, er det forhåndsdefinerte void-verdier. For tall er det 0, for lenker kan du definere verdien EmptyLink(), for en dato anses den tomme verdien vanligvis for å være startdatoen, og det er med denne at detaljene til den tilsvarende typen må sammenlignes når du setter inn forespørselsparametere.

Det er viktig å forstå at selv om verdien av et formattributt av den aktuelle typen ikke inneholder noen tall, det vil si at vinduet ser ut (fig. 3), betyr det ikke at det ikke er noe spesifisert i det av denne parameteren med en tom streng vil ikke fungere.

Ris. 3

Etter å ha mottatt en tom dato, kan vi spesifisere den som en parameter for vår forespørsel, det vil si bruke konstruksjonen (fig. 4)

Imidlertid er det tider når det er bedre å sjekke inne i forespørselsteksten, uten å sende en tom dato som en parameter. For å gjøre dette, kan du angi den aktuelle betingelsen i forespørselskoden (fig. 5) og bruke DateTime()-forespørselsfunksjonen.

Ris. 5

I forespørselsteksten ovenfor utelot vi de innledende nullene for året, måneden og dagen, og indikerte heller ikke timer, minutter og sekunder, og programmet spiste som de sier opp denne antagelsen.

Dato og klokkeslett grense

Et annet interessant faktum angående forholdet mellom spørringer og datoer er bruken av konseptet "punkt i tid" når du får tilgang til forskjellige databasetabeller.

Nøyaktigheten "opptil et millisekund" spesifisert i den tekniske dokumentasjonen når den primitive datotypen beskrives, kommer tydeligst til uttrykk ved valg av poster fra de virtuelle tabellene i akkumuleringsregisteret: hvis akkumuleringsregisteret, i tillegg til omsetningstabellen, har gjenværende og gjenværende og omsetningstabeller, og deretter prøvetaking fra dem utføres i en viss tid, kan gi forskjellige resultater.

For å forstå hvordan og hvorfor dette skjer, tenk på et enkelt eksempel:

  1. Før salgsdokumentet ble utført etter 12 timer 31 minutter 36 sekunder, var saldoene i henhold til Sukkernomenklaturen 30 kg;
  2. Dokumentet avskrev 10 kg på det angitte tidspunktet;
  3. Rapporten generert på dokumentdatoen kl. 12 timer 31 minutter 36 sekunder i henhold til gjenværende tabellen vil vise balansen på 30 kg;
  4. Den samme rapporten på tabellen Rester og Omsetninger for samme tid vil vise en balanse på 20 kg.

Hva er årsaken til denne oppførselen og hvordan unngå den?

Problemet er at i Gjenværende-tabellen er perioden spesifisert som et åpent segment, det vil si at bevegelser som er gjort på tidspunktet rapporten genereres, ikke tas i betraktning, det vil si at tiden tas i begynnelsen av den andre spesifiserte i parameteren. Samtidig, for tabellen over Omsetninger og for tabellen Rester og Omsetninger, tas det hensyn til tidsgrenser, det vil si at tiden tas på slutten av det angitte sekundet.

Det er flere måter ut av denne situasjonen:

  1. Når du bruker Remains-tabellen, angi et tidspunkt som er 1 sekund høyere enn det spesifiserte;
  2. Bruk kun tabellen Rester og omsetninger (ikke det mest optimale alternativet sett fra et ytelsessynspunkt);
  3. Bruk konseptet Boundary.

Det siste alternativet kan representeres av koden vist i fig. 6.

I den første parameteren i objektet vårt angir vi datoen rapporten skal genereres for, den andre parameteren bestemmer typen kantlinje. Siden det er viktig for oss at bevegelser på en gitt dato er inkludert i utvalget, må vi sette denne parameteren til posisjonen "Inkludert".

Svært ofte i 1C-spørringer må du jobbe med datoer. Spesielt når forespørselen gjøres til metadataobjekter som inneholder periodisk informasjon. Som regel er dette registre (informasjon, akkumulering, beregning, regnskap). La oss se på de mest brukte funksjonene til 1C-spørringsspråket for å jobbe med datoer. Vi skal bygge eksempler basert på informasjonsregisteret Ansattes organisasjoner ZUP-konfigurasjoner versjon 2.5.

  • DATO TID

    Lar deg få en dato i en forespørsel (med eller uten tid) ved å spesifisere år, måned, dag, time, minutt, sekund.
    Syntaks:
    DATETIME(År, Måned, Dag, Time, Minutt, Sekund)
    Vanligvis er ikke time, minutt og sekund angitt. La oss gi et minieksempel. Skriv inn følgende tekst i spørringskonsollen:

    VELG DATOTIME(2016, 1, 1)

    Som et resultat av å utføre forespørselen får vi datoen - 01/01/2016
    Faktisk er det vanskelig å forestille seg en situasjon der datoen vil bli angitt på denne måten i en forespørsel. Tross alt, når du trenger å spesifisere en periode, brukes parametere. Men det er et tilfelle når denne funksjonen er av spesiell verdi. Dette er når vi må angi en tom dato i feltene eller i forespørselsbetingelsene. La meg minne deg på at for 1C-språket har en tom dato formen - 0001.01.01. Derfor, for å få en tom dato i en forespørsel, bare spesifiser DATOTIME(1, 1, 1). La oss for eksempel velge fra informasjonsregisteret Ansattes organisasjoner poster som ikke er fylt ut Gjennomføringsperiode:

    VELG Organisasjonsansatte.Periode, Organisasjonsmedarbeidere.Ansatte, Organisasjonsansatte.Posisjon, Organisasjonsansatte.Organisasjonsavdeling FRA Registerinformasjon.Organisasjonsansatte AS Organisasjonsansatte HVOR Organisasjonsansatte.Fullføringsperiode = 1DATOTID(1),

  • BEGYNNELSEN AV PERIODEN

    For den angitte datoen returnerer begynnelsen av perioden den tilhører.
    Syntaks:
    START AV PERIODE(dato, periodetype)
    PeriodType kan ha følgende verdier: MINUTT, TIME, DAG, UKE, MÅNED, KVARTAL, ÅR, DEKADE, HALVÅR
    I spørringskonsollen skriver du inn:

    VELG START PÅ PERIODE(DATOTID(2016, 1, 15), MÅNED)

    Forespørselen kommer tilbake - 01.01.2016
    Og nå et eksempel. Som du vet, periodisiteten til registeret Ansattes organisasjoner en dag. La oss lage en spørring der startdatoen for måneden vises i stedet for den faktiske rekordperioden.

    VELG BEGYNNELSE AV PERIODEN(Ansatte i organisasjoner.Periode, MÅNED) AS Begynnelsen av måneden, Ansatte i organisasjoner.Ansatte, Ansatte i organisasjoner.Posisjon, Ansatte i organisasjoner.Seksjon for organisasjon FRA Registerinformasjon. Ansatte i organisasjoner AS Ansatte

  • SLUT PÅ PERIODEN

    Syntaksen er den samme som for begynnelsen av perioden. Og som navnet tilsier, returnerer den slutten av perioden etter dato og periodetype. Vi vil ikke vurdere det i detalj. La oss begrense oss til et minieksempel.
    Be om:

    VELG SLUTT PÅ PERIOD(DATOTIME(2016, 1, 15), MÅNED)

    Returnerer 31.01.2016 23:59:59
    Som du kan se, returneres verdien nøyaktig til sekundet.

  • ADDKDATE

    Legger til det angitte antallet tidsintervaller til datoen.
    Syntaks:
    ADDKDATE(Dato, PeriodeType, Quantity)
    PeriodType tar de samme verdiene som for funksjonen BEGYNNELSEN AV PERIODEN
    La oss for eksempel velge februardatoen:

    SELECT ADDKDATE(DATETIME(2016, 2, 15), MONTH, 2)

    Vi får datoen 04/15/2016 0:00:00 Til tross for at februar er en kort måned, er dagen for mottatt dato den samme som den opprinnelige. Det er veldig praktisk at du ikke trenger å tenke på antall dager i måneder.
    Mengden kan også være negativ. Deretter telles intervallet i motsatt retning.

  • FORSKJELL DATO

    Beregn forskjellen mellom to datoer i de angitte måleenhetene.
    Syntaks:
    DATODIFFERENCE (startdato, sluttdato, periodetype)
    Periodetypen kan ha følgende verdier: SEKUND, MINUTT, TIME, DAG, MÅNED, KVARTAL, ÅR
    For eksempel:

    VELG DIFERENCEDATE(DATETIME(2016; 2; 15); DATETIME(2016; 3; 1); DAY)

    returnerer 15

Her har vi gjennomgått de mest brukte funksjonene til 1C-spørringsspråket. Resten brukes ganske sjelden. Eksempler på arbeid med dem kan om nødvendig finnes i hjelpen som er innebygd i 1C-plattformen.