U ovom članku želimo razgovarati sa svima vama funkcije upitnog jezika 1s, kao i konstrukcije upitnog jezika. Koja je razlika između funkcije i strukture? Funkcija se poziva sa zagradama i mogućim parametrima u njima, a konstrukcija se piše bez zagrada. nedvojbeno sve konstrukcije i funkcije 1s upitnog jezika učiniti proces prikupljanja podataka fleksibilnim i multifunkcionalnim. Ove funkcije i konstrukcije primjenjuju se na polja upita, a neke se također primjenjuju na uvjete.

Funkcije jezika upita 1s

Pošto jasan opis funkcije upitnog jezika 1s mnogo rjeđi od opisa struktura, odlučili smo početi promatrati funkcije. Analizirajmo sada svaki zasebno, opisujući njegovu svrhu, sintaksu i primjer upotrebe, pa:

1. Funkcija DATUM VRIJEME- ova funkcija stvara konstantno polje s tipom "Datum".

Sintaksa: DATUM VRIJEME(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Primjer upotrebe:

2. Funkcija DATUM DIFFERENCE- vraća razliku dvaju datuma u jednoj od dimenzija (godina, mjesec, dan, sat, minuta, sekunda). Mjerenje se prenosi kao parametar.

Sintaksa: DAFFERENCEDATE(<Дата1>, <Дата2>, <Тип>)

Primjer upotrebe:

Query.Text = "ODABIR | DATUMSKA RAZLIKA(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Broj dana";

3. Funkcija VRIJEDNOST- postavlja konstantno polje s unaprijed definiranim unosom iz baze podataka, također možete dobiti nultu referencu bilo koje vrste.

Sintaksa: VALUE(<Имя>)

Primjer upotrebe:

Query.Text = "SELECT //predefinirani element | VALUE(Currency.Dollar.Catalog.Dollar) AS Dollar, //prazna referenca | VALUE(Document.IncomingGoodsServices.EmptyReference) AS Potvrda, //vrijednost prijenosa | VALUE(Transfer.LegalIndividual . Pojedinac) AS Pojedinac, //predefinirani račun | VRIJEDNOST(Kontni plan.Samonosivi.Materijali) AS Račun_10" ;

4. SELECT funkcija- imamo analognu konstrukciju IF koja se koristi u kodu, samo se ova koristi u 1C upitima.

Sintaksa: IZBOR KADA<Выражение>ZATIM<Выражение>INAČE<Выражение>KRAJ

Primjer upotrebe:

Request.Text = //ako je iznos veći od 7500, tada bi trebao postojati popust od 300 rubalja, //dakle, ako se aktivira uvjet, tada funkcija //vraća iznos - 300 //u suprotnom, zahtjev će jednostavno vratiti iznos "SELECT | SELECT | WHEN PMIncome.Amount > 7500 | THEN PTReceipts.Amount - 300 | ELSE PTReceipts.Amount | END AS AmountDiscounted |FROM | Document.ReceiptofGoodsServices.Goods AS PTreceipts";

5. EXPRESS funkcija- omogućuje vam izražavanje konstantnog polja s određenim tipom.

Sintaksa: EXPRESS(Naziv polja AS Naziv tipa)

Primjer upotrebe:

Query.Text = "SELECT VARIOUS | Sales.Registrar.Number, | SELECT | WHEN Sales.Registrar REF Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | WHEN Sales.Registrar REF Document.Implementation | THEN EXPRESS(Sales.Registrar AS Document.Release) | END | ... | END AS Broj | FROM | Registar akumulacije.Kupnje KAO Kupnje";

Još uvijek postoji varijanta korištenja funkcije EXPRESS u poljima mješovitih tipova gdje se takvi susreću? Najjednostavniji primjer je "Matičar" za bilo koji registar. Pa zašto bismo morali kvalificirati vrstu u registru? Razmotrimo situaciju kada iz matičara odaberemo polje "Broj", iz koje tablice će se odabrati broj? Točan odgovor od svih! Stoga, kako bi naš upit radio brzo, moramo navesti eksplicitnu vrstu pomoću funkcije EXPRESS

Primjer upotrebe:

Query.Text = "CHOOSE | EXPRESS(Nomenclature.Comment AS String(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Lookup.Nomenclature AS Nomenclature";

6. ISNULL funkcija(alternativni način pisanja JE NULL) - ako je polje tipa NULL, tada se zamjenjuje drugim parametrom funkcije.

Sintaksa: ISNULL(<Поле>, <ПодставляемоеЗначение>)

Primjer upotrebe:

Također imajte na umu da je poželjno tip NULL UVIJEK zamijeniti nekom vrijednošću, jer usporedba s NULL uvijek daje FALSE čak i ako uspoređujete NULL s NULL. Najčešće se NULL vrijednosti formiraju kao rezultat spajanja tablica (sve vrste spajanja osim unutarnjih).

Query.Text = //Odaberi cijelu stavku i njena stanja //ako u nekoj stavci nema stanja, tada će postojati polje //NULL koje će biti zamijenjeno vrijednošću 0 "SELECT | No.Ref, | ISNULL (GoodsInWarehouseRemains.InStockRemain, 0) HOW Ostatak | FROM | Imenik. Nomenklatura KAO Naziv | LIJEVO PRIDRUŽI Registar akumulacije. Roba u skladištima. Ostaci KAO roba u skladištima

7. REPREZENTACIJA funkcija- omogućuje vam da dobijete prikaz polja zahtjeva.

Sintaksa: IZVOĐENJE(<НаименованиеПоля>)

Primjer upotrebe:

Query.Text = "ODABERITE | PREDSTAVLJANJE(Slobodni Ostaci.Nomenklatura) KAO Nomenklatura, | PREDSTAVLJANJE(SlobodniOstaci.Skladište) KAO Skladište, | SlobodniOstaci.DostupniOstaci |OD | Registar akumulacije.SlobodniOstaci.Ostaci KAO SlobodniOstaci";

Konstrukcije u upitnom jeziku 1s

Gore smo razgovarali s vama funkcije upitnog jezika 1s, sada je vrijeme za razmatranje konstrukcije u upitnom jeziku 1s, nisu ništa manje važni i korisni, počnimo.

1. Izgradnja LINK- je operator za provjeru tipa logičke reference. Najčešće se susreće prilikom testiranja polja kompozitnog tipa za određeni tip. Sintaksa: VEZA<Имя таблицы>

Primjer upotrebe:

Query.Text = //ako je tip vrijednosti registratora dokument Receipt, //tada će upit vratiti "Dolazna roba", inače "Prodaja robe" "SELECT | SELECT | WHEN Remains.Registrar LINK Document.Incoming GoodsServices | THEN ""Ulazno" | ALSE "Troškovi" | END AS Vrsta kretanja | OD | Registar akumulacije. Ostaci robe u skladištima KAO Ostaci ";

2. Izgradnja IZMEĐU- ovaj operator provjerava je li vrijednost unutar navedenog raspona.

Sintaksa: IZMEĐU<Выражение>I<Выражение>

Primjer upotrebe:

Query.Text = //dobijte svu nomenklaturu čiji je kod u rasponu od 1 do 100 "SELECT | Nomenclature.Reference |FROM | Catalog.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. Konstrukcija B i B HIJERARHIJE- provjeriti nalazi li se vrijednost u proslijeđenom popisu (nizovi, tablice vrijednosti itd. mogu se proslijediti kao popis). Operator IN HIERARCHY omogućuje pregled hijerarhije (primjer korištenja PlanAccounts).

Sintaksa: NA(<СписокЗначений>), U HIJERARHIJI (<СписокЗначений>)

Primjer upotrebe:

Query.Text = // odaberite sve podračune računa "SELECT | Self-support. Link AS Account | FROM | Plan of Accounts. Self-supporting AS Self-supporting | WHERE | Self-supporting. Reference IN HIERARCHY VALUE( Obračunski plan. Samoodrživi. Roba)";

4. Gradnja LIKE- ova nam funkcija omogućuje usporedbu niza s uzorkom niza.

Sintaksa: KAO"<ТекстШаблона>"

Opcije predloška linije:

% - niz koji sadrži bilo koji broj proizvoljnih znakova.

Jedan proizvoljan znak.

[...] - bilo koji pojedinačni znak ili niz znakova navedenih unutar uglatih zagrada. Nabrajanje može sadržavati raspone, kao što je a-z, što znači bilo koji znak unutar raspona, uključujući krajeve raspona.

[^...] - bilo koji pojedinačni znak ili niz znakova navedenih unutar uglatih zagrada, osim onih navedenih nakon znaka negacije.

Primjer upotrebe:

Query.Text = //pronađi cijelu nomenklaturu koja sadrži korijen TABUR i počinje //bilo malim ili velikim slovom t "SELECT | Nomenclature.Reference |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Roba.Name LIKE "" [Tt ]abur%""" ;

5. Dizajn DOZVOLJEN- ova izjava omogućuje odabir samo onih zapisa iz baze podataka za koje pozivatelj ima pravo čitanja. Ta su prava konfigurirana na razini zapisa (RLS).

Sintaksa: DOZVOLJENO se piše iza ključna riječ BIRAJTE

Primjer upotrebe:

Query.Text = "SELECT ALLOWED | Counterparties.Reference |FROM | Directory.Counterparties AS Counterparties";

6. Gradnja RAZNO- omogućuje odabir zapisa u kojima nema ponovljenih zapisa.

Sintaksa: DIFFERENT se piše iza ključne riječi SELECT

Primjer upotrebe:

Request.Text = //odabire zapise na koje čitatelj ima prava "SELECT DIFFERENT | Counterparties.Name |FROM | Directory.Counterparties AS Counterparties" ;

Konstrukcija DIFFERENT također se može koristiti s operatorom ALLOWED i drugim operatorima.

Primjer upotrebe:

Query.Text = //odabire različite zapise na koje čitatelj ima prava "SELECT ALLOWED DIFFERENT | Contractors.Name |FROM | Directory.Contractors AS Contractors";

7. Izgradnja PRVO- odabire broj zapisa navedenih u parametru iz rezultata upita.

Sintaksa: FIRST<число>

Primjer upotrebe:

Query.Text = //odaberite prva 4 GTD broja iz direktorija "SELECT THE FIRST 4 | GTD Numbers.Reference |FROM | Catalog.GTE Numbers AS GTD Numbers";

8. Dizajn ZA PROMJENE- omogućuje vam zaključavanje tablice, radi samo u transakcijama (relevantno samo za automatska zaključavanja).

Sintaksa: ZA PROMJENU<НаименованиеТаблицы>

Primjer upotrebe:

Query.Text = "SELECT | FreeRemainsRemains.Nomenclature, | FreeRemainsRemains.Warehouse, | FreeRemainsRemains.AvailableRemains |OD | Registar akumulacije.FreeRemains.Remains AS FreeRemainsRemains |ZA PROMJENU |

9. Struktura ORDER BY- sortira podatke prema određenom polju. Ako je polje poveznica, tada prilikom postavljanja zastavice AUTO NARUDŽBA bit će razvrstani prema prikazu veze, ako je zastavica isključena, tada su veze razvrstane prema seniornosti adrese veze u memoriji.

Sintaksa: SORTIRAJ PO<НаименованиеПоля>AUTO NARUDŽBA

Primjer upotrebe:

Query.Text = "SELECT | FreeRemainsRemains.Nomenclature AS Nomenclature, | FreeRemainsRemains.Warehouse AS Warehouse, | FreeRemainsRemains.In StockRemaining |FROM |

10. Dizajn GROUP BY- koristi se za grupiranje nizova upita prema određenim poljima. Numerička polja moraju se koristiti s bilo kojom agregatnom funkcijom.

Sintaksa: GRUPIRAJ PO<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Primjer upotrebe:

Query.Text = "SELECT | ItemsInWarehouse.Nomenclature AS Nomenclature, | ItemsInWarehouse.Warehouse, | SUM(ItemsInWarehouse.InStock) AS InStock |FROM |

11. Dizajn HAVING- omogućuje vam primjenu agregatne funkcije na uvjet odabira podataka, slično konstrukciji WHERE.

Sintaksa: IMAJUĆI<агрегатная функция с условием>

Primjer upotrebe:

Query.Text = //odabire grupirane zapise gdje je polje InStock veće od 3 "SELECT | GoodsInStock.Nomenclature AS Nomenclature, | GoodsInWarehouse.Warehouse, | SUM(ItemsInWarehouse.InStock) AS InStock |FROM | Register akumulacije.GoodsInWarehouses AS GoodsInWarehouses | |GRUPIRAJ PO | Roba u skladištima.Nomenklatura, | Roba u skladištima.Skladište | |IMAJUĆI | IZNOS (Roba u skladištima.Na zalihama) > 3" ;

12. INDEX BY konstrukt- koristi se za indeksiranje polja upita. Za dovršetak indeksiranog upita potrebno je više vremena, ali se ubrzavaju pretraživanja na indeksiranim poljima. Može se koristiti samo u virtualnim tablicama.

Sintaksa: INDEX BY<Поле1, ... , ПолеN>

Primjer upotrebe:

Query.Text = "SELECT | Tz.OS Naziv, | Tz.Folder Number, | Tz.CodeOS, | Tz.Term, | Tz.Type |PUT DataTz |FROM | &Tz HOW Tz | | INDEX BY | Tz.OS Name , | Tz .CodeOS";

13. Izgradnja GDJE- omogućuje vam postavljanje uvjeta na bilo koje polje odabira. U rezultat će biti uključeni samo zapisi koji ispunjavaju uvjet.

Sintaksa: GDJE<Условие1 ОператорЛогСоединения УсловиеN>

Primjer upotrebe:

Query.Text = //odaberi sve zapise s CompensationRemainder<>0 i //AmountFor Calc.CompBalance > 100 "SELECT | Kompenzacija RPO salda.Račun, | Kompenzacija RPO salda.Child, | Kompenzacija RPO salda. Kompenzacija salda, | Naknada RPO salda. SumFor Calc. Comp salda | MJESTO DataTz |FROM | Registar akumulacije. Kompenzacija RP. Stanja AS Kompenzacija RPO stanja | GPO kompenzacija.<>0 | I kompenzacija RPO stanja. Iznos za CalcComp Residual > 100" ;

14. REZULTATI Dizajna ... OPĆENITO- koristi se za izračun ukupnih zbrojeva, dizajn specificira polja prema kojima će se ukupni zbrojevi izračunati i agregatne funkcije primijenjene na zbrojna polja. Kada koristite ukupne vrijednosti za svako polje nakon konstrukcije TOTALS, podaci se grupiraju. Postoji izborni konstrukt GENERAL, njegova upotreba također omogućuje dodatno grupiranje. Dolje možete vidjeti primjer rezultata upita.

Sintaksa: REZULTATI<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>NA<ОБЩИЕ> <Поле1, ... , ПолеN>

Primjer upotrebe:

Query.Text = "ODABERITE | Nagodbe.Ugovor s drugom stranom.Vrsta ugovora KAO Vrsta ugovora, | Nagodbe.Ugovor s drugom stranom KAO Ugovor, | Nagodbe.Suprotna strana, | Nagodbe.Iznos međusobnih nagodbi Saldo AS Preostalo |OD | | Softver | OPĆENITO, | Vrsta ugovora";

Na slici su zaokružene grupacije koje su nastale tijekom izvršenja zahtjeva, gornja se odnosi na odjeljak GENERAL, a druga na polje ContractContractorTypeContract.

U upitima 1C, kao iu ugrađenom jeziku platforme 1C:Enterprise, postoje funkcije za rad s datumima. Pomažu u pojednostavljenju pretvorbe datuma u upitima, izbjegavajte korištenje veliki broj parametri. Razmotrimo ove funkcije.

Kako postaviti datum u 1C upitima kao konstantu

DATETIME (godina, mjesec, dan, sat, minuta, sekunda). Mogućnosti Godina, mjesec i Dan su potrebni, drugi nisu. Ako ne navedete vrijeme, sustav će postaviti početak dana.

Zahtjev. Tekst= „IZABIRAJ
DATUM VRIJEME (2016,09,28,12,22,00)"
; // Rezultat: 28. rujna 2016. 12:22:00

Nadalje, samo eksplicitni brojevi mogu se navesti kao parametri ove funkcije. Ne možete navesti vrijednosti drugih funkcija kao parametre. Na primjer, ova konstrukcija neće raditi:

Zahtjev. Tekst= „IZABIRAJ
DATETIME(Godina(Izvor.Datum),09,28,12,22,00)
Iz direktorija. Izvor KAO izvor"
;

Kako dobiti početak ili kraj godine, polugodište, kvartal, mjesec, desetljeće, tjedan, dan, sat, minutu u 1C upitima

Za to se koriste sljedeće funkcije:

  • Početno razdoblje (datum, razdoblje)
  • EndPeriod(Datum, Razdoblje)

Kao parametar Datum prenesena vrijednost s tipom Datum. Parametar Razdoblje .

Zahtjev. Tekst= „IZABIRAJ
Početno razdoblje(DATUMVRIJEME(2016,09,28,12,22,00), DECAD)"
; // Rezultat: 21. rujna 2016. 0:00:00

Zahtjev. Tekst= „IZABIRAJ
Završno razdoblje(DATUM(2016,09,28,12,22,00), KVARTER)"
; // Rezultat: 30. rujna 2016. 23:59:59

Kao što možete vidjeti iz primjera, druge, ugniježđene, funkcije mogu se koristiti u ovim funkcijama.

Kako dobiti godinu, dan u godini, kvartal, mjesec, tjedan, dan u tjednu, dan, sat, minutu, sekundu iz datuma u 1C upitima

Da biste to učinili, postoje odgovarajuće funkcije u kojima trebate proslijediti datum kao parametar.

  • Funkcija GODINA (datum)- vraća broj godine;
  • Funkcija DAN U GODINI (Datum)- vraća broj dana u godini;
  • Funkcija KVARTAL (Datum)- vraća broj četvrtine;
  • Funkcija MJESEC (datum)- vraća broj mjeseca;
  • Funkcija TJEDAN (datum)- vraća broj tjedna u godini;
  • Funkcija DAN U TJEDNU (datum)- vraća broj dana u tjednu (ponedjeljak - 1, nedjelja - 7);
  • Funkcija DAN (datum)- vraća broj dana u mjesecu;
  • Funkcija SAT (datum)- vraća sat;
  • Funkcija MINUTE (Datum)- vraća minute;
  • Funkcija DRUGI (Datum)- vraća sekunde.

Zahtjev. Tekst= „IZABIRAJ
GODINA(DATUMVRIJEME(2016,09,28,12,22,00))"
; // Rezultat: 2016

Zahtjev. Tekst= „IZABIRAJ
TJEDAN(DATUMVRIJEME(2016,09,28,12,22,00))"
; // Rezultat: 40

Zahtjev. Tekst= „IZABIRAJ
DAYWEEK(DATUMTIME(2016,09,28,12,22,00))"
; // Rezultat: 3

Zahtjev. Tekst= „IZABIRAJ
DAYYEAR(DATUMTIME(2016,09,28,12,22,00))"
; // Rezultat: 272

Zahtjev. Tekst= „IZABIRAJ
DAN(DATUMVRIJEME(2016,09,28,12,22,00))"
; // Rezultat: 28

Kako dodati ili oduzeti od datuma godinu, pola godine, kvartal, mjesec, desetljeće, tjedan, dan, sat, minutu, sekundu u 1C upitima

Za to se koristi funkcija AddKDate(Datum, Razdoblje, Vrijednost).

Kao parametar Datum prenesena vrijednost s tipom Datum. Parametar Razdoblje može uzeti jednu od sljedećih vrijednosti: DRUGI, MINUTA, SAT, DAN, TJEDAN, DEKADA, MJESEC, KVARTAL, POLUGODINA, GODINA.

Parametar Značenje pokazuje broj dodanih razdoblja. Ako treba oduzeti razdoblje, onda parametar Značenje mora biti negativan.

Zahtjev. Tekst= „IZABIRAJ
DodajKDatum(DATUMVRIJEME(2016, 9, 28, 12, 22, 0), POLA GODINE, 1)"
; // Rezultat: 28. ožujka 2017. 12:22:00

Zahtjev. Tekst= „IZABIRAJ
DodajKDatum(DATUMVRIJEME(2016, 9, 28, 12, 22, 0), DECAD, -1)"
; // Rezultat: 18. rujna 2016. 12:22:00

Kako izračunati razliku datuma u 1C upitima

Za to se koristi funkcija Datum razlike(Datum1, Datum2, Period).

Parametar Datum1 je datum koji treba oduzeti.

Parametar Datum 2 - datum od kojeg treba oduzeti.

Parametar Razdoblje može uzeti jednu od sljedećih vrijednosti: DRUGI, MINUTA, SAT, DAN, MJESEC, KVARTAL, GODINA. Pokazuje u kojim jedinicama želimo dobiti rezultat

Zahtjev. Tekst= „IZABIRAJ
RazlikaDATUM(DATUMVRIJEME(2016, 9, 28, 12, 22, 0), DATUMVRIJEME(2017, 9, 28, 12, 22, 0), KVARTAL)"
; // Rezultat: 4

Zahtjev. Tekst= „IZABIRAJ
DifferenceDATE(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME(2017, 9, 28, 12, 22, 0), Second)"
; // Rezultat: 31,536,000

U svim funkcijama osim funkcije DATUM VRIJEME, kao parametar Datum može biti ne samo određena vrijednost datuma (konstanta ili parametar upita), već i polja izvorne tablice.

Kada vrlo često postoji potreba za radom s varijablama tipa "Datum". U ovom članku ćemo pogledati glavne tehnike - prosljeđivanje trenutnog datuma, provjera prazne vrijednosti, proizvoljni datum.

Prilikom pisanja upita često je potrebno podatke usporediti s trenutnim datumom. Ugrađeni jezik 1C ima funkciju CurrentDate(). Omogućuje vam određivanje trenutnog vremena i datuma na vašem računalu. Za izvođenje operacija s trenutnim datumom, vrijednost ove funkcije mora se proslijediti zahtjevu kao parametar.

Ispod je upit koji odabire sve datoteke priložene naprednim izvješćima s datumom izrade do sada:

RequestExample = Novi zahtjev;
ExampleRequest.Text ="
|ODABIRAJTE
| Advance ReportAttachedFiles.Link
| OD
| Directory.Advance ReportAttachedFilesAS AdvanceReportAttachedFiles
|GDJE
| Advance ReportAttachedFiles.Date< &ТекДата»;
Primjer upita.SetParameter("CurrentDate", CurrentDate());

Proizvoljni datum

Gore spomenuta funkcija omogućuje vam usporedbu i stoga odabir za bilo koje razdoblje. Ova metoda omogućuje vam da odredite 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. Zadnja tri (sat, minuta, sekunda) nisu obavezna i, ako ih nema, zamjenjuju se s "0", odnosno početkom dana.

U sklopu ovog primjera zaprimat će se sve datoteke priložene predujmovima do kraja prošle 2016. godine. S tim u vezi, navest ćemo sat, minutu i sekundu za usporedbu s točkom u vremenu "31. prosinca 2016. 23:59:59".

BIRAJTE
Advance ReportAttachedFiles.Link
IZ
Directory.Advance Report Attached Files KAO Advance Report Attached Files
GDJE
Advance ReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

prazan datum

Najlakši način da provjerite sadrži li varijabla prazan datum je jednostavna usporedba. U ovom primjeru koristit ćemo upit za odabir svih računa Novac na račun s praznim dolaznim datumom.

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

  • Kako pretvoriti parametre drugih tipova u dotični tip;
  • Kako definirati prazan datum u 1C upitu;
  • Koja je razlika između datuma i vremenskog ograničenja.

To su pitanja na koja ćemo pokušati odgovoriti u našem članku.

Što je datum i kako ga odrediti

Budući da većina odluka o upravljanju i računovodstvu ne zahtijevaju točnost vremena veću od 1 sekunde, programeri platforme 1C odlučili su da će ta vrijednost biti minimalna granica u formatu datuma. Dakle, svaki atribut koji 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 br dodatni uvjeti, program automatski postavlja vrijeme na početak dana.

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

  1. U Rusiji smo navikli prvo staviti dan, zatim mjesec događaja, a na kraju godinu;
  2. Stanovnici SAD-a počinju datum s mjesecom;
  3. Česi, Poljaci i Slovenci bilježe razdoblje u obliku "godina - mjesec - dan".

To je potonji format koji koristi platforma 1C.

Pretvori u datum

Da biste dobili parametar tipa Datum iz nekoliko vrijednosti ili iz niza, morate koristiti kod prikazan na sl. jedan

Kao što možete vidjeti na slici, možete odrediti datum i uz pomoć jednog retka, a ako ga podijelite na 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, sati i sekunde moraju imati dva znaka, uključujući početne 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 nije nimalo utjecalo na performanse našeg koda.

Značajke korištenja datuma u 1C upitima

Za većinu tipova podataka koje koristi platforma 1C postoje unaprijed definirane void vrijednosti. Za brojeve je to 0, za veze možete definirati vrijednost EmptyReference(), za datume se datum početka odbrojavanja smatra praznom vrijednošću, s njom moraju biti detalji odgovarajućeg tipa. uspoređivati ​​prilikom postavljanja parametara upita.

Važno je razumjeti da čak i ako u vrijednosti atributa forme dotičnog tipa nisu navedeni brojevi, odnosno prozor izgleda kao (Sl. 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 dobili prazan datum, možemo ga navesti kao parametar našem zahtjevu, odnosno koristiti konstrukciju (Sl. 4)

Međutim, ponekad 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 kôd upita (Slika 5) i koristiti funkciju upita DateTime().

Riža. 5

U navedenom tekstu zahtjeva izostavili smo početne nule iz godine, mjeseca i dana, a također nismo naveli sate, minute i sekunde, a program je, kako kažu, pojeo tu pretpostavku.

Datum i vremensko ograničenje

Još zanimljiva činjenicašto se tiče odnosa između upita i datuma je korištenje koncepta "točke u vremenu" kada se govori o različitim tablicama baze podataka.

Točnost "do milisekunde", navedeno u tehnička dokumentacija pri opisu primitivnog tipa Datum se najjasnije vidi pri odabiru slogova iz virtualnih tablica akumulacijskog registra: ako akumulacijski registar, osim tablice Promet, ima i tablice Ostaci i Ostaci i prometi, tada se selekcija na njima, provodi van 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 realizacije prodajnog dokumenta u 12 sati 31 minutu 36 sekundi bilansi prema nomenklaturi Šećer iznosili su 30 kg;
  2. Dokument je otpisao 10 kg u navedeno vrijeme;
  3. Izvještaj generiran na datum dokumenta u 12 sati 31 minutu 36 sekundi prema tablici Ostaci će pokazati stanje od 30 kg;
  4. Isti izvještaj na tablici Stanja i prometa u isto vrijeme će pokazati stanje od 20 kg.

Koji je razlog ovakvom ponašanju i kako ga izbjeći?

Problem je što je u tablici Remains razdoblje postavljeno kao otvoreni segment, odnosno ne uzimaju se u obzir kretanja koja su izvršena u trenutku generiranja izvještaja, odnosno uzima se vrijeme na početku drugi naveden u parametru. Istovremeno, za tablicu Obrati i za tablicu Ostaci i Obrati uzimaju se u obzir vremenski limiti, odnosno uzima se vrijeme na kraju navedene sekunde.

Postoji nekoliko izlaza iz ove situacije:

  1. Kada koristite tablicu reziduala, navedite vremensku točku 1 sekundu veću od navedene;
  2. Koristite samo tablicu Stanja i prometa (nije najoptimalnija opcija u smislu izvedbe);
  3. Koristite izraz granica.

Potonja opcija može se predstaviti kodom prikazanim na sl. 6.

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