1s provjera datuma je prazna. Pretvori u datum

Često postoji potreba za radom sa varijablama tipa „Datum“. U ovom članku ćemo pogledati osnovne tehnike - prenošenje tekućeg datuma, provjeru prazne vrijednosti, proizvoljan datum.

Kada pišete upite, često morate da uporedite podatke sa trenutnim datumom. Ugrađeni 1C jezik ima funkciju CurrentDate(). Omogućava vam da odredite trenutno vrijeme i datum na vašem računaru. Da biste izvršili operacije s trenutnim datumom, morate proslijediti vrijednost ove funkcije kao parametar zahtjevu.

Ispod je upit koji odabire sve datoteke priložene izvještajima o troškovima s datumom kreiranja do sada:

ExampleRequest = Novi zahtjev;
Primjer Request.Text = "
|ODABIR
| AdvanceReportAttachedFiles.Link
|OD
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
|WHERE
| AdvanceReportAttachedFiles.Date< &ТекДата»;
Primjer Request.SetParameter("CurrentDate", CurrentDate());

Prilagođeni datum

Funkcija o kojoj smo gore govorili vam omogućava da uporedite i, prema tome, napravite izbor za bilo koji period. Ova metoda vam omogućava da navedete strogu selekciju u zahtjevu bez korištenja dodatnih parametara.

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

Ovaj primjer će dohvatiti sve datoteke priložene izvještajima o troškovima do kraja prošle 2016. godine. U tom smislu, naznačićemo sat, minut i sekundu za poređenje vremenske tačke „31. decembar 2016. 23:59:59“.

ODABIRATI
AdvanceReportAttachedFiles.Link
OD
Directory.AdvanceReportAttachedFiles AS AdvanceReportAttachedFiles
GDJE
AdvanceReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Prazan datum

Najlakši način da provjerite varijablu da vidite sadrži li prazan datum je korištenje jednostavnog poređenja. U ovom primjeru, pomoću upita, izabraćemo sve novčane primitke na račun za koje nije popunjen ulazni datum.

Kada radite sa 1C datumima, tipičan redoslijed dijelova datuma je godina, mjesec, dan, sat, minute, sekunde. U ovom slučaju, sati, minute, sekunde se mogu preskočiti.

Prilikom kreiranja datuma iz niza (“cast to date”), možete ga navesti u lokaliziranom formatu (dan.mjesec.godina sati:minute:sekunde), ali samo u cijelosti.

Na primjer:
//Rad sa 1C datumima - konvertujte datum u 1C iz delova - godina, mesec, dan (plus opciono vreme)
Datum = Datum(2012,10,30); //nema vremena
Datum = Datum(2012,10,30,12,00,00); //sa vremenom

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

//Rad sa 1C datumima - specificiranje vrijednosti datuma bez livenja, direktno
Datum = "20121030"; //nema vremena
Datum = "20121030120000"; //sa vremenom

Rad sa 1C datumima - Prazan datum 1C

Da biste provjerili kompletnost datuma 1C, on se upoređuje s "praznim datumom". Ako u priručniku/dokumentu postoji atribut sa tipom datuma, ako korisnik ne popuni 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" Onda
Report("Niste popunili veoma potreban datum");
endIf;

Rad sa datumima 1C - Datum u detaljima (direktoriji, dokumenti, itd.)

Kada specificirate tip atributa, možete odrediti da koristite:

  • Samo datum (vrijeme je tada uvijek 00:00:00)
  • Samo vrijeme (datum je tada uvijek 01/01/0001)
  • Datum i vrijeme

Dobijamo datum

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

Mjesto gdje se ova funkcija poziva je veoma važno - na klijentu ili na serveru. Za više informacija pogledajte temu “Režim performansi/performanse”. Često se dešava da je vreme na klijentskim mašinama malo drugačije, pa pokušavaju da koriste vreme servera svuda - čak i ako je pogrešno podešeno na serveru, onda će barem svi klijenti imati isto pogrešno vreme.

Da bi se dobio datum servera (datum postavljen u operativnom sistemu serverskog računara), obično se kreira zajednički modul u konfiguraciji sa označenim poljem za potvrdu „Server“ u svojstvima i u njemu se kreira funkcija
//funkcija se nalazi u zajedničkom modulu, na primjer s imenom Server Functions
//u svojstvima zajedničkog modula je označeno polje za potvrdu “Server” i nije potvrđeno “Klijent”
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, direktno pored funkcija 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 na kraju dana izgleda ovako: “10/30/2012 23:59:59”

Koristi se u izveštajima i upitima koji zahtevaju dobijanje podataka za period - dan, mesec, godinu.

Na primjer, period od “01/01/2012 00:00:00” do “01/31/2012 00:00:00” je netačan jer ne uključuje jedan dan u mjesecu (ali uključuje jednu sekundu poslednjeg dana u mesecu).

Rad sa 1C datumima - Poređenje datuma

Datum sadrži datum i vrijeme. Prilikom upoređivanja datuma (bez uzimanja u obzir vremena), oni se obično svode na početak dana (mjesec, godina).

Na primjer:
Datum1 = Datum("10/30/2012 12:00:00");
Ako je StartDay(Date1) = StartDay(DocumentLink.Date) Onda
Obavijesti("Dokument je unet na navedeni datum");
endIf;

Za svaki slučaj, primjer poređenja datuma u periodu:
Ako DocumentLink.Date >= Početak mjeseca(TrenutniDatum()) i
DocumentLink.Date

Rad sa datumima 1C - Promjena datuma

Datum je broj sekundi. Ako želimo ne samo da saznamo da li je jedan datum veći od drugog, već i koliko je veći, onda ćemo dobiti razliku u sekundama.

Na primjer:
FromBeginning Of Day = CurrentDate() – Početak dana(TrenutniDatum());
Izvještaj("Od početka dana " + String(Od početka dana) + "sekunde");
Izvještaj("Od početka dana " + Red(Od početka dana/60) + "minuta");
Izvještaj("Od početka dana " + Red(Od početka dana/60/60) + " sati su prošli");

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

Početak prethodnog dana = Početak dana (Početak ovog dana – 1); //ukloniti drugo - raditi "jučer" i uzeti početak dana od "jučer"

Početak prethodnog dana = Početak ovog dana – 24*60*60; //druga metoda - oduzmi 24 sata - 24 (sati) * 60 (minute) * 60 (sekunde)

Rad sa datumima 1C - Trenutak u vremenu

Tačka u vremenu je prošireni prikaz datuma koji se odnosi na dokumente (a samim tim i registre).

Potrebno je uporediti vrijeme dokumenata ako su datum i vrijeme dokumenata isti. Shodno tome, može se koristiti za odabir u upitima.

Tačka u vremenu se može dobiti iz dokumenta na sljedeće načine:
//metod 1
DocumentInstant = DocumentLink.TimeIn();

Također možete uporediti tačku u vremenu sa datumom/vremena:
TimePointReference = Nova vremenska tačka(Početak dana(TrenutniDatum()));
Ako je DocumentRef.TimePoint().Compare(TimeTimeReference) = -1 Onda
Obavijesti("Dokument je unet ranije nego danas");
endIf;
//Ako se dokument unese sa današnjim datumom u 00:00:00, onda se i dalje unosi - danas

Rad sa datumima 1C - Formatiranje datuma

Alati za identifikaciju praznih veza, datuma ili nizova. Pogledajmo kako provjeriti praznu vezu, datum ili red u 1C zahtjevu.

Možete definirati nulte podatke pomoću posebnih operatora.

Informacije iz 1C baze podataka se traže (i zatim primaju) pomoću alata kao što je jezik upita (Upit). Napisane su latinicom i ćirilicom. A jedna od ključnih naredbi (operatora) pri primanju informacija je naredna riječ SELECT (engleski) u kombinaciji sa nekim konstrukcijama. Evo primjera izrade traženih zadataka koji nas zanimaju na temu:

Provjera sadržaja NULL

Ovaj zadatak izvodi SELECT operator u kombinaciji sa konstrukcijom “IS NULL”:

SELECT
Narudžbe ostaju.Kupac,
Preostale narudžbe.Preostala količina
OD
RegisterAccumulations.Orders.Remains AS OrdersRemains
GDJE
OrdersRemaining.QuantityRemaining JE NULL

Kontrola datuma

Prazan datum u 1C zahtjevu se unosi pomoću konstrukcije "DATETIME(1, 1, 1, 0, 0, 0)":

SELECT
InvoiceIncomingSupplier.Link.
InvoiceIncomingSupplier.IncomingDate
OD
Dokument. InvoiceSupplier AS InvoiceSupplier
GDJE
InvoiceIncomingSupplier.IncomingDate = DATETIME(1, 1, 1, 0, 0, 0)

Provjera referenci

Nepostojeće vrijednosti unutar referenci (za kontne planove, imenike, itd.) se provjeravaju pomoću konstrukcije “VALUE(Directory.Name…EmptyLink)”:

Provjera niza

Prazni redovi se otkrivaju korištenjem razmaka u navodnicima "":

SELECT
Buyers.Link
OD
Imenik kupaca AS Kupci
GDJE
Buyers.Code = ""

Više o neispravnim i redovnim vezama

“Slepi miš” je veza koja vodi (pokazuje) na nepostojeći element. Pod nepostojećim podrazumijevamo onaj koji nije u bazi podataka. Korisno je znati o takvim vezama, barem da biste primali obavijesti iz sistema u razumljivijem obliku. A snimanje, brisanje i otvaranje nestvarnih objekata nema smisla.

1C platforme nemaju interna sredstva za njihovo odsjecanje. Takođe morate shvatiti da izvan „pokvarenih” postoje posebne „prazne veze” u sistemu, koje treba razlikovati jedna od druge.
Ovo se može pronaći bez upita baze podataka:

U sistemu 1C-7.7

Za “bit”, metoda Link.Selected() i funkcija EmptyValue() vraćaju nulu. Za "prazno" - u prvom slučaju je nula, au drugom je jedan. Za "normalno" - jedan i nula. Ispostavilo se da u 1C-7.7 "slomljeno" nije nepostojeća vrijednost koja se ne smatra odabranom.

U sistemu 1C-8.x

Sve je drugačije - u oba slučaja (za "pokvareno" i "normalno") metoda vraća False, a funkcija vraća True. Rješenje je sljedeće: Za “pokvarenu” metodu, metoda Link.GetObject() vraća funkciju “Nedefinirano”. Za "prazno" - izbacuje se "greška metode konteksta". Za “normalno” - vrijednost se vraća prema dokumentaciji; Ispostavilo se da u 1C-8.x “broken” neće biti nepostojeća funkcija referentnog tipa koja vraća vrijednost nedefiniranog objekta.

Odakle dolaze

Prilikom navigacije na nepostojeću adresu neispravne veze, korisniku se u najboljem slučaju prikazuje obavijest da objekt nije pronađen, u najgorem, slika stranice servera. Njihova najgora osobina je njihova tajnovitost. Otuda i poteškoće u provjeri njihove ispravnosti. Tokom rada sa konfiguracijom, ona se stalno usavršava i ažurira. Neki objekti se moraju izbrisati, struktura se mijenja. A referenca na izbrisani element ostaje u strukturama i algoritmima. Dakle, nepostojeće adrese ostaju u sistemu nakon što se sam element (zajedno sa adresom) izbriše.

Današnja publikacija se bavila posebnom konstrukcijom upita. Navedeni su primjeri dizajna. Ovo će biti korisno kada tražite prazne vrijednosti.

Svi dokumenti koji postoje u 1C konfiguracijama, a samim tim i gotovo svi registri moraju imati barem jedan atribut s tipom datuma, zbog čega svaki programer mora znati i razumjeti:

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

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

Šta je datum i kako ga odrediti

Budući da donošenje većine upravljačkih odluka i vođenje evidencije ne zahtijeva vremensku tačnost veću od 1 sekunde, programeri 1C platforme odlučili su da ova vrijednost bude apsolutni minimum u formatu datuma. Dakle, svaki atribut koji opisuje vrijeme događaja u programu mora sadržavati:

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

Nije potrebno naznačiti: sat, minut i sekunda. Ako su ova tri parametra izostavljena i nema dodatnih uslova, program automatski postavlja vrijeme na početak dana.

Formati datuma koji postoje u svijetu imaju značajne razlike:

  1. U Rusiji smo navikli da prvo stavljamo dan, zatim mesec događaja i na kraju godine;
  2. Stanovnici SAD-a počinju datum sa mjesecom;
  3. Česi, Poljaci i Slovenci bilježe periode u formatu Godina – Mjesec – Dan.

To je potonji 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. 1

Kao što se može vidjeti iz gornje slike, datum možete odrediti ili koristeći jedan red ili podijelite ovaj red na njegove sastavne dijelove pomoću zareza, rezultat se neće promijeniti.

Važno je shvatiti da godina datuma mora sadržavati četiri cifre, uključujući milenijum i vijek događaja, mjesec, dan, sate i sekunde moraju imati dva znaka, uključujući vodeće nule.

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

Rice. 2

U drugom redu smo izostavili sate, minute i sekunde događaja, što nije nimalo uticalo na performanse našeg koda.

Značajke korištenja datuma u 1C upitima

Za većinu tipova podataka koje koristi 1C platforma, postoje unaprijed definirane vrijednosti void. Za brojeve, ovo je 0 za veze, možete definisati vrednost EmptyLink(), a prazna vrednost se obično smatra početnim datumom; postavljanje parametara zahtjeva.

Važno je razumjeti da čak i ako u vrijednosti atributa forme koji ima dotični tip, odnosno prozor izgleda (slika 3), nisu navedeni brojevi, to ne znači da u njemu ništa nije navedeno; poređenje ovog parametra sa praznim nizom neće raditi.

Rice. 3

Kada primimo prazan datum, možemo ga navesti kao parametar našeg zahtjeva, odnosno koristiti konstrukciju (slika 4)

Međutim, postoje trenuci kada je bolje provjeriti unutar tijela zahtjeva, a da se ne unese prazan datum kao parametar. Da biste to učinili, možete unijeti odgovarajući uvjet u kodu zahtjeva (slika 5) i koristiti funkciju zahtjeva DateTime().

Rice. 5

U gornjem tekstu zahtjeva izostavili smo vodeće nule godine, mjeseca i dana, a takođe nismo naveli sate, minute i sekunde, a program je, kako kažu, pojeo ovu pretpostavku.

Granica datuma i vremena

Još jedna zanimljiva činjenica u vezi sa odnosom između upita i datuma je upotreba koncepta „tačke u vremenu“ kada se pristupa različitim tabelama baze podataka.

Tačnost „do milisekundi“ navedena u tehničkoj dokumentaciji pri opisivanju primitivnog tipa Datuma najjasnije se manifestuje pri odabiru zapisa iz virtuelnih tabela registra akumulacije: ako registar akumulacije, pored tabele prometa, ima i Preostali i Tabele ostatka i obrta, nakon čega se uzorkovanje iz njih vrši za određeno vrijeme, mogu dati različite rezultate.

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

  1. Prije nego što je prodajni dokument izvršen u 12 sati 31 minut 36 sekundi, bilansi prema nomenklaturi šećera su bili 30 kg;
  2. Dokument je otpisao 10 kg u navedeno vrijeme;
  3. Izveštaj generisan na datum dokumenta u 12 sati 31 minut i 36 sekundi prema tabeli Preostalo će pokazati stanje od 30 kg;
  4. Isti izvještaj na tabeli Ostaci i Promet za isto vrijeme će pokazati saldo od 20 kg.

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

Problem je u tome što je u tabeli Preostali period naveden kao otvoreni segment, odnosno ne uzimaju se u obzir kretanja u trenutku generisanja izveštaja, odnosno vreme se uzima na početku drugog navedenog. u parametru. Istovremeno, za tabelu Promet i za tabelu Ostaci i Promet uzimaju se u obzir vremenske granice, odnosno vreme se uzima na kraju navedene sekunde.

Postoji nekoliko izlaza iz ove situacije:

  1. Kada koristite tabelu Ostaci, navedite vremensku tačku 1 sekundu veću od navedene;
  2. Koristite samo tabelu ostataka i obrta (nije najoptimalnija opcija sa stanovišta performansi);
  3. Koristite koncept Granica.

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

U prvom parametru našeg objekta označavamo datum za koji izvještaj treba generirati, drugi parametar određuje tip granice. Budući da nam je važno da su kretanja na određeni datum uključena u odabir, ovaj parametar moramo postaviti na poziciju „Uključuje“.

Vrlo često u 1C upitima morate raditi s datumima. Naročito kada se zahtjev upućuje objektima metapodataka koji sadrže periodične informacije. Po pravilu, to su registri (informacije, akumulacije, obračuni, računovodstvo). Pogledajmo najčešće korištene funkcije 1C jezika upita za rad s datumima. Napravit ćemo primjere na osnovu registra informacija EmployeesOrganizations ZUP konfiguracije verzija 2.5.

  • DATUM VRIJEME

    Omogućava vam da dobijete datum u zahtjevu (sa ili bez vremena) navodeći godinu, mjesec, dan, sat, minut, sekundu.
    sintaksa:
    DATETIME(godina, mjesec, dan, sat, minuta, sekunda)
    Obično sat, minuta i sekunda nisu naznačeni. Dajemo mini primjer. Unesite sljedeći tekst u Query Console:

    ODABIR DATUM VRIJEME(2016, 1, 1)

    Kao rezultat izvršenja zahteva dobijamo datum - 01.01.2016.
    Zapravo, teško je zamisliti situaciju u kojoj bi datum bio naveden na ovaj način u zahtjevu. Na kraju krajeva, kada treba da navedete period, koriste se parametri. Ali postoji slučaj kada je ova funkcija od posebne vrijednosti. Ovo je kada treba da navedemo prazan datum u poljima ili u uslovima zahteva. Da vas podsjetim da za jezik 1C prazan datum ima oblik - 0001.01.01. Dakle, da biste dobili prazan datum u zahtjevu, dovoljno je navesti DATETIME(1, 1, 1). Kao primjer, izaberimo iz registra informacija EmployeesOrganizations evidencije koje nisu popunjene Period završetka:

    ODABIR Organizacijski zaposlenici.Period, Organizacijski zaposleni.Zaposleni, Organizacijski zaposlenici.Pozicija, Organizacijski zaposlenici.Organizacijski odjel IZ registra informacija.Organizacijski zaposlenici AS Organizacijski zaposlenici GDJE Organizacijski zaposlenici.Period završetka = DATETIME(1, 1, 1)

  • POČETAK RAZDOBLJA

    Za navedeni datum vraća početak perioda kojem pripada.
    sintaksa:
    POČETAK RAZDOBLJA (Datum, Vrsta perioda)
    PeriodType može imati sljedeće vrijednosti: MINUTA, SAT, DAN, SEDMICA, MJESEC, KVARTAL, GODINA, DECEDA, POLUGODINJE
    U Query Console unesite:

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

    Zahtjev će se vratiti - 01.01.2016
    A sada primjer. Kao što znate, periodičnost registra EmployeesOrganizations jednog dana. Kreirajmo upit u kojem će biti prikazan početni datum mjeseca umjesto stvarnog perioda snimanja.

    IZABERITE POČETAK RAZDOBLJA (Zaposleni u organizacijama. Period, MESEC) KAO Početak mjeseca, Zaposleni u organizacijama. Zaposleni, Zaposleni u organizacijama. Položaj, Zaposleni u organizacijama. Odjeljenje organizacije IZ Informacija registra. Zaposleni u organizacijama KAO Zaposleni u organizacijama

  • KRAJ PERIOD

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

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

    Povratak 31.01.2016 23:59:59
    Kao što vidite, vrijednost se vraća točno na sekundu.

  • ADDKDATE

    Dodaje navedeni broj vremenskih intervala datumu.
    sintaksa:
    ADDKDATE(Datum, Vrsta perioda, količina)
    PeriodType uzima iste vrijednosti kao i za funkciju POČETAK RAZDOBLJA
    Na primjer, izaberimo datum u februaru:

    ODABIR DODATAK DODATA (DATETIME(2016, 2, 15), MJESEC, 2)

    Dobijamo datum 15.04.2016 0:00:00 Uprkos činjenici da je februar kratak mjesec, dan primljenog datuma je isti kao i prvobitni. Veoma je zgodno da ne morate razmišljati o broju dana u mjesecima.
    Količina također može biti negativna. Zatim se interval broji u suprotnom smjeru.

  • DIFFERENCEDATE

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

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

    vraća 15

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