Dotazy 1C, ako aj vstavaný jazyk platformy 1C:Enterprise majú funkcie na prácu s dátumami. Pomáhajú zjednodušiť konverzie dátumu v dopytoch, čím sa vyhýbajú použitiu veľké množstvo parametre. Pozrime sa na tieto funkcie.

Ako nastaviť dátum v dotazoch 1C ako konštantu

DATETIME (rok, mesiac, deň, hodina, minúta, sekunda). Možnosti Rok, Mesiac A deň sú povinné, iné nie. Ak nezadáte čas, systém nastaví začiatok dňa.

Žiadosť. Text= "VYBERTE si
DATETIME (2016,09,28,12,22,00)"
; // Výsledok: 28. september 2016 12:22:00

Okrem toho je možné explicitne zadať iba čísla ako parametre tejto funkcie. Ako parametre nemôžete zadať hodnoty iných funkcií. Napríklad táto konštrukcia nebude fungovať:

Žiadosť. Text= "VYBERTE si
DATETIME (Rok (Source.Date),09,28,12,22,00)
Zo zdroja Directory.Source ako zdroja"
;

Ako získať začiatok alebo koniec roka, pol roka, štvrťrok, mesiac, dekádu, týždeň, deň, hodinu, minútu v dopytoch 1C

Na tento účel sa používajú nasledujúce funkcie:

  • StartPeriod (dátum, obdobie)
  • EndPeriod(dátum, obdobie)

Ako parameter Dátum je odovzdaná hodnota s typom Dátum. Parameter Obdobie .

Žiadosť. Text= "VYBERTE si
StartPeriod(DATETIME (2016,09,28,12,22,00), DECADE)"
; // Výsledok: 21. september 2016 0:00:00

Žiadosť. Text= "VYBERTE si
EndPeriod(DATETIME (2016,09,28,12,22,00), QUARTER)"
; // Výsledok: 30. september 2016 23:59:59

Ako môžete vidieť z príkladov, v týchto funkciách môžete použiť ďalšie vnorené funkcie.

Ako získať rok, deň v roku, štvrťrok, mesiac, týždeň, deň v týždni, deň, hodinu, minútu, sekundu z dátumu v dopytoch 1C

Na tento účel existujú zodpovedajúce funkcie, ktorým musíte odovzdať dátum ako parameter.

  • Funkcia ROK (dátum)— vráti číslo roku;
  • Funkcia DAYYEAR (dátum)— zvyšuje počet dní v roku;
  • Funkcia ŠTVRŤ (dátum)— vráti číslo štvrťroka;
  • Funkcia MESIAC (dátum)— vráti číslo mesiaca;
  • Funkcia WEEK (dátum)— vráti číslo týždňa v roku;
  • Funkcia DEŇ TÝŽDŇA (dátum)— vráti číslo dňa v týždni (pondelok — 1, nedeľa — 7);
  • Funkcia DAY (dátum)— vráti číslo dňa v mesiaci;
  • Funkcia HODINA (dátum)— vráti hodinu;
  • Funkcia MINÚTA (dátum)— vráti minúty;
  • Funkcia DRUHÝ (dátum)— vráti sekundy.

Žiadosť. Text= "VYBERTE si
YEAR(DATETIME (2016,09,28,12,22,00))"
;

Žiadosť. Text= "VYBERTE si
// Výsledok: 2016
WEEK(DATETIME (2016,09;28;12;22,00))"

Žiadosť. Text= "VYBERTE si
;
// Výsledok: 40

Žiadosť. Text= "VYBERTE si
WEEKDAY(DATETIME (2016,09,28,12,22,00))"
;

Žiadosť. Text= "VYBERTE si
// Výsledok: 3
YEARDAY(DATETIME (2016,09,28,12,22,00))"

;

// Výsledok: 272 DAY(DATETIME (2016,09,28,12,22,00))"

Ako parameter Dátum je odovzdaná hodnota s typom Dátum. Parameter Obdobie; // Výsledok: 28, Ako pridať alebo odpočítať od dátumu rok, polrok, ​​štvrťrok, mesiac, dekáda, týždeň, deň, hodina, minúta, sekunda v dopytoch 1C.

Ak to chcete urobiť, použite funkciu AddToDate (dátum, obdobie, hodnota). môže nadobudnúť jednu z nasledujúcich hodnôt: AddToDate (dátum, obdobie, hodnota). DRUHÝ

Žiadosť. Text= "VYBERTE si
MINÚTA, HODINA, DEŇ, TÝŽDEŇ, DEKÁDA, MESIAC, ŠTVRŤROK, POLROK, ROK
; Parameter

Žiadosť. Text= "VYBERTE si
Význam
; zobrazuje počet období, ktoré sa majú pridať. Ak je potrebné odpočítať obdobie, potom parameter

musí byť negatívny.

// Výsledok: 272 AddTODate(DATETIME(2016, 9, 28, 12, 22, 0), POLROK, 1)"

Ak to chcete urobiť, použite funkciu // Výsledok: 28. marca 2017 12:22:00 AddKDate(DATETIME(2016, 9; 28; 12; 22; 0); DECADE; -1)"

Ak to chcete urobiť, použite funkciu // Výsledok: 18. september 2016 12:22:00 Ako vypočítať rozdiel dátumov v dopytoch 1C

Ak to chcete urobiť, použite funkciu Obdobie; // Výsledok: 28, Dátum rozdielu(dátum1, dátum2, obdobie). Dátum1

Žiadosť. Text= "VYBERTE si
- dátum, ktorý sa má odpočítať.
Dátum 2 —

Žiadosť. Text= "VYBERTE si
dátum, od ktorého sa má odpočítať.
; MINÚTA, HODINA, DEŇ, MESIAC, ŠTVRŤROK, ROK

. Ukazuje, v akých jednotkách chceme získať výsledok RozdielDátum(DÁTUMČAS(2016, 9, 28, 12, 22; 0), DÁTUMČAS(2017, 9, 28, 12, 22, 0), ŠTVRŤROVEK)"; Dátum// Výsledok: 4

RozdielDátum(DÁTUMČAS(2016, 9; 28; 12, 22; 0), DÁTUMČAS(2017, 9, 28, 12, 22; 0); Sekunda)“

  • // Výsledok: 31 536 000
  • Vo všetkých funkciách okrem funkcie
  • DATETIME

, ako parameter

môže byť nielen konkrétna hodnota dátumu (konštanta alebo parameter dotazu), ale aj polia zdrojovej tabuľky.

Od prijať väčšinu manažérske rozhodnutia a vedenie záznamov nevyžaduje presnosť času presahujúcu 1 sekundu, vývojári platformy 1C sa rozhodli, že táto hodnota bude vo formáte dátumu absolútne minimum. Každý atribút popisujúci čas udalosti v programe teda musí obsahovať:

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

Nie je potrebné uvádzať: hodinu, minútu a sekundu. Ak tieto tri parametre vynecháme a nie dodatočné podmienky, program automaticky nastaví čas na začiatok dňa.

Formáty dátumu, ktoré existujú vo svete, majú významné rozdiely:

  1. V Rusku sme zvyknutí dávať na prvé miesto deň, potom mesiac udalosti a na koniec rok;
  2. Obyvatelia USA začínajú dátum mesiacom;
  3. Česi, Poliaci a Slovinci zaznamenávajú obdobia vo formáte Rok – Mesiac – Deň.

Práve posledný uvedený formát používa platforma 1C.

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. 1

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

Je dôležité pochopiť, že rok dátumu musí obsahovať štyri číslice vrátane tisícročia a storočia udalosti, mesiac, deň, hodiny a sekundy musia mať dva znaky vrátane úvodných núl.

Odpočítavanie času 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ázok 2).

Ryža. 2

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

Funkcie používania dátumu v dopytoch 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 EmptyLink(), pre dátum sa prázdna hodnota zvyčajne považuje za počiatočný dátum a práve s tým je potrebné porovnať detaily príslušného typu pri nastavovaní parametre požiadavky.

Je dôležité pochopiť, že aj keď nie sú uvedené žiadne čísla v hodnote atribútu formulára, ktorý má daný typ, 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. Za týmto účelom môžete zadať príslušnú podmienku do kódu požiadavky (obr. 5) a použiť funkciu požiadavky DateTime().

Ryža. 5

Vo vyššie uvedenom texte žiadosti sme vynechali úvodné nuly pre rok, mesiac a deň a tiež sme neuviedli hodiny, minúty a sekundy a program, ako sa hovorí, tento predpoklad zjedol.

Dátum a časová hranica

Ďalší zaujímavý fakt v súvislosti so vzťahom medzi dopytmi a dátumami je použitie pojmu „časový bod“ pri prístupe k rôznym databázovým tabuľkám.

Presnosť „až na milisekúndu“ uvedená v technickej dokumentácii pri popise primitívneho typu Dátum sa najzreteľnejšie prejaví pri výbere záznamov z virtuálnych tabuliek registra akumulácie: ak má register akumulácie okrem tabuľky Obrat aj tabuľku Zostávajúce. a tabuľky Zostávajúce a Obratové, potom sa odber vzoriek z nich vykonáva po určitú dobu, môžu poskytnúť odlišné výsledky.

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

  1. Pred vykonaním predajného dokladu o 12 hodinách 31 minútach 36 sekundách boli zostatky podľa nomenklatúry cukru 30 kg;
  2. Doklad odpísal 10 kg v určenom čase;
  3. Správa vygenerovaná k dátumu dokladu o 12 hodine 31 minúte 36 sekunde podľa tabuľky Zostávajúce zobrazí zostatok 30 kg;
  4. Rovnaký výkaz na tabuľke Obraty a Obraty za rovnaký čas 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ávajúce je obdobie špecifikované ako otvorený segment, to znamená, že pohyby uskutočnené v čase generovania zostavy sa neberú do úvahy, to znamená, že sa berie čas na začiatku sekundy špecifikovanej v parametra. Zároveň sa pre tabuľku Obrat a pre tabuľku Zostatky a Obraty 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 do výberu zahrnuté pohyby k danému dátumu, musíme tento parameter nastaviť do polohy „Vrátane“.

Typ „Dátum“ v 1C je jedným zo 4 hlavných dátových typov spolu s číslom, reťazcom a logickou hodnotou. Dátumy sú v konfiguráciách všadeprítomné – počas vývoja sa nedá vyhnúť práci s týmto typom údajov. Preto je lepšie začať písať otázky už s pochopením, ako spracovať dátumy, aké sú možnosti práce s nimi a ako sa ukladajú. Pozrime sa na príklady všetkých nuancií písania dopytov s rôznymi dátumami.

Príklady práce s dátumami v dopytoch 1C

V prvom rade je potrebné, aby ste v žiadosti dostali dátum v požadovanom formáte – s časom alebo bez. Existuje niekoľko spôsobov, ako splniť túto úlohu:

  1. Pass cez parameter. Pomocou tejto metódy môžete získať iba aktuálny dátum relácie;
  2. Získajte dátum v dotaze z poľa výberu;
  3. Konvertujte z číselných hodnôt pomocou funkcie DATETIME().

Najbežnejšou úlohou pri práci s dokumentmi je kontrola prázdneho dátumu v žiadosti 1C. V tomto prípade je najjednoduchšie porovnať premennú alebo pole s prázdnym dátumom, ktorý sa získa pomocou funkcie DATETIME(1,1,1):

DATETIME (1, 1, 1)

Pomocou podobného príkazu môžete v požiadavke získať ľubovoľný dátum a čas. Okrem toho môžu byť špecifikované s presnosťou až na sekundu zadaním 6 čísel ako parametrov. Ak sa použijú iba 3 čísla, hodiny, minúty a sekundy sa nastavia na 0 (začiatok dňa). Napríklad v žiadosti musíme vybrať dokumenty za prvých 10 dní januára 2018:

VYBERTE potvrdenie k bežnému účtu. Prepojiť AKO doklad na bežný účet ako potvrdenie k bežnému účtu WHERE Dátum BETWEEN DATETIME (2018, 1, 1, 0, 0) A DATE TIME (2018, 1, 10, 23, 59, 59)

V dotaze v zabudovanom jazyku 1C môžete nielen vybrať rôzne polia a prijímať parametre. Existuje mnoho funkcií, ktoré uľahčujú formátovanie dátumov pre konkrétnu úlohu. Ak často pracujete s dátumami v dotaze, mali by ste poznať tieto príkazy:

  • ZAČIATOK OBDOBIA. Parametre označujú dátum a časové obdobie, v kontexte ktorého je potrebné získať začiatok dátumu. Používa sa na prevod dátumu do nadčasového formátu. Aby ste to dosiahli, musíte nastaviť druhý parameter – „DAY“;
ZAČIATOK OBDOBIA(,) ZAČIATOK OBDOBIA(&Dátum, DEŇ) obdobie>dátum>
  • KONIEC OBDOBIA. Podobný príkaz, ktorý vráti posledný dátum v jednotkách špecifikovaných v parametroch;
  • ADDKDATE. Umožňuje získať dátum väčší ako určené množstvo určené jednotky času. Medzi parametre funkcie patrí dátum, časová jednotka a číslo;
ADDKDATE(,) ADDKDATE(&Dátum, DEŇ, 10) množstvo>typ>dátum>
  • DIFFERENCEDATE. Získa rozdiel medzi dátumami v zadaných jednotkách;
DIFFERENCEDATE(,) DIFFERENCEDATE(&Dátum1, &Dátum2, DEŇ) typ>dátum2>dátum1>
  • DEŇ TÝŽDŇA. Vráti poradové číslo jedného z dní v týždni.

Správnym používaním týchto funkcií môže vývojár vyriešiť celkom netriviálne problémy. Napríklad získanie názvu dňa v týždni aktuálneho dátumu v požiadavke ako reťazec:

SELECTION WHENWEEKDAY(&CurrentDate) = 1 POTOM "Pondelok" WHENWEEKDAY(&CurrentDate) = 2 POTOM "Utorok" WHENWEEKDAY(&CurrentDate) = 3 POTOM "Streda" WHENWEEKDAY(&CurrentDate) = 4 POTOM "Štvrtok&aktuálny týždeň" WEKSHEN "Piatok" KEDY TÝŽDŇA (&Aktuálny dátum) = 6 POTOM "Sobota" INAK "Nedeľa" KONIEC

Konverzia typov v dotaze 1C z čísla alebo reťazca na dátum je náročná úloha. Dátum môžete získať z čísel pomocou funkcie DATETIME, z reťazca - kombináciou funkcie SUBSTRING a konštrukcie SELECT WHEN THEN ELSE. Na základe toho vývojári uprednostňujú získať dátum z iných typov v module a odovzdať ho do požiadavky pomocou parametra. Bohužiaľ to nie je vždy možné, takže musíte zmeniť formát dátumu v žiadosti.

V požiadavke 1C je možné zadať dátum ako parameter na získanie údajov z tabuliek virtuálnych registrov. Táto rola môže využívať aj všetky vyššie uvedené funkcie. Tu je však dôležité zabrániť ovplyvneniu prázdneho dátumu v žiadosti 1C konečný výsledok vykonanie kódu, preto je potrebné vykonať kontrolu.

Pomerne často 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 často potrebujete 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. Ak chcete vykonať operácie s aktuálnym dátumom, musíte do požiadavky odovzdať 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;
Príklad žiadosti.Text = "
|VYBERTE
| AdvanceReportAttachedFiles.Link
|OD
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
| KDE
| AdvanceReportAttachedFiles.Date< &ТекДата»;
Príklad Request.SetParameter("CurrentDate", CurrentDate());

Vlastný dátum

Funkcia diskutovaná vyššie vám umožňuje porovnávať, a teda robiť výber pre akékoľvek obdobie. Táto metóda vám umožňuje zadať prísny výber v požiadavke bez použitia ďalších parametrov.

Upozorňujeme, že pri použití 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.

Vnútri tento príklad Budú prijaté 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 na porovnanie časového bodu „31. december 2016 23:59:59“.

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

Prázdny dátum

Najjednoduchší spôsob, ako skontrolovať premennú, či neobsahuje prázdny dátum, je použiť jednoduché porovnanie. V tomto príklade použijeme dotaz na výber všetkých príjmových dokladov hotovosť na účty, kde nie je vyplnený dátum prijatia.