1c jak podać w żądaniu aktualną datę. Konwertuj na bieżąco

Zapytania 1C, a także wbudowany język platformy 1C:Enterprise, posiadają funkcje do pracy z datami. Pomagają uprościć konwersje dat w zapytaniach, unikając ich użycia duża ilość parametry. Przyjrzyjmy się tym funkcjom.

Jak ustawić datę w zapytaniach 1C jako stałą

DATETIME (rok, miesiąc, dzień, godzina, minuta, sekunda). Opcje Rok, miesiąc I Dzień są obowiązkowe, inne nie. Jeżeli nie określisz godziny, system ustawi początek dnia.

Wniosek. Tekst= "WYBIERAĆ
DATAGODZINA (2016,09,28,12,22,00)"
; // Wynik: 28 września 2016 12:22:00

Ponadto jako parametry tej funkcji można jawnie określić tylko liczby. Nie można określić wartości innych funkcji jako parametrów. Na przykład ta konstrukcja nie będzie działać:

Wniosek. Tekst= "WYBIERAĆ
DATETIME (rok (data źródłowa),09,28,12,22,00)
Z katalogu.Źródło jako źródło”
;

Jak uzyskać początek lub koniec roku, pół roku, kwartału, miesiąca, dekady, tygodnia, dnia, godziny, minuty w zapytaniach 1C

W tym celu wykorzystywane są następujące funkcje:

  • StartPeriod(data, okres)
  • EndPeriod(data, okres)

Jako parametr data przekazywana jest wartość z typem Data. Parametr Okres .

Wniosek. Tekst= "WYBIERAĆ
StartPeriod(DATACZAS (2016,09,28,12,22,00), DEKADA)”
; // Wynik: 21 września 2016 0:00:00

Wniosek. Tekst= "WYBIERAĆ
EndPeriod(DATETIME (2016,09,28,12,22,00), KWARTAŁ)"
; // Wynik: 30 września 2016 r., 23:59:59

Jak widać z przykładów, w tych funkcjach można używać innych funkcji zagnieżdżonych.

Jak uzyskać rok, dzień roku, kwartał, miesiąc, tydzień, dzień tygodnia, dzień, godzinę, minutę, sekundę z daty w zapytaniach 1C

Aby to zrobić, istnieją odpowiednie funkcje, do których należy przekazać datę jako parametr.

  • Funkcjonować ROK (data)— zwraca numer roku;
  • Funkcjonować DZIEŃROK (data)— zwiększa liczbę dni w roku;
  • Funkcjonować Kwartał (data)— zwraca numer kwartału;
  • Funkcjonować MIESIĄC (data)— zwraca numer miesiąca;
  • Funkcjonować TYDZIEŃ (data)— zwraca numer tygodnia w roku;
  • Funkcjonować DZIEŃ TYGODNIA (data)— zwraca numer dnia w tygodniu (poniedziałek — 1, niedziela — 7);
  • Funkcjonować Data dnia)— zwraca numer dnia w miesiącu;
  • Funkcjonować GODZINA (data)— zwraca godzinę;
  • Funkcjonować MINUTA (data)— zwraca minuty;
  • Funkcjonować DRUGI (data)— zwraca sekundy.

Wniosek. Tekst= "WYBIERAĆ
ROK(DATACZAS (2016,09,28,12,22,00))"
; // Wynik: 2016

Wniosek. Tekst= "WYBIERAĆ
TYDZIEŃ(DATAGODZINA (2016,09,28,12,22,00))"
; // Wynik: 40

Wniosek. Tekst= "WYBIERAĆ
DZIEŃ TYGODNIA(DATAGODZINA (2016,09,28,12,22,00))"
; // Wynik: 3

Wniosek. Tekst= "WYBIERAĆ
DZIEŃROK(DATAGODZINA (2016,09,28,12,22,00))"
; // Wynik: 272

Wniosek. Tekst= "WYBIERAĆ
DZIEŃ(DATAGODZINA (2016,09,28,12,22,00))"
; // Wynik: 28

Jak dodać lub odjąć od daty rok, pół roku, kwartał, miesiąc, dekadę, tydzień, dzień, godzinę, minutę, sekundę w zapytaniach 1C

Aby to zrobić, użyj funkcji AddToDate(data, okres, wartość).

Jako parametr data przekazywana jest wartość z typem Data. Parametr Okres może przyjmować jedną z następujących wartości: DRUGI, MINUTA, GODZINA, DZIEŃ, TYDZIEŃ, DEKADA, MIESIĄC, KWARTAŁ, PÓŁROKU, ROK.

Parametr Oznaczający pokazuje liczbę okresów do dodania. Jeśli należy odjąć okres, to parametr Oznaczający musi być negatywny.

Wniosek. Tekst= "WYBIERAĆ
AddToDate(DATETIME(2016, 9, 28, 12, 22, 0), PÓŁ ROKU, 1)"
; // Wynik: 28 marca 2017 r., 12:22:00

Wniosek. Tekst= "WYBIERAĆ
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0), DECADE, -1)"
; // Wynik: 18 września 2016 r., 12:22:00

Jak obliczyć różnicę dat w zapytaniach 1C

Aby to zrobić, użyj funkcji RóżnicaData(Data1, Data2, Okres).

Parametr Data1- data do odjęcia.

Parametr Data 2 — data, od której należy odjąć.

Parametr Okres może przyjmować jedną z następujących wartości: DRUGI, MINUTA, GODZINA, DZIEŃ, MIESIĄC, KWARTAŁ, ROK. Pokazuje w jakich jednostkach chcemy uzyskać wynik

Wniosek. Tekst= "WYBIERAĆ
DifferenceDate(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME(2017, 9, 28, 12, 22, 0), KWARTAŁ)"
; // Wynik: 4

Wniosek. Tekst= "WYBIERAĆ
DifferenceDate(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME(2017, 9, 28, 12, 22, 0), sekunda)”
; // Wynik: 31 536 000

We wszystkich funkcjach z wyjątkiem funkcji DATA CZAS, jako parametr data może być nie tylko konkretną wartością daty (stała lub parametrem zapytania), ale także polami tabeli źródłowej.

Wszystkie dokumenty istniejące w konfiguracjach 1C, a co za tym idzie prawie wszystkie rejestry, muszą mieć co najmniej jeden atrybut z typem daty, dlatego każdy programista musi wiedzieć i rozumieć:

  • Jak konwertować parametry innych typów na dany typ;
  • Jak określić pustą datę w żądaniu 1C;
  • Jaka jest różnica między datą a terminem?

Właśnie na te pytania postaramy się odpowiedzieć w naszym artykule.

Co to jest data i jak ją ustalić

Od zaakceptowania większości decyzje zarządcze a prowadzenie rejestrów nie wymaga dokładności czasu przekraczającej 1 sekundę, twórcy platformy 1C zdecydowali, że wartość ta będzie absolutnym minimum w formacie daty. Zatem każdy atrybut opisujący czas zdarzenia w programie musi zawierać:

  • Rok, w którym miało miejsce zdarzenie;
  • Miesiąc tego wydarzenia;
  • Dzień.

Nie ma potrzeby podawania: godziny, minuty i sekundy. Jeżeli te trzy parametry zostaną pominięte i nie zostaną spełnione żadne dodatkowe warunki, program automatycznie ustawi godzinę rozpoczęcia dnia.

Istniejące na świecie formaty daty różnią się znacznie:

  1. W Rosji jesteśmy przyzwyczajeni, że na pierwszym miejscu umieszczamy dzień, potem miesiąc wydarzenia, a na końcu rok;
  2. Mieszkańcy USA rozpoczynają datę od miesiąca;
  3. Czesi, Polacy i Słoweńcy rejestrują okresy w formacie Rok – Miesiąc – Dzień.

Z tego ostatniego formatu korzysta platforma 1C.

Konwertuj na bieżąco

Aby uzyskać parametr typu Date z kilku wartości lub z ciągu znaków, należy skorzystać z kodu pokazanego na rys. 1

Jak widać na powyższym rysunku, datę można określić albo jedną linią, albo dzieląc tę ​​linię na części składowe przecinkiem, wynik się nie zmieni.

Ważne jest, aby zrozumieć, że rok daty musi zawierać cztery cyfry, w tym tysiąclecie i stulecie wydarzenia, miesiąc, dzień, godziny i sekundy muszą mieć długość dwóch znaków, łącznie z zerami wiodącymi.

Odliczanie czasu w programie rozpoczyna się od początku dnia 1 stycznia 0001. Dla powyższego kodu wartość tę można wyznaczyć na jeden z dwóch sposobów (rysunek 2).

Ryż. 2

W drugiej linii pominęliśmy godziny, minuty i sekundy zdarzenia, co w żaden sposób nie wpłynęło na wydajność naszego kodu.

Funkcje używania daty w zapytaniach 1C

W przypadku większości typów danych używanych przez platformę 1C istnieją predefiniowane wartości puste. Dla liczb jest to 0, dla linków można zdefiniować wartość DesertLink(), dla daty pustą wartość uważa się zwykle za datę początkową i właśnie z nią należy porównać szczegóły odpowiedniego typu przy ustawianiu parametry żądania.

Ważne jest, aby zrozumieć, że nawet jeśli wartość atrybutu formularza danego typu nie zawiera żadnych liczb, czyli tak wygląda okno (ryc. 3), nie oznacza to, że nic nie jest w nim określone; tego parametru z pustym ciągiem nie będzie działać.

Ryż. 3

Otrzymawszy pustą datę, możemy podać ją jako parametr naszego żądania, czyli skorzystać z konstrukcji (rys. 4)

Są jednak chwile, kiedy lepiej jest sprawdzić treść żądania, nie przekazując pustej daty jako parametru. Aby to zrobić, możesz wpisać odpowiedni warunek w kodzie żądania (rys. 5) i skorzystać z funkcji żądania DateTime().

Ryż. 5

W powyższym tekście żądania pominęliśmy zera wiodące roku, miesiąca i dnia, a także nie wskazaliśmy godzin, minut i sekund, a program, jak to się mówi, pochłonął to założenie.

Granica daty i czasu

Inny interesujący fakt związanym ze związkiem pomiędzy zapytaniami a datami jest wykorzystanie koncepcji „punktu w czasie” podczas uzyskiwania dostępu do różnych tabel bazy danych.

Dokładność poniżej milisekundy określona w dokumentacja techniczna opisując typ pierwotny, Data najwyraźniej objawia się przy wyborze rekordów z wirtualnych tablic rejestru akumulacji: jeśli rejestr akumulacji oprócz tabeli Obrót ma tabele Pozostała i Pozostała oraz Obrót, wówczas pobierane jest z nich pobieranie próbek wyłączony przez określony czas, może dać różne wyniki.

Aby zrozumieć, jak i dlaczego tak się dzieje, rozważ prosty przykład:

  1. Przed wystawieniem dokumentu sprzedaży o godzinie 12 godzin 31 minut i 36 sekund salda według nomenklatury cukru wynosiły 30 kg;
  2. Dokument odpisał 10 kg w określonym czasie;
  3. Raport wygenerowany na dzień dokumentu o godzinie 12 godzin 31 minut 36 sekund zgodnie z tabelą Pozostałe pokaże saldo 30 kg;
  4. Ten sam raport na stole Pozostałości i Obroty w tym samym czasie pokaże saldo 20 kg.

Jaki jest powód podobne zachowanie i jak tego uniknąć?

Problem w tym, że w tabeli Pozostałe okres jest określony jako segment otwarty, czyli nie są brane pod uwagę ruchy wykonane w momencie generowania raportu, czyli przyjmowany jest czas na początku drugiego określonego w parametrze. Jednocześnie dla tabeli Obroty oraz dla tabeli Pozostałości i Obroty uwzględniane są granice czasowe, to znaczy czas liczony jest na końcu określonej sekundy.

Istnieje kilka sposobów wyjścia z tej sytuacji:

  1. Korzystając z tabeli Remains, wskaż punkt czasowy o 1 sekundę większy niż określony;
  2. Używaj tylko tabeli Pozostałości i Obroty (nie jest to najbardziej optymalna opcja z punktu widzenia wydajności);
  3. Skorzystaj z koncepcji granicy.

Ostatnią opcję można przedstawić za pomocą kodu pokazanego na ryc. 6.

W pierwszym parametrze naszego obiektu wskazujemy datę, za którą ma zostać wygenerowany raport, drugi parametr określa rodzaj granicy. Ponieważ zależy nam na tym, aby w selekcji uwzględnione były ruchy w danym dniu, musimy ustawić ten parametr na pozycję „W tym”.

Bardzo często w zapytaniach 1C trzeba pracować z datami. Zwłaszcza gdy żądanie kierowane jest do obiektów metadanych zawierających informacje okresowe. Z reguły są to rejestry (informacje, akumulacja, obliczenia, księgowość). Przyjrzyjmy się najczęściej używanym funkcjom języka zapytań 1C do pracy z datami. Będziemy budować przykłady w oparciu o rejestr informacyjny Organizacje pracowników Konfiguracje ZUP wersja 2.5.

  • DATA CZAS

    Umożliwia uzyskanie daty w żądaniu (z godziną lub bez) poprzez określenie roku, miesiąca, dnia, godziny, minuty, sekundy.
    Składnia:
    DATETIME(rok, miesiąc, dzień, godzina, minuta, sekunda)
    Zwykle nie jest wskazana godzina, minuta i sekunda. Podajmy mini przykład. Wpisz następujący tekst w konsoli zapytań:

    WYBIERZ DATĘGODZINĘ(2016, 1, 1)

    W wyniku realizacji żądania otrzymujemy datę - 01.01.2016
    Właściwie trudno sobie wyobrazić sytuację, w której data byłaby w ten sposób wskazana we wniosku. W końcu, gdy trzeba określić okres, używane są parametry. Ale jest przypadek, gdy ta funkcja ma szczególną wartość. To wtedy musimy wskazać pustą datę w polach lub w warunkach zapytania. Przypomnę, że dla języka 1C pusta data ma postać - 0001.01.01. Zatem, aby otrzymać pustą datę w żądaniu, wystarczy podać DATACZAS(1, 1, 1). Jako przykład wybierzmy z rejestru informacyjnego Organizacje pracowników zapisy, które nie są wypełnione Okres realizacji:

    WYBIERZ Pracownicy organizacji.Okres, Pracownicy organizacji.Pracownik, Pracownicy organizacji.Stanowisko, Pracownicy organizacji.Pion organizacji Z Informacje rejestrowe.Pracownicy organizacji AS Pracownicy organizacji GDZIE Pracownicy organizacji.Okres zakończenia = DATETIME(1, 1, 1)

  • POCZĄTEK OKRESU

    Dla określonej daty zwraca początek okresu, do którego ona należy.
    Składnia:
    POCZĄTEK OKRESU(data, typ okresu)
    PeriodType może przyjmować następujące wartości: MINUTA, GODZINA, DZIEŃ, TYDZIEŃ, MIESIĄC, KWARTAŁ, ROK, DEKADA, PÓŁROKU
    W konsoli zapytań wpisz:

    WYBIERZ POCZĄTEK OKRESU(DATAGODZINA(2016, 1, 15), MIESIĄC)

    Zapytanie zostanie zwrócone - 01.01.2016
    A teraz przykład. Jak wiadomo, okresowość rejestru Organizacje pracowników pewnego dnia. Utwórzmy zapytanie, w którym zamiast faktycznego okresu rekordowego wyświetli się data początkowa miesiąca.

    WYBIERZ POCZĄTEK OKRESU (Pracownicy organizacji. Okres, MIESIĄC) AS Początek miesiąca, Pracownicy organizacji. Pracownik, Pracownicy organizacji. Stanowisko, Pracownicy organizacji. Oddział organizacji Z Rejestru informacji. Pracownicy organizacji AS Pracownicy organizacji

  • KONIEC OKRESU

    Składnia jest taka sama jak dla początku kropki. Jak sama nazwa wskazuje, zwraca koniec okresu według daty i typu okresu. Nie będziemy tego szczegółowo rozważać. Ograniczmy się do mini przykładu.
    Wniosek:

    WYBIERZ KONIEC OKRESU(DATAGODZINA(2016, 1, 15), MIESIĄC)

    Zwraca 31.01.2016 23:59:59
    Jak widać, wartość jest zwracana z dokładnością do sekundy.

  • DODATK.DATA

    Dodaje określoną liczbę przedziałów czasu do daty.
    Składnia:
    ADDKDATE(data, typ okresu, ilość)
    PeriodType przyjmuje takie same wartości jak dla funkcji POCZĄTEK OKRESU
    Na przykład wybierzmy datę lutego:

    WYBIERZ DATĘ DODAWANIA(DATAGODZINA(2016, 2, 15), MIESIĄC, 2)

    Otrzymujemy datę 15.04.2016 0:00:00 Pomimo tego, że luty jest krótkim miesiącem, dzień otrzymanej daty jest taki sam jak pierwotny. To bardzo wygodne, że nie musisz myśleć o liczbie dni w miesiącach.
    Ilość może być również ujemna. Następnie odstęp jest liczony w przeciwnym kierunku.

  • RÓŻNICA DATA

    Oblicz różnicę między dwiema datami w określonych jednostkach miary.
    Składnia:
    RÓŻNICA DATY (data początkowa, data końcowa, typ okresu)
    Typ okresu może przyjmować następujące wartości: DRUGA, MINUTA, GODZINA, DZIEŃ, MIESIĄC, KWARTAŁ, ROK
    Na przykład:

    WYBIERZ RÓŻNICĘ DATA(DATAGODZINA(2016, 2, 15), DATAGODZINA(2016, 3, 1), DZIEŃ)

    zwraca 15

Tutaj sprawdziliśmy najczęściej używane funkcje języka zapytań 1C. Reszta używana dość rzadko. W razie potrzeby przykłady pracy z nimi można znaleźć w pomocy wbudowanej w platformę 1C.

Typ „Data” w 1C jest jednym z 4 głównych typów danych wraz z liczbą, ciągiem znaków i wartością logiczną. Daty są wszechobecne w konfiguracjach — nie da się uniknąć pracy z tego typu danymi podczas programowania. Dlatego lepiej zacząć pisać zapytania, wiedząc już, jak przetwarzać daty, jakie są możliwości pracy z nimi i jak są przechowywane. Spójrzmy na przykłady wszystkich niuansów pisania zapytań z różnymi datami.

Przykłady pracy z datami w zapytaniach 1C

Przede wszystkim należy uzyskać w żądaniu datę w wymaganym formacie – z czasem lub bez. Istnieje kilka sposobów wykonania tego zadania:

  1. Przekaż przez parametr. Za pomocą tej metody można uzyskać jedynie aktualną datę sesji;
  2. Pobierz datę w zapytaniu z pola wyboru;
  3. Konwertuj wartości liczbowe za pomocą funkcji DATETIME().

Najczęstszym zadaniem podczas pracy z dokumentami jest sprawdzenie pustej daty w żądaniu 1C. W takim przypadku najłatwiej jest porównać zmienną lub pole z pustą datą, którą uzyskuje się za pomocą funkcji DATETIME(1,1,1):

DATACZAS (1, 1, 1)

Za pomocą podobnego polecenia możesz uzyskać w żądaniu dowolną datę i godzinę. Ponadto można je określić z dokładnością do sekundy, podając jako parametry 6 liczb. Jeśli użyte zostaną tylko 3 cyfry, godziny, minuty i sekundy zostaną ustawione na 0 (początek dnia). Przykładowo w zapytaniu musimy wybrać dokumenty za pierwsze 10 dni stycznia 2018:

WYBIERZ Potwierdzenie do rachunku bieżącego. Połącz JAKO Połącz z dokumentu. Potwierdzenie do rachunku bieżącego JAKO Potwierdzenie do rachunku bieżącego WHERE Potwierdzenie rachunku bieżącego. 10, 23, 59, 59)

W zapytaniu we wbudowanym języku 1C możesz nie tylko wybierać różne pola i odbierać parametry. Istnieje wiele funkcji ułatwiających formatowanie dat pod konkretne zadanie. Jeśli często pracujesz z datami w zapytaniu, powinieneś znać następujące polecenia:

  • POCZĄTEK OKRESU. Parametry wskazują datę i okres czasu, w kontekście którego należy uzyskać początek daty. Służy do konwertowania daty na format ponadczasowy. W tym celu należy ustawić drugi parametr – „DZIEŃ”;
POCZĄTEK OKRESU(,) POCZĄTEK OKRESU(&Data, DZIEŃ) okres>data>
  • KONIEC OKRESU. Podobne polecenie zwracające ostatnią datę w jednostkach określonych w parametrach;
  • DODATK.DATA. Umożliwia uzyskanie daty większej o określoną liczbę określonych jednostek czasu. Parametry funkcji obejmują datę, jednostkę czasu i liczbę;
ADDKDATE(,) ADDKDATE(&Data, DZIEŃ, 10) ilość>typ>data>
  • RÓŻNICA DATA. Pobiera różnicę między datami w określonych jednostkach;
RÓŻNICA DATA(,) RÓŻNICA DATA(&Data1, &Data2, DZIEŃ) typ>data2>data1>
  • DZIEŃ TYGODNIA. Zwraca numer kolejny jednego z dni tygodnia.

Dzięki prawidłowemu wykorzystaniu tych funkcji programista może rozwiązać całkiem nietrywialne problemy. Na przykład pobranie nazwy dnia tygodnia bieżącej daty w żądaniu jako ciąg znaków:

WYBÓR GDYWEEKDAY(&bieżąca data) = 1 WTEDY „poniedziałek” WHENWEEKDAY(&bieżąca data) = 2 WTEDY „wtorek” WHENWEEKDAY(&bieżąca data) = 3 WTEDY „środa” WHENWEEKDAY(&bieżąca data) = 4 WTEDY „czwartek” GDY DZIEŃ TYGODNIE(&bieżąca data) = 5 WTEDY „Piątek” DZIEŃ TYGODNIA (&CurrentDate) = 6 WTEDY „sobota” W przeciwnym razie „niedziela” KONIEC

Konwersja typów w zapytaniu 1C z liczby lub ciągu znaków na datę jest zadaniem pracochłonnym. Datę można uzyskać z liczb za pomocą funkcji DATETIME, z ciągu znaków - łącząc funkcję SUBSTRING i konstrukcję SELECT WHEN THEN ELSE. Na tej podstawie programiści wolą uzyskać datę z innych typów w module i przekazać ją do żądania za pomocą parametru. Niestety nie zawsze jest to wykonalne, dlatego należy zmienić format daty we wniosku.

Możliwe jest określenie daty w żądaniu 1C jako parametru w celu uzyskania danych z wirtualnych tabel rejestrów. Rola ta może również korzystać ze wszystkich powyższych funkcji. Ale tutaj ważne jest, aby pusta data w żądaniu 1C nie wpłynęła na ostateczny wynik wykonania kodu, dlatego należy przeprowadzić kontrolę.