Porovnanie s prázdnym dátumom v žiadosti 1c

Všetky dokumenty existujúce v konfiguráciách 1C, a preto takmer všetky registre musia mať aspoň jednu premennú s typom Dátum, a preto musí každý vývojár poznať a pochopiť:

  • Ako previesť parametre iných typov na príslušný typ;
  • Ako určiť prázdny dátum v žiadosti 1C;
  • Aký je rozdiel medzi dátumom a časovou hranicou.

Práve na tieto otázky sa pokúsime odpovedať v našom článku.

Čo je dátum a ako ho určiť

Keďže väčšina manažérskych rozhodnutí a účtovníctva nevyžaduje presnosť času presahujúcu 1 sekundu, vývojári platformy 1C sa rozhodli, že táto hodnota bude maximálne minimum vo formáte dátumu. Každá premenná popisujúca čas udalosti v programe teda musí obsahovať:

  • Rok, kedy sa udalosť stala;
  • Mesiac tejto udalosti;
  • deň.

Voliteľné: hodina, minúta a sekunda. Ak sú tieto tri parametre vynechané a neexistujú žiadne ďalšie podmienky, program automaticky nastaví čas na začiatok dňa.

Formáty dátumu existujúce vo svete majú významný rozdiel:

  1. V Rusku sme zvyknutí dávať na prvé miesto deň, potom nasleduje mesiac udalosti a na konci rok;
  2. Obyvatelia USA začínajú dátum mesiacom;
  3. Česi, Poliaci a Slovinci píšu obdobie vo formáte „Rok – Mesiac – Deň“.

Je to posledný formát, ktorý platforma 1C používa.

Previesť na dátum

Ak chcete získať parameter s typom Dátum z niekoľkých hodnôt alebo z reťazca, musíte použiť kód zobrazený na obr. jeden

Ako vidíte na obrázku vyššie, dátum môžete určiť pomocou jedného riadku a pri rozdelení tohto riadku na jednotlivé časti pomocou čiarky sa výsledok nezmení.

Je dôležité pochopiť, že rok dátumu musí obsahovať štyri číslice, vrátane tisícročia a storočia udalosti, mesiaca, dňa, hodín a sekúnd – musí mať dĺžku dva znaky vrátane úvodných núl.

Odpočítavanie v programe začína od začiatku dňa 1. januára 0001. Pre vyššie uvedený kód možno túto hodnotu určiť jedným z dvoch spôsobov (obr. 2).

Ryža. 2

V druhom riadku sme vynechali hodiny, minúty a sekundy udalosti, čo nijako neovplyvnilo výkon nášho kódu.

Funkcie používania dátumu v žiadostiach 1C

Pre väčšinu typov údajov používaných platformou 1C existujú preddefinované hodnoty void. Pre čísla je to 0, pre odkazy môžete definovať hodnotu EmptyReference (), pre dátum je obvyklé považovať počiatočný dátum za prázdnu hodnotu, s ňou musíte porovnať podrobnosti o zodpovedajúcich zadajte pri nastavovaní parametrov dotazu.

Je dôležité pochopiť, že aj keď v hodnote atribútu formulára daného typu nie sú uvedené žiadne čísla, teda okno vyzerá ako (obr. 3), neznamená to, že v ňom nie je nič špecifikované, porovnanie tohto parametra s prázdnym reťazcom nebude fungovať.

Ryža. 3

Po prijatí prázdneho dátumu ho môžeme špecifikovať ako parameter našej požiadavky, čiže použiť konštrukciu (obr. 4)

Sú však chvíle, kedy je lepšie skontrolovať vnútri tela požiadavky bez zadania prázdneho dátumu ako parametra. Ak to chcete urobiť, môžete zadať príslušnú podmienku do kódu požiadavky (obr. 5) a použiť funkciu požiadavky DateTime ().

Ryža. 5

V danom texte dotazu sme vynechali úvodné nuly pre rok, mesiac a deň a taktiež neuviedli hodiny, minúty a sekundy a program, ako sa hovorí, tento predpoklad zjedol.

Dátum a časová hranica

Ďalším zaujímavým faktom o vzťahu medzi dopytmi a dátumami je použitie konceptu „bod v čase“ pri odkazovaní na rôzne tabuľky v databáze.

Presnosť „do milisekúnd“ uvedená v technickej dokumentácii pri popise primitívneho typu Dátum sa najvýraznejšie prejaví pri výbere záznamov z virtuálnych tabuliek registra akumulácie: ak má register akumulácie okrem tabuľky Obraty aj tabuľky Zostatky a Zostatky a Obraty, potom ich výber, uskutočnený na určitý čas, môže poskytnúť rôzne výsledky.

Ak chcete pochopiť, ako a prečo sa to deje, zvážte jednoduchý príklad:

  1. Pred vykonaním dokladu o predaji v čase 12 hodín 31 minút 36 sekúnd boli zostatky podľa nomenklatúry cukru 30 kg;
  2. Dokument bol v uvedenom čase odpísaný 10 kg;
  3. Správa vygenerovaná k dátumu dokumentu o 12 hodine 31 minúte 36 sekunde podľa tabuľky Zostatky zobrazí zvyšok 30 kg;
  4. Rovnaký výkaz v tabuľke Zostatky a obraty súčasne ukáže zostatok 20 kg.

Aký je dôvod tohto správania a ako sa mu vyhnúť?

Problém je v tom, že v tabuľke Zostáva je obdobie nastavené otvoreným segmentom, to znamená, že pohyby vykonané v čase generovania správy sa neberú do úvahy, to znamená, že čas sa berie na začiatku druhého špecifikovaného v parametri. Zároveň sa pre tabuľku Obrat a pre tabuľku Zostávajúci A Obrat berú do úvahy časové hranice, to znamená, že sa berie čas na konci určenej sekundy.

Z tejto situácie existuje niekoľko spôsobov:

  1. Pri použití tabuľky Zvyšky uveďte časový bod o 1 sekundu väčší, ako je špecifikovaný;
  2. Používajte iba tabuľku Zostatky a obraty (nie je to najoptimálnejšia možnosť z hľadiska výkonu);
  3. Použite koncept hranice.

Posledná možnosť môže byť reprezentovaná kódom znázorneným na obr. 6.

V prvom parametri nášho objektu uvádzame dátum, ku ktorému je potrebné zostavu vygenerovať, druhý parameter určuje typ hranice. Keďže je pre nás dôležité, aby boli pohyby k danému dátumu zahrnuté vo vzorke, musíme tento parameter nastaviť do polohy „Vrátane“.

Veľmi často v žiadostiach 1C musíte pracovať s dátumami. Najmä vtedy, keď sa dotaz vytvára pre objekty metadát, ktoré obsahujú pravidelné informácie. Spravidla ide o registre (informačné, akumulačné, kalkulačné, účtovné). Uvažujme o najčastejšie používaných funkciách dopytovacieho jazyka 1C na prácu s dátumami. Príklady zostavíme na základe informačného registra Organizácie zamestnancov Revízia konfigurácie ZUP 2.5.

  • DÁTUM ČAS

    Umožňuje vám získať dátum v požiadavke (s časom alebo bez času) zadaním roka, mesiaca, dňa, hodiny, minúty, sekundy.
    Syntax:
    DÁTUM ČAS (rok, mesiac, deň, hodina, minúta, sekunda)
    Zvyčajne nie je určená hodina, minúta a sekunda. Uveďme si mini príklad. Do konzoly dotazov zadajte nasledujúci text:

    VYBERTE DÁTUM ČAS (2016, 1, 1)

    Výsledkom vykonania požiadavky je dátum - 1.1.2016
    V skutočnosti je ťažké si predstaviť situáciu, že dátum bude v žiadosti uvedený týmto spôsobom. Koniec koncov, keď potrebujete určiť obdobie, používajú sa parametre. Existuje však prípad, keď má táto funkcia mimoriadnu hodnotu. Vtedy potrebujeme zadať prázdny dátum v poliach alebo v podmienkach dotazu. Dovoľte mi pripomenúť, že pre jazyk 1C vyzerá prázdny dátum ako - 0001.01.01. Na získanie prázdneho dátumu v žiadosti teda stačí uviesť DÁTUM ČAS (1, 1, 1)... Ako príklad si vyberme z informačného registra Organizácie zamestnancov záznamy, ktoré nie sú vyplnené Obdobie dokončenia:

    VYBERTE zamestnancov organizácií Obdobie, Zamestnanci organizácií. Zamestnanec, Zamestnanci organizácií. Pozícia, Zamestnanci organizácií. Pododdelenie organizácie Z Registra informácií Zamestnanci organizácií AKO Zamestnanci organizácií KDE Zamestnanci organizácií.

  • ZAČIATOK OBDOBIA

    Vráti začiatok obdobia, do ktorého patrí pre zadaný dátum.
    Syntax:
    ZAČIATOK OBDOBIA (dátum, typ obdobia)
    PeriodType môže nadobúdať nasledujúce hodnoty: MINÚTA, HODINA, DEŇ, TÝŽDEŇ, MESIAC, ŠTVRŤROK, ROK, DEKÁDA, POLROČNÝ
    V konzole dotazu zadajte:

    VYBERTE ZAČIATOK OBDOBIA (DÁTUM ČAS (2016, 1, 15), MESIAC)

    Žiadosť sa vráti - 01.01.2016
    Teraz pre príklad. Ako viete frekvenciu v registri Organizácie zamestnancov jeden deň. Zostavme si dotaz, v ktorom sa namiesto platného obdobia evidencie zobrazí dátum začiatku mesiaca.

    VYBERTE SI ZAČIATOK OBDOBIA (Zamestnanci organizácií. Obdobie, MESIAC) AKO začiatok mesiaca, Zamestnanci organizácií. Zamestnanec, Zamestnanci organizácií. Pozícia, Zamestnanci organizácií. Pododdelenie organizácie.

  • KONIEC OBDOBIA

    Syntax je rovnaká ako na začiatku obdobia. A ako už názov napovedá, vráti koniec obdobia podľa dátumu a typu obdobia. Nebudeme sa podrobne zaoberať. Obmedzme sa na malý príklad.
    dopyt:

    VYBERTE KONIEC OBDOBIA (DÁTUM ČAS (2016, 1, 15), MESIAC)

    Návraty 31.1.2016 23:59:59
    Ako vidíte, hodnota sa vracia s presnosťou na sekundu.

  • PRIDAŤ

    Pridá zadaný počet časových úsekov k dátumu.
    Syntax:
    PRIDAŤ K DÁTUMU (dátum, typ obdobia, počet)
    PeriodType akceptuje rovnaké hodnoty ako pre funkciu ZAČIATOK OBDOBIA
    Vezmime si ako príklad februárový dátum:

    VYBERTE PRIDAŤ K DÁTUMU (DÁTUM ČAS (2016, 2, 15), MESIAC, 2)

    Dostaneme dátum 15.04.2016 0:00:00 Napriek tomu, že február je krátky mesiac, deň doručeného dátumu je rovnaký ako pôvodný. Je veľmi výhodné, že nemusíte myslieť na počet dní v mesiacoch.
    Číslo môže byť záporné. Potom sa interval počíta v opačnom smere.

  • ROZDIEL

    Vypočíta rozdiel medzi dvoma dátumami v zadaných jednotkách.
    Syntax:
    DÁTUMOVÝ ROZDIEL (dátum začiatku, dátum ukončenia, typ obdobia)
    Typ obdobia môže nadobúdať nasledujúce hodnoty: SEKUNDA, MINÚTA, HODINA, DEŇ, MESIAC, ŠTVRŤROK, ROK
    Napríklad:

    VYBERTE ROZDIEL DÁTUMU (DÁTUM ČAS (2016, 2, 15), DÁTUM ČAS (2016, 3, 1), DEŇ)

    vracia sa 15

Zvažovali sa tu najčastejšie používané funkcie dopytovacieho jazyka 1C. Zvyšok sa používa zriedka. V prípade potreby príklady práce s nimi nájdete v pomocníkovi zabudovanom do platformy 1C.

Pri práci s dátumami 1C je typické poradie častí dátumu rok, mesiac, deň, hodina, minúty, sekundy. V tomto prípade je možné preskočiť hodiny, minúty, sekundy.

Pri vytváraní dátumu z reťazca ("cast to date") môžete zadať v lokalizovanom formáte (deň.mesiac.rok hodiny: minúty: sekundy), ale iba úplne.

Napríklad:
// Práca s dátumami 1C - prevod dátumu na 1C z častí - rok, mesiac, deň (plus voliteľný čas)
Dátum = Dátum (2012,10,30); // nie je čas
Dátum = Dátum (2012,10,30,12,00,00); //s časom

// Práca s dátumami 1C - konvertujte dátum na 1C z reťazca rôznymi spôsobmi
Dátum = Dátum ("20121030"); // rok, mesiac, deň
Dátum = Dátum ("30. 10. 2012 12:00:00"); // lokalizovaný formát, iba v plnom znení

// Práca s dátumami 1C - určenie hodnoty dátumu bez pretypovania, priamo
Dátum = "20121030"; // nie je čas
Dátum = "20121030120000"; //s časom

Práca s dátumami 1C - Prázdny dátum 1C

Ak chcete skontrolovať plnosť dátumu 1C - porovnáva sa s „prázdnym dátumom“. Ak je v referenčnej knihe / dokumente atribút typu dátumu, ak používateľ toto pole nevyplnil, jeho hodnota bude tiež „prázdny dátum“.

"Dátum vyprázdnenia" je 01.01.0001 00:00:00.

Napríklad:
EmptyDate = "00010101000000";
Ak RequiredDate = "00010101000000" Potom
Správa („Nevyplnili ste veľmi potrebný dátum“);
Koniec Ak;

Práca s dátumami 1C - Dátum v detailoch (príručky, dokumenty atď.)

Pri zadávaní typu atribútu môžete určiť použitie:

  • Len dátum (čas je potom vždy 00:00:00)
  • Len čas (dátum je potom vždy 01.01.0001)
  • Dátum a čas

Získanie dátumu

Ak chcete získať dátum a čas, použite funkciu 1C CurrentDate ().

Veľmi dôležité miesto je miesto, kde sa táto funkcia volá – na klientovi alebo na serveri. Podrobnosti nájdete v téme „Režim výkonu / Výkon“. Často sa stáva, že na klientskych strojoch je čas mierne odlišný, a tak sa snažia využiť serverový čas všade – aj keď nie je na serveri správne nastavený, tak aspoň všetci klienti budú mať rovnaký nesprávny čas.

Na získanie dátumu servera (dátum nastavený v operačnom systéme serverového počítača) sa zvyčajne vytvorí spoločný modul v konfigurácii so zaškrtnutým políčkom "Server" vo vlastnostiach a v ňom sa vytvorí funkcia.
// funkcia sa nachádza v spoločnom module, napríklad s názvom ServerFunctions
// vo vlastnostiach spoločného modulu je zaškrtnuté políčko "Server" a políčko "Klient" nie je nastavené
Funkcia GetServerDate () Export
Vrátiť Aktuálny dátum ();
EndFunction

// volanie tejto funkcie na použitie z iného modulu vyzerá takto
DocumentObject.Date = ServerFunctions.GetServerDate (); //ModuleName.FunctionName ()

V tenkom klientovi je tiež priamo vedľa funkcií modulov uvedené, kde sa vykoná:

Začiatok a koniec dňa

K dátumu "30.10.2012":

  • dátum začiatku dňa vyzerá takto "10/30/2012 00:00:00"
  • dátum ukončenia vyzerá takto "10/30/2012 23:59:59"

Používa sa v zostavách a dotazoch, ktoré vyžadujú údaje za obdobie – deň, mesiac, rok.

Takže napríklad obdobie od 1.1.2012 00:00:00 do 31.1.2012 00:00:00 je nesprávne, pretože nezahŕňa jeden deň v mesiaci (ale zahŕňa jednu sekundu posledný deň v mesiaci).

Práca s dátumami 1C - Porovnávanie dátumov

Dátum obsahuje dátum a čas. Pri porovnávaní dátumov (okrem času) sa zvyčajne prenesú na začiatok dňa (mesiac, rok).

Napríklad:
Dátum1 = Dátum („30. 10. 2012 12:00:00“);
Ak StartDay (Date1) = StartDay (DocumentRef.Date) Then
Správa ("Doklad bol vložený do určeného dátumu");
Koniec Ak;

Pre každý prípad, príklad porovnania dátumov v období:
Ak DocumentRef.Date> = StartMonth (CurrentDate ()) a
DocumentRef.Date

Práca s dátumami 1C - Zmena dátumu

Dátum je počet sekúnd. Ak chceme nielen zistiť, či je jeden dátum väčší ako druhý, ale aj o koľko viac, potom dostaneme rozdiel v sekundách.

Napríklad:
DayStart = CurrentDate () - DayStart (CurrentDate ());
Správa ("Od začiatku dňa" + Reťazec (Od začiatku dňa) + "sekundy");
Správa ("Od začiatku dňa" + reťazec (Od začiatku dňa / 60) + "minúty");
Správa ("Od začiatku dňa" + reťazec (Od začiatku dňa / 60/60) + "hodiny");

Môžeme tiež zmeniť dátum, pri zmene pripočítame alebo odpočítame počet sekúnd:
StartThisDay = StartDay (CurrentDate ());

BeginningPreviousDay = BeginningDay (BeginningThisDay - 1); // odstráňte druhú - vykonanie "včera" a zoberte začiatok dňa od "včera"

StartPreviousDay = StartThisDay - 24 * 60 * 60; // inak - odpočítame 24 hodín - 24 (hodiny) * 60 (vypočítané minúty) * 60 (sekúnd)

Práca s dátumami 1C - Moment času

Časový bod je reprezentácia rozšíreného dátumu, ktorá sa vzťahuje na dokumenty (a teda aj na registre).

Je potrebné porovnať čas dokladov, ak sa dátum a čas dokladov zhodujú. V súlade s tým ho možno použiť pri filtrovaní v dopytoch.

Okamih v čase možno získať z dokumentu nasledujúcimi spôsobmi:
// metóda 1
DocumentMomentTime = DocumentRef.Timepoint ();

Môžete tiež porovnať bod v čase s dátumom/časom:
Moment of TimeStatus = Nový okamih času (Začiatok dňa (CurrentDate ()));
Ak DocumentRef.MomentTime () Porovnať (TimeTimeStandard) = -1 Potom
Správa („Dokument bol predstavený skôr ako dnes“);
Koniec Ak;
// Ak bol doklad zadaný do dnešného dňa o 00:00:00, tak bol aj tak zadaný - dnes

Práca s dátumami 1C - Formátovanie dátumu

Tento článok sa bude zaoberať spôsobmi, ako skontrolovať nulovú hodnotu v závislosti od typu zadávaného atribútu, vrátane nulového odkazu.

Ak jednoducho neexistujú žiadne rekvizity, vráti sa hodnota NULL. Typ v tomto prípade bude tiež NULL. Napríklad spájate dva stoly pomocou ľavého spojenia. V prípade, že sa v pravej tabuľke pre ľavú tabuľku nenájdu žiadne hodnoty, vráti sa NULL.

Kontrolu tejto hodnoty je možné vykonať pomocou konštrukcií "JE NULL" a "". V prvom prípade vráti hodnotu True alebo False. V druhom prípade môžete okamžite nastaviť inú hodnotu v prípade, že sa vráti NULL.

Žiadosť 1C 8.3 uvedená nižšie vráti zoznam kontaktných osôb pre tých partnerov, ktorí nemajú určený segment.

VYBRAŤ
ContactPartners.Link
OD
Adresár.Kontaktné osoby partnerov AKO KONTAKTNÉ OSOBY PARTNEROV
Adresár INTERNAL JOINT.SegmentyPartneri AKO SegmentyPartneri
Softvér Partner Contacts.Owner = Partner Segments.Parent
KDE
Partner Segments.Ref IS NULL

Prázdny dátum

Overenie pre prázdny dátum sa vykoná porovnaním s konštrukciou DATE TIME (1, 1, 1, 0, 0, 0). Príklad použitia je uvedený nižšie:

Prázdny odkaz v žiadosti 1C

V prípade, že vrátený atribút má typ odkazu, napríklad ide o prvok nejakého slovníka, dokumentu a pod., použije sa nasledujúca konštrukcia: VALUE (Directory.ReferenceName.EmptyRef).

V nižšie uvedenom príklade dotaz vyberie všetkých partnerov, ktorí nemajú špecifikovanú obchodnú oblasť.

Ak chcete skontrolovať „ValueFilled“, musíte urobiť opačnú podmienku:

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

Prázdny riadok

Na kontrolu typov reťazcov sa vykoná porovnanie s iným vzorom. V tomto prípade - "".

Dotaz nižšie vyberie všetkých partnerov s prázdnym názvom.

V určitom okamihu je potrebné pracovať s premennými typu „Dátum“. V tomto článku sa pozrieme na základné techniky – odovzdanie aktuálneho dátumu, kontrola prázdnej hodnoty, ľubovoľný dátum.

Pri písaní dopytov je často potrebné porovnávať údaje s aktuálnym dátumom. Vstavaný jazyk 1C má funkciu CurrentDate (). Umožňuje vám určiť aktuálny čas a dátum v počítači. Pre vykonávanie operácií s aktuálnym dátumom je potrebné odovzdať do požiadavky hodnotu tejto funkcie ako parameter.

Nižšie je uvedený dotaz, ktorý vyberie všetky súbory pripojené k výkazom výdavkov s dátumom vytvorenia až doteraz:

ExampleRequest = Nová požiadavka;
ExampleRequest.Text = "
| VYBERTE SI
| Advance ReportAttached Files.Link
| OD
| Reference.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
| KDE
| Advance Report Attached Files.Date< &ТекДата»;
ExampleRequest.SetParameter ("CurrentDate", CurrentDate ());

Vlastný dátum

Vyššie uvedená funkcia vám umožňuje porovnávať, a teda robiť výber pre ľubovoľné obdobie. Táto metóda vám umožňuje zadať prísny výber v dotaze bez použitia ďalších parametrov.

Všimnite si, že použitím tejto funkcie vo vyššie uvedenom príklade sme ako vstupné parametre odovzdali iba tri čísla (rok, mesiac, deň). Posledné tri (hodina, minúta, sekunda) sú voliteľné a ak chýbajú, nahradia sa „0“, čiže začiatok dňa.

V tomto príklade dostanete všetky súbory pripojené k výkazom výdavkov do konca minulého roka 2016. V tejto súvislosti uvedieme hodinu, minútu a sekundu, aby sme porovnali s časovým momentom „31. decembra 2016 o 23:59:59“.

VYBRAŤ
Advance ReportAttached Files.Link
OD
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles
KDE
Advance Report Attached Files.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Prázdny dátum

Najjednoduchšie je jednoduchým porovnaním skontrolovať premennú, či neobsahuje prázdny dátum. V tomto príklade pomocou dotazu vyberieme všetky pokladničné doklady na bankový účet, pri ktorých nie je vyplnený dátum prijatia.