Jak zadat prázdné datum v dotazu? 1c funkce pro práci s daty v dotazu.

Všechny dokumenty, které existují v konfiguracích 1C, a tedy téměř všechny registry, musí mít alespoň jeden atribut s typem Date, proto každý vývojář potřebuje znát a rozumět:

  • Jak převést parametry jiných typů na příslušný typ;
  • Jak definovat prázdné datum v dotazu 1C;
  • Jaký je rozdíl mezi datem a časovým limitem.

To jsou otázky, na které se pokusíme odpovědět v našem článku.

Co je to datum a jak ho určit

Protože většina manažerských rozhodnutí a účetnictví nevyžaduje přesnost času přesahující 1 sekundu, vývojáři platformy 1C se rozhodli, že tato hodnota bude minimální limit ve formátu data. Každý atribut popisující čas události v programu tedy musí obsahovat:

  • Rok, kdy k události došlo;
  • Měsíc této události;
  • Den.

Volitelné: hodina, minuta a sekunda. Pokud jsou tyto tři parametry vynechány a neexistují žádné další podmínky, program automaticky nastaví čas na začátek dne.

Formáty data existující ve světě mají významný rozdíl:

  1. V Rusku jsme zvyklí dávat na první místo den, pak měsíc události a na konec rok;
  2. Obyvatelé USA začínají datum měsícem;
  3. Češi, Poláci a Slovinci zaznamenávají období ve formátu „Rok – Měsíc – Den“.

Právě druhý formát používá platforma 1C.

Převést na datum

Chcete-li získat parametr typu Datum z několika hodnot nebo z řetězce, musíte použít kód zobrazený na Obr. 1

Jak je z výše uvedeného obrázku patrné, datum určíte jak pomocí jednoho řádku, tak rozdělením tohoto řádku na jednotlivé části pomocí čárky se výsledek nezmění.

Je důležité pochopit, že rok data musí obsahovat čtyři číslice, včetně tisíciletí a století události, měsíc, den, hodiny a sekundy musí mít dva znaky, včetně úvodních nul.

Odpočítávání v programu začíná od začátku dne 1. ledna 0001. U výše uvedeného kódu lze tuto hodnotu určit jedním ze dvou způsobů (obrázek 2).

Rýže. 2

Ve druhém řádku jsme vynechali hodiny, minuty a sekundy události, což ani v nejmenším neovlivnilo výkon našeho kódu.

Funkce použití dat v dotazech 1C

Pro většinu datových typů používaných platformou 1C existují předdefinované hodnoty void. Pro čísla je to 0, pro odkazy můžete definovat hodnotu EmptyReference(), pro datum je datum začátku odpočítávání považováno za prázdnou hodnotu, s ní jsou uvedeny podrobnosti odpovídajícího typu musí být porovnány při nastavování parametrů dotazu.

Je důležité pochopit, že i když v hodnotě atributu formuláře daného typu nejsou zadána žádná čísla, to znamená, že okno vypadá jako (obr. 3), neznamená to, že v něm není nic uvedeno, srovnání tohoto parametru s prázdným řetězcem nebude fungovat.

Rýže. 3

Po obdržení prázdného data jej můžeme specifikovat jako parametr našeho požadavku, tedy použít konstrukci (obr. 4)

Jsou však chvíle, kdy je lepší zkontrolovat uvnitř těla požadavku bez předání prázdného data jako parametru. K tomu můžete zadat příslušnou podmínku do kódu dotazu (obr. 5) a použít dotazovací funkci DateTime().

Rýže. 5

V daném textu požadavku jsme vynechali úvodní nuly z roku, měsíce a dne a také neuvedli hodiny, minuty a sekundy a program, jak se říká, tento předpoklad sežral.

Datum a časový limit

Další zajímavý fakt pokud jde o vztah mezi dotazy a datem, je použití pojmu „časový bod“ při odkazování na různé databázové tabulky.

Přesnost „až na milisekundu“, uvedená v technické dokumentaci při popisu primitivního typu Datum, se nejzřetelněji projevuje při výběru záznamů z virtuálních tabulek registru akumulace: pokud registr akumulace má kromě tabulky Obrat byly provedeny tabulky Remains a RemainsAnd Turnovers a poté na nich výběr určitý čas, může poskytnout různé výsledky.

Abyste pochopili, jak a proč k tomu dochází, zvažte jednoduchý příklad:

  1. Před realizací prodejního dokladu ve 12 hodin 31 minut 36 sekund byly zůstatky podle nomenklatury Cukr 30 kg;
  2. dokument v určený čas Odepsáno bylo 10 kg;
  3. Zpráva vygenerovaná k datu dokumentu ve 12 hodin 31 minut 36 sekund podle tabulky Zbytky bude uvádět zůstatek 30 kg;
  4. Stejný přehled na tabulce Zůstatky a obraty současně zobrazí zůstatek 20 kg.

Jaký je důvod tohoto chování a jak se mu vyhnout?

Problém je v tom, že v tabulce Remains je období nastaveno jako otevřený segment, to znamená, že se neberou v úvahu pohyby provedené v době, kdy byla sestava generována, to znamená, že se bere čas na začátku druhá zadaná v parametru. Zároveň se pro tabulku Obraty a pro tabulku Zbytky a obraty zohledňují časové limity, to znamená, že se bere čas na konci zadané vteřiny.

Existuje několik způsobů, jak z této situace ven:

  1. Při použití tabulky Zbytky zadejte časový bod o 1 sekundu větší než zadaný;
  2. Používejte pouze tabulku Zůstatky a obraty (není to nejoptimálnější možnost z hlediska výkonu);
  3. Použijte termín hranice.

Poslední možnost může být reprezentována kódem znázorněným na Obr. 6.

V prvním parametru našeho objektu udáváme datum, ke kterému má být report vygenerován, druhý parametr určuje typ ohraničení. Protože je pro nás důležité, aby byly pohyby k danému datu zahrnuty do výběru, musíme tento parametr nastavit na pozici „Včetně“.

Když je poměrně často potřeba pracovat s proměnnými typu "Datum". V tomto článku se podíváme na hlavní techniky – předání aktuálního data, kontrola prázdné hodnoty, libovolné datum.

Při psaní dotazů je často nutné porovnávat data s aktuálním datem. Vestavěný jazyk 1C má funkci CurrentDate(). Umožňuje vám určit aktuální čas a datum na vašem počítači. Pro provádění operací s aktuálním datem musí být hodnota této funkce předána požadavku jako parametr.

Níže je dotaz, který vybere všechny soubory připojené k předběžným přehledům s datem vytvoření až do současnosti:

RequestExample = Nový požadavek;
ExampleRequest.Text =
| VYBERTE SI
| Advance ReportAttachedFiles.Link
| OD
| Directory.Advance ReportAttachedFilesAS AdvanceReportAttachedFiles
| KDE
| Advance ReportAttachedFiles.Date< &ТекДата»;
Příklad dotazu.SetParameter("AktuálníDatum", AktuálníDatum());

Libovolné datum

Výše popsaná funkce vám umožňuje porovnávat a tedy provádět výběr pro libovolné období. Tato metoda umožňuje zadat v dotazu přísný výběr bez použití dalších parametrů.

Upozorňujeme, že při použití této funkce ve výše uvedeném příkladu jsme jako vstupní parametry předali pouze tři čísla (rok, měsíc, den). Poslední tři (hodina, minuta, sekunda) jsou nepovinné a pokud chybí, jsou nahrazeny "0", to je začátek dne.

V rámci tohoto příkladu budou přijaty všechny soubory připojené k předběžným zprávám do konce loňského roku 2016. V tomto ohledu upřesníme hodinu, minutu a sekundu pro porovnání s časovým okamžikem „31. prosince 2016 23:59:59“.

VYBRAT
Advance ReportAttachedFiles.Link
Z
Directory.Advance Report Attached Files AS Advance Report Attached Files
KDE
Advance ReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

prázdné datum

Nejjednodušší způsob, jak zkontrolovat proměnnou, zda neobsahuje prázdné datum, je jednoduché porovnání. V tomto příkladu pomocí dotazu vybereme všechny pokladní doklady na účet, které nemají vyplněné datum přijetí.

V dotazech 1C, stejně jako ve vestavěném jazyce platformy 1C:Enterprise, existují funkce pro práci s daty. Pomáhají zjednodušit převody data v dotazech a vyhýbají se použití velkého množství parametrů. Podívejme se na tyto funkce.

Jak nastavit datum v dotazech 1C jako konstantu

DATETIME (rok, měsíc, den, hodina, minuta, sekunda). Možnosti Rok, Měsíc A Den jsou vyžadovány, jiné nikoli. Pokud nezadáte čas, systém nastaví začátek dne.

Žádost. Text= "VYBRAT
DATETIME (2016,09,28,12,22,00)"
; // Výsledek: 28. září 2016 12:22:00

Kromě toho lze jako parametry této funkce zadat pouze explicitní čísla. Nemůžete zadat hodnoty jiných funkcí jako parametry. Například tato konstrukce nebude fungovat:

Žádost. Text= "VYBRAT
DATETIME(rok(zdroj.datum),09,28;12;22,00)
From Directory.Source AS Source"
;

Jak získat začátek nebo konec roku, půl roku, čtvrtletí, měsíc, dekádu, týden, den, hodinu, minutu v dotazech 1C

K tomu slouží následující funkce:

  • StartPeriod (datum, období)
  • EndPeriod(Datum, Období)

Jako parametr datum předaná hodnota s typem Datum. Parametr Doba .

Žádost. Text= "VYBRAT
StartPeriod(DATETIME(2016,09,28,12,22,00), DECAD)"
; // Výsledek: 21. září 2016 0:00:00

Žádost. Text= "VYBRAT
EndPeriod(DATETIME(2016,09,28,12,22,00), QUARTER)"
; // Výsledek: 30. září 2016 23:59:59

Jak můžete vidět z příkladů, v těchto funkcích lze použít další, vnořené, funkce.

Jak získat rok, den v roce, čtvrtletí, měsíc, týden, den v týdnu, den, hodinu, minutu, sekundu z data v dotazech 1C

K tomu existují odpovídající funkce, ve kterých je třeba předat datum jako parametr.

  • Funkce ROK (datum)- vrátí číslo roku;
  • Funkce DEN ROKU (datum)- vrátí číslo dne v roce;
  • Funkce ČTVRTLETÍ (datum)- vrátí číslo čtvrtletí;
  • Funkce MĚSÍC (datum)- vrátí číslo měsíce;
  • Funkce TÝDEN (datum)- vrátí číslo týdne v roce;
  • Funkce DEN V TÝDNU (datum)- vrací číslo dne v týdnu (pondělí - 1, neděle - 7);
  • Funkce DEN (datum)- vrátí číslo dne v měsíci;
  • Funkce HODINA (datum)- vrátí hodinu;
  • Funkce MINUTA (datum)- vrací minuty;
  • Funkce DRUHÝ (datum)- vrátí sekund.

Žádost. Text= "VYBRAT
ROK(DATUMČAS(2016;09;28;12;22;00))“
; // Výsledek: 2016

Žádost. Text= "VYBRAT
WEEK(DATETIME(2016;09;28;12;22;00))"
; // Výsledek: 40

Žádost. Text= "VYBRAT
DAYWEEK(DATETIME(2016;09;28;12;22;00))“
; // Výsledek: 3

Žádost. Text= "VYBRAT
DAYYEAR(DATETIME(2016;09;28;12;22;00))“
; // Výsledek: 272

Žádost. Text= "VYBRAT
DAY(DATETIME(2016;09;28;12;22;00))"
; // Výsledek: 28

Jak přidat nebo odečíst od data rok, půl rok, čtvrtletí, měsíc, dekáda, týden, den, hodina, minuta, sekunda v dotazech 1C

K tomu slouží funkce AddKDate(Datum, Období, Hodnota).

Jako parametr datum předaná hodnota s typem Datum. Parametr Doba může nabývat jedné z následujících hodnot: DRUHÝ, MINUTA, HODINA, DEN, TÝDEN, DEKÁDA, MĚSÍC, ČTVRTLETÍ, PŮLLET, ROK.

Parametr Význam zobrazuje počet přidaných období. Pokud je třeba odečíst období, pak parametr Význam musí být negativní.

Žádost. Text= "VYBRAT
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0); POLOLETNÍ, 1)"
; // Výsledek: 28. března 2017 12:22:00

Žádost. Text= "VYBRAT
AddKDate(DATETIME(2016, 9; 28; 12, 22; 0); DECAD; -1)"
; // Výsledek: 18. září 2016 12:22:00

Jak vypočítat rozdíl v datech v dotazech 1C

K tomu slouží funkce Datum rozdílu (Datum1, Datum2, Období).

Parametr Datum 1 je datum, které se má odečíst.

Parametr Datum 2 - datum, od kterého se má odečíst.

Parametr Doba může nabývat jedné z následujících hodnot: DRUHÝ, MINUTA, HODINA, DEN, MĚSÍC, ČTVRTLETÍ, ROK. Ukazuje, v jakých jednotkách chceme získat výsledek

Žádost. Text= "VYBRAT
Rozdíl DATUM(DATUM ČAS(2016, 9, 28, 12, 22; 0); DATUM ČAS (2017, 9, 28, 12, 22, 0); ČTVRTLETÍ)"
; // Výsledek: 4

Žádost. Text= "VYBRAT
Rozdíl DATUM(DATETIME(2016; 9; 28; 12; 22; 0); DATETIME(2017; 9; 28; 12; 22; 0); Second)“
; // Výsledek: 31 536 000

Ve všech funkcích kromě funkce ČAS SCHŮZKY, jako parametr datum může působit nejen konkrétní hodnota data (konstanta nebo parametr dotazu), ale také pole zdrojové tabulky.

Typ "Datum" v 1C je jedním ze 4 hlavních datových typů spolu s číslem, řetězcem a booleanem. Data jsou v konfiguracích všudypřítomná – práci s tímto datovým typem se při vývoji nelze vyhnout. Proto je lepší začít s psaním dotazů, už s pochopením, jak data zpracovávat, jaké jsou možnosti práce s nimi, jak se ukládají. Podívejme se na příklady všech nuancí psaní dotazů s různými daty.

Příklady práce s daty v dotazech 1C

Nejprve musíte v poptávce získat datum v požadovaném formátu - s časem nebo bez. Tento úkol lze splnit několika způsoby:

  1. Předat přes parametr. Tato metoda je jediný způsob, jak získat aktuální datum relace;
  2. Získejte datum v dotazu z pole výběru;
  3. Převod z číselných hodnot pomocí funkce DATETIME().

Nejčastějším úkolem při práci s dokumenty je kontrola prázdného data v dotazu 1C. V tomto případě je nejjednodušší porovnat proměnnou nebo pole s prázdným datem, které se získá pomocí funkce DATETIME(1,1,1):

DATETIME(1; 1; 1)

Podobným příkazem můžete v požadavku získat libovolné datum a čas. Zároveň je lze specifikovat s přesností až na sekundu zadáním 6 čísel jako parametrů. Pokud jsou použita pouze 3 čísla, hodiny, minuty a sekundy budou nastaveny na 0 (začátek dne). Potřebujeme například vybrat dokumenty za prvních 10 dní ledna 2018 v dotazu:

VYBERTE Potvrzení do vypořádacího účtu.Odkaz JAKO Reference FROM Document.Příjem do vypořádacího účtu JAKO Potvrzení do vypořádacího účtu WHERE Potvrzení na vypořádací účet.Datum BETWEEN DATETIME(2018, 1, 1, 0, 0, 0) AND DATETIME(2018, 1, 10, 23, 59, 59)

V požadavku ve vestavěném jazyce 1C můžete nejen vybrat různá pole a přijímat parametry. Existuje mnoho funkcí, které usnadňují formátování data pro potřeby konkrétního úkolu. Pokud často pracujete s daty v dotazu, měli byste znát tyto příkazy:

  • ZAČÁTEK OBDOBÍ. Jako parametry zadejte datum a časový interval, v jehož kontextu je nutné získat začátek data. Slouží k převodu data do nadčasového formátu. Chcete-li to provést, musíte nastavit druhý parametr - "DAY";
PERIOD START(,) PERIOD START(&Datum, DAY) období>datum>
  • ENDPERIOD. Podobný příkaz, který vrací poslední datum v kontextu jednotek zadaných v parametrech;
  • PŘIDAT. Umožňuje získat datum větší o daný počet zadaných časových jednotek. Datum, časová jednotka a číslo jsou specifikovány jako funkční parametry;
ADDDATE(,) ADDDATE(&Datum, DEN, 10) počet>typ>datum>
  • DATUM ROZDÍL Získá rozdíl mezi daty v zadaných jednotkách;
DATEDIFF(,) DATEDIFF(&Datum1, &Datum2, DEN) typ>datum2>datum1>
  • DEN V TÝDNU. Vrátí pořadové číslo jednoho ze dnů v týdnu.

Při správné aplikaci těchto funkcí může vývojář řešit docela netriviální úkoly. Například získání názvu dne v týdnu aktuálního data v dotazu jako řetězec:

SELECT WHENWEEKDAY(&CurrentDate) = 1 THEN "pondělí" WHENWEEKDAY(&CurrentDate) = 2 THEN "úterý" WHENWEEKDAY(&CurrentDate) = 3 THEN "středa" WHENWEEKDAY(&CurrentDate) = 4 THEN "čtvrtek" THENCurrentsWHENDWEDAY " WHENWEEKDAY(&CurrentDate) aktuální datum) = 5 POTOM "Pátek" WHEN DAYWEEK(&CurrentDate) = 6 POTOM "Sobota" JINAK "Neděle" KONEC

Převod typů v dotazu 1C z čísla nebo řetězce na datum je pracný úkol. Z čísel lze získat datum pomocí funkce DATETIME, z řetězce - kombinací funkce SUBSTRING a konstrukce SELECT WHEN THEN ELSE. Na základě toho vývojáři preferují získat datum z jiných typů v modulu a předat jej požadavku pomocí parametru. Bohužel to není vždy možné, takže musíte změnit formát data v žádosti.

V požadavku 1C je možné zadat datum jako parametr pro získání dat z tabulek virtuálních registrů. V této roli můžete také využívat všechny výše uvedené funkce. Tady je ale důležité nenechat prázdné datum v požadavku 1C by mohl ovlivnit konečný výsledek spuštění kódu, takže je nutné provést kontrolu.

Velmi často v 1C dotazech musíte pracovat s daty. Zvláště když je požadavek postaven na metadatové objekty, které obsahují periodické informace. Zpravidla se jedná o registry (informační, akumulační, kalkulační, účetní). Zvažte nejčastěji používané funkce dotazovacího jazyka 1C pro práci s daty. Příklady sestavíme na základě informačního registru Zaměstnanci Organizace Konfigurace ZUP verze 2.5.

  • ČAS SCHŮZKY

    Umožňuje získat datum v dotazu (s časem nebo bez času) zadáním roku, měsíce, dne, hodiny, minuty, sekundy.
    Syntax:
    DATETIME (rok, měsíc, den, hodina, minuta, sekunda)
    Obvykle se neuvádí hodina, minuta a sekunda. Vezměme si mini příklad. Do konzoly dotazu zadejte následující text:

    SELECT DATETIME(2016; 1; 1)

    Výsledkem dotazu je datum - 1.1.2016
    V podstatě je těžké si představit situaci, kdy bude datum v žádosti uvedeno tímto způsobem. Koneckonců, když potřebujete zadat období, používají se parametry. Existuje však případ, kdy má tato funkce zvláštní hodnotu. To je, když potřebujeme zadat prázdné datum v polích nebo v podmínkách dotazu. Dovolte mi připomenout, že pro jazyk 1C vypadá prázdné datum jako - 0001.01.01. Pro získání prázdného data v požadavku tedy stačí uvést DATETIME(1; 1; 1). Jako příklad vyberme z informačního rejstříku Zaměstnanci Organizace záznamy, které nejsou vyplněny Doba dokončení:

    VYBRAT Zaměstnanci organizací. Období, Zaměstnanci organizací. Zaměstnanci, Zaměstnanci organizací. Pozice, Zaměstnanci organizací. Oddělení organizací Z registru informací. Zaměstnanci organizací JAKO Zaměstnanci organizací KDE Zaměstnanci organizací. Období dokončení = DATETIME(1, 1, 1)

  • ZAČÁTEK OBDOBÍ

    Pro zadané datum vrátí začátek období, do kterého patří.
    Syntax:
    ZAČÁTEK OBDOBÍ (datum, typ období)
    PeriodType může nabývat následujících hodnot: MINUTA, HODINA, DEN, TÝDEN, MĚSÍC, ČTVRTLETÍ, ROK, DEKÁDA, PŮL ROKU
    V konzole dotazu zadejte:

    VYBERTE ZAČÁTEK OBDOBÍ (DATUM ČAS (2016, 1, 15), MĚSÍC)

    Žádost se vrátí - 01.01.2016
    A teď příklad. Jak víte, frekvence registru Zaměstnanci Organizace jednoho dne. Vytvořme dotaz, ve kterém se místo skutečného období záznamů zobrazí datum začátku měsíce.

    VYBERTE SI ZAČÁTEK OBDOBÍ (Zaměstnanci organizací. Období, MĚSÍC) JAKO Začátek měsíce, Zaměstnanci organizací. Zaměstnanec, Zaměstnanci organizací. Pozice, Zaměstnanci organizací. Oddělení organizace Z registru informací. Zaměstnanci organizací AS Zaměstnanci organizací

  • ENDPERIOD

    Syntaxe je stejná jako pro začátek období. A jak název napovídá, vrací konec období podle data a typu období. Nebudeme se podrobně zabývat. Omezujeme se na malý příklad.
    Žádost:

    VYBERTE KONCOVÉ OBDOBÍ(DATUM ČAS(2016, 1, 15), MĚSÍC)

    Návraty 31.01.2016 23:59:59
    Jak vidíte, hodnota se vrací s přesností na sekundu.

  • PŘIDAT

    Přidá zadaný počet časových úseků k datu.
    Syntax:
    ADDDATE(Datum, Typ období, Počet)
    PeriodType má stejné hodnoty jako funkce ZAČÁTEK OBDOBÍ
    Vezměme si jako příklad únor:

    SELECT ADDDATE(DATETIME(2016, 2; 15); MONTH; 2)

    Dostáváme datum 15.04.2016 0:00:00 Přestože je únor krátký měsíc, den obdrženého data je stejný jako ten původní. Je velmi výhodné, že nemusíte myslet na počet dní v měsících.
    Číslo může být i záporné. Poté se interval počítá v opačném směru.

  • DATUM ROZDÍL

    Vypočítá rozdíl mezi dvěma daty v zadaných jednotkách.
    Syntax:
    DATEDIFF(datum zahájení, datum ukončení, typ období)
    Typ období může nabývat následujících hodnot: DRUHÁ, MINUTA, HODINA, DEN, MĚSÍC, ČTVRTLETÍ, ROK
    Například:

    SELECT DATE DIFFERENCE(DATETIME(2016, 2; 15); DATETIME(2016, 3, 1); DAY)

    vrací 15

Zde byly zvažovány nejčastěji používané funkce dotazovacího jazyka 1C. Zbytek se používá zřídka. V případě potřeby lze příklady práce s nimi nalézt v nápovědě zabudované do platformy 1C.



chyba: Obsah je chráněn!!