Usporedba s praznim datumom u zahtjevu 1c

Svi dokumenti koji postoje u 1C konfiguracijama, pa stoga, gotovo svi registri moraju imati barem jednu varijablu s tipom datuma, zbog čega svaki programer mora znati i razumjeti:

  • Kako pretvoriti parametre drugih tipova u dotični tip;
  • Kako odrediti prazan datum u zahtjevu 1C;
  • Koja je razlika između datumske i vremenske granice.

Upravo na ova pitanja pokušat ćemo odgovoriti u našem članku.

Što je datum i kako ga odrediti

Budući da većina upravljačkih odluka i računovodstva ne zahtijevaju vremensku točnost veću od 1 sekunde, programeri 1C platforme odlučili su da će ta vrijednost biti maksimalni minimum u formatu datuma. Dakle, svaka varijabla koja opisuje vrijeme događaja u programu mora sadržavati:

  • Godina kada se događaj dogodio;
  • Mjesec ovog događaja;
  • Dan.

Neobavezno: sat, minuta i sekunda. Ako su ova tri parametra izostavljena i nema dodatnih uvjeta, program automatski postavlja vrijeme na početak dana.

Formati datuma koji postoje u svijetu imaju značajnu razliku:

  1. U Rusiji smo navikli stavljati dan na prvo mjesto, zatim dolazi mjesec događaja, a na kraju - godina;
  2. Stanovnici SAD-a započinju datum s mjesecom;
  3. Česi, Poljaci i Slovenci pišu razdoblje u formatu “Godina – Mjesec – Dan”.

To je posljednji format koji koristi 1C platforma.

Pretvori u datum

Da biste dobili parametar s tipom datuma iz nekoliko vrijednosti ili iz niza, morate koristiti kod prikazan na sl. jedan

Kao što se može vidjeti iz gornje slike, datum se može odrediti i uz pomoć jednog retka, a podjelom ovog retka na njegove sastavne dijelove pomoću zareza, rezultat se neće promijeniti.

Važno je razumjeti da godina datuma mora sadržavati četiri znamenke, uključujući tisućljeće i stoljeće događaja, mjesec, dan, sate i sekunde – moraju imati dva znaka, uključujući vodeće nule.

Odbrojavanje u programu počinje od početka dana 1. siječnja 0001. Za gornji kod, ova se vrijednost može odrediti na jedan od dva načina (slika 2).

Riža. 2

U drugom retku smo izostavili sate, minute i sekunde događaja, što ni na koji način nije utjecalo na izvedbu našeg koda.

Značajke korištenja datuma u 1C zahtjevima

Za većinu tipova podataka koje koristi 1C platforma, postoje unaprijed definirane void vrijednosti. Za brojeve, ovo je 0, za veze možete definirati vrijednost EmptyReference (), za datum je uobičajeno smatrati da je datum početka praznom vrijednošću, s njim trebate usporediti pojedinosti odgovarajućeg tip prilikom postavljanja parametara upita.

Važno je razumjeti da čak i ako u vrijednosti atributa forme dotične vrste nisu navedeni brojevi, odnosno prozor izgleda kao (slika 3), to ne znači da u njemu ništa nije navedeno, usporedba ovog parametra s praznim nizom neće raditi.

Riža. 3

Nakon što smo primili prazan datum, možemo ga odrediti kao parametar našeg zahtjeva, odnosno koristiti konstrukciju (slika 4)

Međutim, postoje slučajevi kada je bolje provjeriti unutar tijela zahtjeva bez prosljeđivanja praznog datuma kao parametra. Da biste to učinili, možete unijeti odgovarajući uvjet u kodu zahtjeva (slika 5) i koristiti funkciju zahtjeva DateTime ().

Riža. 5

U zadanom tekstu upita izostavili smo vodeće nule za godinu, mjesec i dan, a također nismo naznačili sate, minute i sekunde, a program je, kako kažu, pojeo tu pretpostavku.

Granica datuma i vremena

Još jedna zanimljiva činjenica o odnosu između upita i datuma je korištenje koncepta "točke u vremenu" kada se upućuje na različite tablice baze podataka.

Točnost "do milisekunde" naznačena u tehničkoj dokumentaciji pri opisu primitivnog tipa Datuma najjasnije se očituje pri odabiru zapisa iz virtualnih tablica registra akumulacije: ako registar akumulacije, osim tablice Promet, ima tablice Ostaci i Ostaci i Promet, zatim odabir za njih, proveden za određeno vrijeme može dati različite rezultate.

Da biste razumjeli kako i zašto se to događa, razmotrite jednostavan primjer:

  1. Prije nego što je dokument o prodaji izvršen u 12 sati 31 minutu i 36 sekundi, stanja prema nomenklaturi šećera su bila 30 kg;
  2. Dokument je u naznačeno vrijeme otpisano 10 kg;
  3. Izvješće generirano od datuma dokumenta u 12 sati 31 minutu 36 sekundi prema tablici stanja prikazat će ostatak od 30 kg;
  4. Isti izvještaj na tablici Ostaci i promet u isto vrijeme će prikazati ostatak od 20 kg.

Koji je razlog ovakvog ponašanja i kako ga izbjeći?

Problem je u tome što je u tablici Ostaci razdoblje postavljeno otvorenim segmentom, odnosno ne uzimaju se u obzir kretanja napravljena u trenutku generiranja izvješća, odnosno vrijeme se uzima na početku drugog navedenog u parametru. Istodobno, za tablicu okreta i za tablicu Preostali AND promet uzimaju se u obzir vremenske granice, odnosno vrijeme se uzima na kraju navedene sekunde.

Postoji nekoliko izlaza iz ove situacije:

  1. Kada koristite tablicu rezidua, navedite vremensku točku 1 sekundu veću od navedene;
  2. Koristite samo tablicu Ostaci i obrti (nije najoptimalnija opcija u smislu izvedbe);
  3. Koristite koncept granice.

Posljednja opcija može biti predstavljena kodom prikazanim na Sl. 6.

U prvom parametru našeg objekta označavamo datum na koji je potrebno generirati izvješće, drugi parametar određuje vrstu granice. Budući da nam je važno da su kretanja za određeni datum uključena u uzorak, ovaj parametar moramo postaviti na poziciju "Uključuje".

Vrlo često u zahtjevima 1C morate raditi s datumima. Pogotovo kada se gradi upit za objekte metapodataka koji sadrže periodične informacije. U pravilu su to registri (informacije, akumulacija, obračun, računovodstvo). Razmotrimo najčešće korištene funkcije jezika upita 1C za rad s datumima. Na temelju registra informacija gradit ćemo primjere ZaposleniciOrganizacije ZUP revizija konfiguracije 2.5.

  • DATUM VRIJEME

    Omogućuje vam da dobijete datum u zahtjevu (sa ili bez vremena) navodeći godinu, mjesec, dan, sat, minutu, sekundu.
    Sintaksa:
    DATUM VRIJEME (godina, mjesec, dan, sat, minuta, sekunda)
    Obično sat, minuta i sekunda nisu navedeni. Navedimo mini primjer. Unesite sljedeći tekst u Query Console:

    ODABIR DATUM VRIJEME (2016, 1, 1)

    Kao rezultat izvršenja zahtjeva, dobivamo datum - 01.01.2016.
    Zapravo, teško je zamisliti situaciju u kojoj će datum biti naveden u zahtjevu na ovaj način. Uostalom, kada trebate odrediti razdoblje, koriste se parametri. Ali postoji slučaj kada je ova funkcija od posebne vrijednosti. To je kada trebamo navesti prazan datum u poljima ili u uvjetima upita. Podsjetim da za jezik 1C prazan datum izgleda - 0001.01.01. Dakle, da biste dobili prazan datum u zahtjevu, dovoljno je navesti DATUM VRIJEME (1, 1, 1)... Kao primjer, izaberimo iz registra informacija ZaposleniciOrganizacije unosi koji nisu popunjeni Razdoblje završetka:

    ODABIR Zaposlenici organizacija Razdoblje, Zaposlenici organizacija Zaposlenici, Zaposlenici organizacija Radno mjesto, Zaposlenici organizacija Pododjel organizacije IZ Registra podataka Zaposlenici organizacija KAO Zaposlenici organizacija GDJE Zaposlenici organizacija.

  • POČETAK RAZDOBLJA

    Vraća početak razdoblja u kojem pripada za navedeni datum.
    Sintaksa:
    POČETAK RAZDOBLJA (datum, vrsta razdoblja)
    PeriodType može imati sljedeće vrijednosti: MINUTA, SAT, DAN, TJEDAN, MJESEC, KVARTAL, GODINA, DEKADA, POLUGODIŠNJE
    U konzoli za upite unesite:

    ODABIR POČETAKA RAZDOBLJA (DATUM VRIJEME (2016., 1., 15.), MJESEC

    Zahtjev se vraća - 01.01.2016
    Sada za primjer. Kao što znate frekvenciju u registru ZaposleniciOrganizacije jednog dana. Sastavimo upit u kojem će umjesto važećeg razdoblja zapisa biti prikazan datum početka mjeseca.

    ODABERITE POČETAK RAZDOBLJA (Zaposlenici organizacija. Razdoblje, MJESEC) KAO Početak mjeseca, Zaposlenici organizacija. Zaposlenik, Zaposlenici organizacija. Položaj, Zaposlenici organizacija. Pododjel organizacije.

  • KRAJ RAZDOBLJA

    Sintaksa je ista kao i za početak razdoblja. I kao što naziv implicira, vraća kraj razdoblja prema datumu i vrsti razdoblja. Nećemo detaljno razmatrati. Ograničimo se na mini primjer.
    upit:

    ODABIR KRAJ RAZDOBLJA (DATUM VRIJEME (2016, 1, 15), MJESEC)

    Vraća se 31.1.2016 23:59:59
    Kao što možete vidjeti, vrijednost se vraća točno na sekundu.

  • DODATI

    Dodaje navedeni broj vremenskih utora datumu.
    Sintaksa:
    DODAJ DATUM (datum, vrsta razdoblja, broj)
    PeriodType prihvaća iste vrijednosti kao i za funkciju POČETAK RAZDOBLJA
    Uzmimo za primjer datum u veljači:

    ODABIR DODAJTE DATUM (DATUM VRIJEME (2016, 2, 15), MJESEC, 2)

    Dobivamo datum 15.04.2016 0:00:00 Unatoč činjenici da je veljača kratak mjesec, dan primljenog datuma isti je kao i originalni. Vrlo je zgodno da ne morate razmišljati o broju dana u mjesecima.
    Broj može biti negativan. Zatim se interval broji u suprotnom smjeru.

  • RAZLIKA

    Izračunava razliku između dva datuma u navedenim jedinicama.
    Sintaksa:
    DATUM RAZLIKA (datum početka, datum završetka, vrsta razdoblja)
    Vrsta razdoblja može imati sljedeće vrijednosti: DRUGA, MINUTA, SAT, DAN, MJESEC, KVARTAL, GODINA
    Na primjer:

    ODABIR DATUMSKA RAZLIKA (DATUM VRIJEME (2016, 2, 15), DATUM VRIJEME (2016, 3, 1), DAN)

    vraća 15

Ovdje su razmotrene najčešće korištene funkcije jezika upita 1C. Ostalo se rijetko koristi. Ako je potrebno, primjeri rada s njima mogu se pronaći u pomoći ugrađenoj u 1C platformu.

Kada radite s 1C datumima, uobičajeni redoslijed dijelova datuma je godina, mjesec, dan, sat, minute, sekunde. U tom slučaju, sati, minute, sekunde se mogu preskočiti.

Kada kreirate datum iz niza ("cast to date"), možete odrediti u lokaliziranom formatu (dan.mjesec.godina sati: minute: sekunde), ali samo u potpunosti.

Na primjer:
// Rad s 1C datumima - pretvorite datum u 1C iz dijelova - godina, mjesec, dan (plus izborno vrijeme)
Datum = Datum (2012,10,30); // Nema vremena
Datum = Datum (2012,10,30,12,00,00); //s vremenom

// Rad s 1C datumima - pretvoriti datum u 1C iz niza, na različite načine
Datum = Datum ("20121030"); // godina, mjesec, dan
Datum = Datum ("10/30/2012 12:00:00"); // lokalizirani format, samo u cijelosti

// Rad s 1C datumima - određivanje vrijednosti datuma bez izlijevanja, izravno
Datum = "20121030"; // Nema vremena
Datum = "20121030120000"; //s vremenom

Rad s datumima 1C - Prazan datum 1C

Za provjeru punoće datuma 1C - uspoređuje se s "praznim datumom". Ako u priručniku/dokumentu postoji atribut tipa datuma, ako korisnik nije ispunio ovo polje, tada će i njegova vrijednost biti “prazan datum”.

"Prazan datum" je 01.01.0001 00:00:00.

Na primjer:
EmptyDate = "00010101000000";
Ako je RequiredDate = "00010101000000" Zatim
Izvješće ("Niste ispunili vrlo potreban datum");
Završi ako;

Rad s datumima 1C - Datum u detaljima (priručnici, dokumenti itd.)

Prilikom određivanja vrste atributa, možete odrediti upotrebu:

  • Samo datum (vrijeme je tada uvijek 00:00:00)
  • Samo vrijeme (datum je tada uvijek 01.01.0001)
  • Datum i vrijeme

Dobivanje datuma

Da biste dobili datum i vrijeme, koristite funkciju 1C CurrentDate ().

Vrlo je važno mjesto gdje se ova funkcija poziva - na klijentu ili na poslužitelju. Za pojedinosti pogledajte temu "Način rada / Performanse". Često se događa da je vrijeme malo drugačije na klijentskim strojevima, pa pokušavaju svugdje koristiti vrijeme poslužitelja - čak i ako nije ispravno postavljeno na poslužitelju, tada će barem svi klijenti imati isto krivo vrijeme.

Kako bi se dobio datum poslužitelja (datum postavljen u operacijskom sustavu poslužiteljskog računala), obično se u konfiguraciji kreira zajednički modul s označenim potvrdnim okvirom "Poslužitelj" u svojstvima i u njemu se kreira funkcija
// funkcija se nalazi u zajedničkom modulu, na primjer, pod nazivom ServerFunctions
// u svojstvima zajedničkog modula potvrdni okvir "Poslužitelj" je označen, a potvrdni okvir "Klijent" nije postavljen
Funkcija GetServerDate () Izvoz
Vrati CurrentDate ();
EndFunction

// pozivanje ove funkcije za korištenje iz drugog modula izgleda ovako
DocumentObject.Date = ServerFunctions.GetServerDate (); //ModuleName.FunctionName ()

Također, u tankom klijentu, neposredno uz funkcije modula, naznačeno je gdje će se izvršiti:

Početak i kraj dana

Za datum "30.10.2012.":

  • datum početka dana izgleda ovako "10/30/2012 00:00:00"
  • datum završetka izgleda ovako "10/30/2012 23:59:59"

Koristi se u izvješćima i upitima koji zahtijevaju podatke za razdoblje - dan, mjesec, godinu.

Tako, na primjer, razdoblje od 01/01/2012 00:00:00 do 01/31/2012 00:00:00 je netočno, jer ne uključuje jedan dan u mjesecu (ali uključuje jednu sekundu posljednjeg dana u mjesecu).

Rad s 1C datumima - Uspoređivanje datuma

Datum sadrži datum i vrijeme. Kada se uspoređuju datumi (bez vremena), obično se dovode na početak dana (mjesec, godina).

Na primjer:
Datum1 = Datum ("10/30/2012 12:00:00");
Ako je Dan početka (Datum1) = Početni dan (Ref. dokumenta) Onda
Izvješće ("Dokument je upisan do navedenog datuma");
Završi ako;

Za svaki slučaj, primjer usporedbe datuma u razdoblju:
Ako je DocumentRef.Date> = StartMonth (TrenutniDatum ()) i
Dokument Ref.Datum

Rad s datumima 1C - Promjena datuma

Datum je broj sekundi. Ako želimo ne samo saznati je li jedan datum veći od drugog, nego i koliko više, tada dobivamo razliku u sekundama.

Na primjer:
Početak dana = Trenutni datum () - Početak dana (Trenutni datum ());
Izvještaj ("Od početka dana je prošao" + String (Od početka dana) + "sekunde");
Izvješće ("Od početka dana je prošao" + String (Od početka dana / 60) + "minuta");
Izvještaj ("Od početka dana je prošao" + String (Od početka dana / 60/60) + "sati");

Također možemo promijeniti datum, kada se mijenja, dodajemo ili oduzimamo broj sekundi:
StartThisDay = StartDay (TrenutniDatum ());

PočetakPrethodniDan = PočetakDan (BeginningThisDay - 1); // ukloniti drugi - raditi "jučer" i uzeti početak dana od "jučer"

StartPreviousDay = StartThisDay - 24 * 60 * 60; // drugi način - oduzimamo 24 sata - 24 (sati) * 60 (minute su ispale) * 60 (sekunde)

Rad s datumima 1C - Trenutak vremena

Točka u vremenu je produženi prikaz datuma primjenjiv na dokumente (i sukladno tome registre).

Potrebno je usporediti vrijeme dokumenata ako su datum i vrijeme dokumenata isti. Sukladno tome, može se koristiti prilikom filtriranja u upitima.

Trenutak u vremenu može se dobiti iz dokumenta na sljedeće načine:
// metoda 1
DocumentMomentTime = DocumentRef.Timepoint ();

Također možete usporediti točku u vremenu s datumom / vremenom:
Moment of TimeStatus = Novi trenutak vremena (Početak dana (Trenutačni datum ()));
Ako je DocumentRef.MomentTime (). Usporedi (TimeTimeStandard) = -1 Tada
Izvješće ("Dokument je predstavljen ranije nego danas");
Završi ako;
// Ako je dokument upisan do današnjeg datuma u 00:00:00, onda je ipak upisan - danas

Rad s datumima 1C - Oblikovanje datuma

Ovaj će članak pogledati načine provjere null vrijednosti ovisno o vrsti atributa koji se provjerava, uključujući null vezu.

NULL vrijednost se vraća kada jednostavno nema rekvizita. Tip će u ovom slučaju također biti NULL. Na primjer, spajate dvije tablice kroz lijevo spajanje. U slučaju kada se u desnoj tablici za lijevu tablicu ne nalaze vrijednosti, vratit će se NULL.

Provjera ove vrijednosti može se provesti pomoću konstrukcija "IS NULL" i "". U prvom slučaju, vraća True ili False. U drugom slučaju, možete odmah postaviti drugu vrijednost u slučaju kada se vrati NULL.

Zahtjev 1C 8.3 u nastavku vratit će popis osoba za kontakt za one partnere koji nemaju određeni segment.

IZABERI
ContactPartners.Link
IZ
Imenik.Osobe za kontakt partnera KAO KONTAKT OSOBE PARTNERA
INTERNAL JOINT Directory.SegmentsPartners AS SegmentsPartners
Kontakti softverskog partnera. Vlasnik = Partnerski segmenti. Roditelj
GDJE
Partnerski segmenti. Ref JE NULL

Prazan datum

Provjera valjanosti praznog datuma se izvodi usporedbom s konstrukcijom DATE TIME (1, 1, 1, 0, 0, 0). Primjer upotrebe dat je u nastavku:

Prazna veza u 1C zahtjevu

U slučaju kada vraćeni atribut ima referentni tip, na primjer, to je element nekog rječnika, dokumenta itd., koristi se sljedeća konstrukcija: VRIJEDNOST (Directory.ReferenceName.EmptyRef).

U donjem primjeru upit odabire sve partnere koji nemaju navedenu poslovnu regiju.

Da biste provjerili ima li "ValueFilled", morate izvršiti suprotan uvjet:

Partneri.BusinessRegion<>VALUE (Directory.BusinessRegions.EmptyLink)

Prazna linija

Kako bi se provjerile vrste nizova, vrši se usporedba s drugim uzorkom. U ovom slučaju - "".

Upit u nastavku će odabrati sve partnere s praznim imenom.

U nekom trenutku javlja se potreba za radom s varijablama tipa "Datum". U ovom članku ćemo pogledati osnovne tehnike - prolazak tekućeg datuma, provjeru prazne vrijednosti, proizvoljan datum.

Prilikom pisanja upita često je potrebno usporediti podatke s trenutnim datumom. Ugrađeni 1C jezik ima funkciju CurrentDate (). Omogućuje vam da odredite trenutno vrijeme i datum na vašem računalu. Za izvođenje operacija s tekućim datumom potrebno je zahtjevu proslijediti vrijednost ove funkcije kao parametar.

U nastavku se nalazi upit koji odabire sve datoteke priložene izvješćima o troškovima s datumom izrade do sada:

Primjer Zahtjev = Novi zahtjev;
ExampleRequest.Text = "
| ODABIR
| Unaprijed izvješće Priložene datoteke. Veza
| OD
| Reference.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
| GDJE
| Unaprijed izvješće Priložene datoteke.Datum< &ТекДата»;
ExampleRequest.SetParameter ("Trenutačni datum", CurrentDate ());

Prilagođeni datum

Gornja funkcija omogućuje vam usporedbu i stoga odabir za bilo koje razdoblje. Ova metoda vam omogućuje da navedete strogi odabir u upitu bez korištenja dodatnih parametara.

Imajte na umu da smo korištenjem ove funkcije u gornjem primjeru proslijedili samo tri broja (godina, mjesec, dan) kao ulazne parametre. Posljednja tri (sat, minuta, sekunda) nisu obavezna i, ako ih nema, zamjenjuju se s "0", odnosno početkom dana.

Za ovaj primjer, primit ćete sve datoteke priložene izvješćima o troškovima do kraja prošle 2016. S tim u vezi naznačit ćemo sat, minutu i sekundu radi usporedbe s trenutkom u vremenu "31. prosinca 2016. u 23:59:59".

IZABERI
Unaprijed izvješće Priložene datoteke. Veza
IZ
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles
GDJE
Unaprijed izvješće Priložene datoteke.Datum< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Prazan datum

Najlakše je jednostavnom usporedbom provjeriti varijablu da vidite sadrži li prazan datum. U ovom primjeru, pomoću upita ćemo odabrati sva primanja sredstava na bankovni račun za koje nije popunjen ulazni datum.