Okresowe rejestry informacyjne. Rejestry informacji okresowych Zabawa z przeliczeniami

Rejestr informacyjny 1C 8 to obiekt metadanych przeznaczony do przechowywania informacji referencyjnych w kontekście wymiarów zdefiniowanych przez programistę.

Typowym przykładem wykorzystania rejestru informacyjnego jest przechowywanie informacji o kursach walut według waluty i okresu.

Przyjrzyjmy się bliżej właściwościom i ustawieniom rejestru informacyjnego.

Dwie główne właściwości rejestru zbieżności to − Okresowość I Tryb nagrywania.

Są to unikalne właściwości rejestru informacyjnego, których nie posiada żaden inny obiekt metadanych. Przyjrzyjmy się im bliżej.

Właściwość ta umożliwia dodanie dodatkowego wymiaru do listy wymiarów - Okres. Za jego pomocą można rozwiązać wiele problemów: przechowywanie informacji w bazie danych, biorąc pod uwagę ich znaczenie w określonym dniu. Istnieje wiele stosowanych przykładów wykorzystania okresów: przechowywanie wartości waluty na każdy dzień, przechowywanie ceny przedmiotu itp.

Częstotliwość może przyjmować następujące wartości:

  • Nieokresowe
  • W ciągu sekundy
  • W ciągu dnia
  • W ciągu miesiąca
  • W obrębie bloku
  • W ciągu roku

Uzyskaj 267 lekcji wideo na 1C za darmo:

W przypadku wybrania innej cykliczności niż Nieokresowa system będzie kontrolował unikatowość rekordów w zadanym przedziale czasu. Jeśli rekord nie jest unikalny, system 1C wyświetli komunikat i nie pozwoli na zapis do bazy danych.

Jedną z głównych cech okresowego rejestru informacji jest możliwość uzyskania gotowych wartości „Wycięcia pierwszego” i „Wycięcia ostatniego”. Informacje te pozwalają na bardzo szybkie uzyskanie z bazy danych informacji o ostatniej (pierwszej) wartości zadanej w konkretnym dniu.

Tryb zapisu rejestru informacyjnego

W 1C 8.2 i 8.3 ta właściwość może być „Niezależna” lub „Przesłana do rejestratora”. W pierwszym przypadku wpisów można dokonać zarówno programowo, jak i z formy listowej rejestru informacyjnego. W drugim przypadku konieczne jest wskazanie dokumentu rejestrującego wpis. Nakłada to pewne ograniczenia, ale jednocześnie otwiera nowe możliwości.

Szczegóły Zarejestruj właściwości wymiarów

Należy również zwrócić uwagę na paletę właściwości pomiarowych rejestru informacyjnego 1C 8.3. Zwłaszcza w przypadku flag wiodących i głównych selekcji:

  • Prezenter— właściwość pomiaru, która implikuje informację, że bez wartości tego pomiaru wpis do rejestru nie ma sensu. W rzeczywistości oznacza to, że gdy system usuwa wartość z wymiaru, usuwa również wpis rejestru z wymiarem „Wiodącym”. Można ustawić tylko jeden pomiar.
  • Główny wybór— jeżeli rejestr jest niezależny, pomiary te posłużą do ustalenia rejestracji zmian w planie wymiany. Podobne użycie Główny wybór według okresu zawiera główny wybór okresu dla rejestrów okresowych.

Wpis programu do rejestru informacyjnego 1C

Istnieją dwa sposoby dodawania nowych rekordów do rejestru informacyjnego: przy użyciu menedżera rekordów i przy użyciu zestawu rekordów. Pierwszy przypadek jest odpowiedni dla pojedynczego rekordu, drugi - dla dwóch lub więcej rekordów.

Korzystanie z menedżera nagrań:

NewRecord = Rejestry informacyjne.Kursy walut.CreateRecordManager();
NewRecord.Currency = Katalogi.Waluty.FindByName("USD");
NewRecord.Period = Data(31,12,2016);
NowyRekord.Kurs = 100;
NowyRekord.Multiplicity = 1;
NowyRekord.Zapis();

Korzystanie z zestawu rekordów rejestru informacyjnego 1C:

NewRecordSet = Rejestry informacyjne.Kursy walut.CreateRecordSet();
//jeżeli nie ustawisz selekcji, wszystkie wpisy w rejestrze informacyjnym zostaną usunięte
NewRecordSet.Selection.Currency.Set(Dollar, True);
NewRecordSet.Selection.Period.Set(Data(31.12.2016), Prawda);
//bezpośrednio utwórz ustawiony rekord
NowyZestawRekordów = NowyZestawRekordów.Dodaj();
NewSetRecord.Currency = Katalogi.Waluty.FindByName("USD");
NewDialRecord.Period = Data (31.12.2016);
NewSetRecord.Course = 100;
NewSetRecord.Multiplicity = 1;
NowyZestawRekordów.Write();

W 1s 7.7 katalogi miały ciekawe detale - okresowe, zapamiętywały wartość szczegółów na podstawie czasu, praca z nimi nie była zbyt wygodna, ale przy braku alternatyw była konieczna. Po przejściu na 8 wielu programistów ze zdziwieniem odkryło brak okresowych szczegółów w podręcznikach.

Typowymi zadaniami rozwiązywanymi za pomocą okresowych rejestrów informacji jest przechowywanie informacji ograniczonych w czasie. Informacje mogą być niejednorodne, np. ceny towarów, stanowiska zajmowane przez pracownika w różnych okresach, parametry rachunkowości podatkowej przedsiębiorstwa. W 8 analogią szczegółów okresowych są skonsolidowane rejestry okresowe.

Aby powtórzyć funkcjonalność wersji 7.7, musisz wykonać następujące czynności:

Utwórz rejestr skonsolidowany „Okresowe dane Kontrahenta”, wskaż, że jest to okresowy rejestr informacji z częstotliwością jednego dnia.

Teraz w zakładce „Dane” musimy dodać typ – wymiar „Konto”, który pokrywa się z katalogiem, w którym chcemy zaimplementować funkcjonalność zbliżoną do szczegółów okresowych. W gałęzi „Szczegóły” dodajemy te szczegóły, które są określone w czasie. W przypadku kontrahenta może to być adres prawny i fizyczny, główny numer telefonu, nazwisko menedżera, główny faks itp.

Po zapisaniu konfiguracji dostęp do rejestru informacji można uzyskać poprzez boczne menu (w trybie aplikacji zarządzanej), patrz zrzut ekranu.

W normalnym trybie aplikacji za pomocą przycisku „Go”.

Jeśli jednak spojrzymy na wypełniony rejestr, zauważymy, że dość trudno jest zrozumieć, które informacje są istotne, ponieważ widzimy cały zestaw danych jako całość, a nie tylko informacje aktualnie istotne.

Gdy informacji jest dużo i łatwo można się pomylić, wskazane jest pokazanie aktualnych informacji na karcie kontrahenta. Tutaj nie można obejść się bez programowania.

Na początek dodajmy do formularza grupę, którą nazwiemy „Dane kontaktowe” i dodajemy do niej dwa szczegóły: „Menedżer” i „Telefon”


Natomiast w module formularza do zdarzenia „Przy otwarciu” przypiszemy akcje mające na celu uzyskanie aktualnych danych:

& Procedura otwarcia OnClient (odmowa) //Wstaw w miejsce kolektora dane=PobierzbieżąceDane(); próba Dyrektor = dani. kerivnik; koniec wyjątku; próba telefonu = dane. telefon; koniec wyjątku; Koniec procedury

Funkcja pozyskiwania aktualnych danych jest następująca:

funkcja OtrimatiCurrentData() //Wstaw w miejsce kolektora //((QUERY_CONSTRUCTOR_WITH_RESULT_PROCESSING // Duński fragment podpowiedzi konstruktora. // Jeśli ponownie zmienisz konstruktora, ręczne zmiany zostaną utracone!!!Żądanie = Nowe żądanie; Wniosek. Tekst = „WYBIERZ | Okresowe podsumowanie najnowszych danych kontrahenta. Kontrahent, | Okresowe podsumowanie najnowszych danych kontrahenta. Kerivnyk, | Okresowe podsumowanie najnowszych danych kontrahenta. Adresy, | Okresowe podsumowanie najnowszych danych kontrahenta. Telefon |Z | Rejestr Informacji. Dane okresowe Kontrahenta. Fragment najnowszych danych okresowych AS kontrahenta Fragment najnowszych danych|GDZIE | Okresowe podsumowanie najnowszych danych kontrahenta. Kontrahent = & Kontrahent" ; Żądanie. SetParameter(" Konto ", obiekt. Link); Wynik żądania = Żądanie. Wykonaj () ; SelectionDetailedRecords = Wynik żądania. Select(); dane= nowa struktura; While SelectionDetailedRecords. Next() Pętla // Wstaw próbkę selekcji SelectionDetailedRecords //SelectionDetailedRecords.Kerivnik; hołd Insert(" ker_vnik ", SelectionDetailedRecords. Kerіvnik) ; hołd Insert(" telefon ", SelectDetailRecords. Phone) ; Raport(WybórSzczegółowychRekordów.Telefon) ; Koniec cyklu ; Powrót hołdu; //))CONSTRUCTOR_QUERY_WITH_RESULT_PROCESSING Koniec funkcji

Skorzystałem z żądania, chociaż do tych celów można zastosować mniej uciążliwą konstrukcję:

selekcja = nowa struktura; wybór.Insert("Konto",obiekt); dane = rejestry informacyjne.ContactInformation.GetLast(,selection); raport(dane.Kerivnik); raport(dane.Ilość());

Należy pamiętać, że w funkcji Uzyskać najnowsze przekazywane są dwa parametry: moment w czasie i selekcja, ale jeśli jest to nam potrzebne w danej chwili, to pierwszy parametr można pominąć, przy selekcji nazwa klucza musi odpowiadać wartości wymiaru rejestru.

Najważniejsze, aby nie zapomnieć o zaznaczeniu odpowiednich pól w rejestrze w zakładce „Inne”.

Jeśli się temu przyjrzeć, rejestr informacji okresowych jest znacznie bardziej elastycznym narzędziem w porównaniu do szczegółów okresowych w wersji 7.7. Jest szeroko stosowany w typowych konfiguracjach.

W tym artykule rozważymy teoretyczne podstawy pracy z rejestrami obliczeniowymi, a także obliczymy wynagrodzenie pracownika proporcjonalnie do liczby przepracowanych godzin.

Teoria

Rejestr obliczeniowy (RR)- obiekt metadanych konfiguracyjnych służący do realizacji obliczeń okresowych w systemie 1C. Do oczywistych obszarów zastosowania rejestrów kalkulacyjnych należą: kalkulacja płac, kalkulacja czynszu, kalkulacja czynszu.

Rejestry obliczeniowe swoją budową przypominają rejestry akumulacyjne lub rejestry informacyjne. One, podobnie jak rejestry akumulacyjne, mają pomiary, zasoby, szczegóły, ale zasada działania rejestrów obliczeniowych jest zupełnie inna.

Zasadniczo pomiary w rejestrze akumulacji służą jako „ filtr» w kontekście którego otrzymujemy dane z rejestru akumulacji. Przykładowo, gdy weźmiemy „pozostałość” według rejestru akumulacji „Pozostały towar” w kontekście określonej pozycji lub „pozostałość najnowszego” według rejestru informacyjnego „Wynagrodzenia pracowników” w kontekście konkretnego pracownika . W odróżnieniu od rejestru akumulacji, pomiary w rejestrze rozliczeń okresowych służą realizacji „” (czyli wtedy, gdy typy obliczeń rozciągniętych w czasie konkurują ze sobą w przedziale okresu ważności zapisu, czyli np. kalkulacja podróży służbowych type zastępuje typ naliczania wynagrodzenia za okres ważności) oraz „” (w tym przypadku rodzaj naliczania premii zależy od rodzaju naliczania wynagrodzenia za poprzednie okresy).

mechanizm represji według okresu działania«:

Widzimy tutaj, że typ kalkulacji „Podróż służbowa” ma czas trwania i obowiązuje od 10 kwietnia do 20 kwietnia, „Podróż służbowa” jest wskazywana jako wypierający typ kalkulacji dla typu kalkulacji „Wynagrodzenie”. „Wynagrodzenie” również rozciąga się w czasie i obowiązuje od 1 kwietnia do 30 kwietnia. Ponieważ „Podróż służbowa” jest wskazana jako wypierający rodzaj kalkulacji dla typu kalkulacji „Wynagrodzenie” (ma wyższy priorytet niż wynagrodzenie) i obowiązuje przez okres ważności wynagrodzenia, to wynagrodzenie jest zastępowane przez podróż służbową i powstaje „Rzeczywisty okres ważności wynagrodzenia”. Rzeczywisty okres ważności wynagrodzenia „Jest to okres ważności wynagrodzenia po przemieszczeniu w podróży służbowej, w naszym przypadku składa się z 2 okresów - od 1 kwietnia do 9 i od 21 kwietnia do 30 i łącznie wynosi 19 dni. Mechanizm przesunięcia oparty na okresie działa tylko w przypadku obliczeń długoterminowych.

Powyższy rysunek graficznie przedstawia zasadę „ mechanizm zależności według okresu bazowego«:

Załóżmy, że pod koniec kwietnia 2017 roku chcemy przyznać pracownikowi premię w wysokości 10% jego wynagrodzenia. Jako podstawowy rodzaj naliczania premii wskazywane jest wynagrodzenie.

Jednak jako „podstawę” do wyliczenia składki nie przyjmiemy całego miesiąca kwietnia, a jedynie okres od 10 kwietnia do 20 kwietnia (11 dni). Obliczmy podstawę premii, wynagrodzenie pracownika wynosi 60 000 rubli, miesiąc ma 30 dni, dzienne wynagrodzenie = 60 000/30 = 2000 rubli. Następne 2000*11 = 22000 rub. Podstawą obliczenia składki jest 22 000 rubli.

Obliczmy składkę: (22000/100)*10 = 2200 rubli. Premia w wysokości 10% wynagrodzenia wynosi 2200 rubli.

Obiekt metadanych aplikacji „Plan typów obliczeń” jest ściśle powiązany z rejestrem obliczeń.

Plan typów obliczeń (PVR)- obiekt metadanych konfiguracyjnych przechowujący informacje o rodzajach typów obliczeń i określający wpływ różnych obliczeń na siebie.

Jeden plan typów obliczeń może być używany w kilku rejestrach obliczeń, ale jeden rejestr obliczeń nie może korzystać z kilku planów typów obliczeń jednocześnie.

Rejestr obliczeniowy jest tabelą, w której przechowywane są obliczone dane, a jeśli chodzi o typy obliczeń, przechowywane są algorytmy obliczania tych danych. Rejestr obliczeń musi mieć co najmniej jednego rejestratora dokumentów, który dokonuje ruchów w rejestrze obliczeń (na przykład Lista płac).

Mechanizmy obliczeniowe w systemie 1C Enterprise są zaprojektowane w taki sposób, że najpierw trzeba dokonać wpisów do rejestru obliczeń, a dopiero potem wykonać obliczenia na podstawie tych danych. Przykładowo nie da się naliczyć premii od wynagrodzenia, dopóki to samo wynagrodzenie nie zostanie odnotowane w rejestrze kalkulacyjnym.

Ćwiczyć

Przyjrzyjmy się bliżej rejestrom obliczeniowym w praktyce:

Krok 1 Zacznijmy od planu rodzajów obliczeń. Przed utworzeniem rejestru obliczeń należy utworzyć plan typu obliczeń. Plan typów obliczeń tworzymy przed rejestrem obliczeń, ponieważ przed utworzeniem tabeli do przechowywania danych obliczonych (czyli rejestru obliczeń) konieczne jest określenie algorytmów obliczania tych danych (czyli planu typów obliczeń).

Stwórzmy plan dla typów kalkulacji „Opłaty podstawowe”. Przejdźmy od razu do zakładki „Obliczenia”. Tutaj od razu widzimy flagę ” Używa okresu ważności", gdy ta flaga jest ustawiona, wszystkie typy obliczeń uwzględnione w tym planie będą miały długość w czasie(na przykład wynagrodzenie, podróż służbowa), a także dla tego planu typów obliczeń „ mechanizm represji według okresu działania„. Jeżeli flaga „Wykorzystuje okres ważności” nie jest ustawiona, wówczas typy kalkulacji nie będą miały przedłużenia w czasie (np. Premia, Kara) i nie będzie działał „mechanizm przesunięcia według okresu ważności”. Również na tej karcie znajdują się sekcje „Zależność od podstawy” i „Podstawowe plany typów obliczeń” - służą do wdrożenia „ mechanizm zależności według okresu bazowego„, ale porozmawiamy o tym później. Zostawmy na razie „Zależność od bazy” w trybie „Niezależny”.

Stwórzmy predefiniowany typ kalkulacji „Wynagrodzenie”. W zakładce „Podstawowe” wszystko jest proste. Ustaw nazwę i kod typu obliczenia.

Dzięki temu, że ustawiliśmy flagę” Używa okresu ważności„Mamy teraz zakładkę” Przemieszczanie" i włączyłem " okresowy mechanizm represji«.

W tej zakładce wskazujemy rodzaje naliczeń, które przesuną wynagrodzenie według okresu ważności (np. Podróż służbowa).

Notatka: w „Przemieszczaniu” możesz dodać typy obliczeń, które należą tylko do tego planu typów obliczeń.

Jest też zakładka „ Prezenterzy» – wskazuje typy obliczeń, które po zmianie muszą przeliczyć bieżący typ obliczeń. Tutaj możesz także określić typy obliczeń z innych planów typów obliczeń. Przykładowo typ kalkulacji „Wynagrodzenie” jest wiodącym typem kalkulacji „Bonus”, tj. Kiedy zmienia się wynagrodzenie, musimy również przeliczyć premię, ponieważ Premia naliczana jest w zależności od wynagrodzenia. W tym przypadku typ kalkulacji „Wynagrodzenie” należy do PRP „Podstawowe rozliczenia międzyokresowe”, który wykorzystuje okres ważności, a typ kalkulacji „Bonus” należy do PRP „Dodatkowe rozliczenia międzyokresowe”, które nie korzysta z okresu ważności.

Krok 2.Utwórzmy katalog „Charts” o domyślnej strukturze. W katalogu „Harmonogramy” będziemy przechowywać godziny pracy pracowników (pięciodniowe, sześciodniowe itp.).

Krok 3.Potrzebujemy również obiektu, w którym będziemy przechowywać kalendarz produkcji (dni robocze i weekendy). W tym celu korzystamy z nieokresowego niezależnego rejestru informacji.

Stwórzmy nieokresowy niezależny rejestr informacyjny „Harmonogramy pracy” z 2 wymiarami „Data” i „Harmonogram” oraz zasobem „Liczba godzin”.

Dzięki rejestrowi informacyjnemu „Rozkłady Pracy” będziemy mogli naliczyć wynagrodzenie z wynagrodzenia proporcjonalnie do ilości przepracowanych dni.

Krok 4.Utwórz dokument „Payroll” o strukturze szczegółów pokazanej poniżej:

Przybory:

Wykonanie operacyjne jest ustawione na „Zabroń” ponieważ nie ma to sensu dla mechanizmu okresowych rozliczeń w 1C - nigdy nie naliczamy premii, wynagrodzeń ani kar w czasie rzeczywistym.

Utwórzmy formularz dokumentu z ustawieniami domyślnymi.

Krok 5. Wreszcie dotarliśmy do punktu tworzenia rejestrów obliczeniowych.

Obiekt metadanych rejestru obliczeniowego znajduje się w gałęzi konfiguratora „Rejestry obliczeniowe”.

Stwórzmy rejestr kalkulacyjny „Opłaty podstawowe”. Przyjrzyjmy się poniższym ustawieniom rejestru obliczeniowego:

1. W polu „Plan typów rozliczeń” wskaż PVR „Opłaty podstawowe” utworzone w kroku 1.

2. Ustaw flagę „Okres ważności” na „True”, ponieważ PVR określony w kroku 1 ma przedłużenie w czasie.

Po ustawieniu tej flagi standardowe szczegóły „Action Period”, „Action PeriodStart”, „ActionPeriodEnd” natychmiast stają się dla nas dostępne, co oznacza, że ​​typy obliczeń zarejestrowane w tym rejestrze obliczeniowym również mają długość w czasie i mamy dostęp do „ mechanizm represji według okresu działania«.


P.S. Jeśli określisz PVR, który ma długość w czasie dla RR z flagą „Okres ważności” ustawioną na „Fałsz”, wówczas ten PVR będzie działał jak PVR, który nie ma przedłużenie w czasie.

3. Po ustawieniu flagi „Okres ważności” na „True” dostępne stają się dla nas pola „Wykres”, „Wartość wykresu”, „Data wykresu”.

W polu „Harmonogram” wskazujemy utworzony w kroku 3 rejestr informacyjny „Harmonogramy pracy”.

W polu „Wartość harmonogramu” wskazujemy zasób „Ilość godzin” w rejestrze informacyjnym „Harmonogramy pracy”.

W polu „Data harmonogramu” wskazujemy wymiar „Data” rejestru informacyjnego „Harmonogramy pracy”.

4.W polu „Częstotliwość” podajemy wartość „Miesiąc”, co oznacza, że ​​dane będą wprowadzane do rejestru w cyklach miesięcznych.

Poniżej znajduje się struktura metadanych rejestru:

Flaga „Podstawowa” dla wymiaru wpływa tylko na wydajność; nie musisz jej ustawiać, ale jeśli to zrobisz, pole „Pracownik” zostanie zindeksowane.

Wymiar „Pracownik” – stosowany jest w „ mechanizm represji oparty na okresie działania" I " mechanizm zależności od okresu bazowego«.

Zasób „Kwota” - obliczone wynagrodzenie zostanie tam zapisane.

Atrybut „Wykres” jest wskazany jako atrybut, a nie wymiar rejestru, ponieważ ani on, ani niczego nie wypiera - zasadniczo pole odniesienia. Ważny!!! Nie zapomnij wypełnić pola „Link do harmonogramu”. przy atrybucie „Harmonogram” należy wskazać wymiar „Harmonogram” rejestru informacyjnego „Harmonogramy pracy”, w przeciwnym razie wysokość wynagrodzenia nie zostanie naliczona.

Atrybut „Parametr” będzie przechowywać wartość wynagrodzenia.

Teraz, gdy już wskazaliśmy powiązanie z MS „Harmonogramy pracy”, obliczymy wynagrodzenie pracownika proporcjonalnie do liczby przepracowanych dni.

Wskazujemy dokument jako rejestratora ” Lista płac" utworzony w kroku 4.

Krok 6. Przesunięcia wykonujemy według rejestru kalkulacyjnego „Opłaty podstawowe”.

Wróćmy do dokumentu „Payroll” utworzonego w kroku 4.

Opiszmy proces księgowania w module obiektu dokumentu:

Fragment kodu przetwarzania dokumentu

1C (Kod)

Procedura ProcessingProcessing(Failure, Processing Mode) // zarejestruj BasicAccruals of Movement.MainAccruals.Write = True; Ruchy.MainAccruals.Clear(); Okres rejestracji = początek miesiąca (data); Dla każdego TechLineMainAccruals z cyklu MainAccruals Movement = Movements.MainAccruals.Add(); Move.Reversal = Fałsz; Movement.CalculationType = TechLineMainAccruals.CalculationType; Movement.ActionPeriodStart = TechLineMainAccruals.StartDate; Movement.ActionPeriodEnd = EndDay(TexLineMainAccruals.EndDate); Ruch.Okres Rejestracji = Okres Rejestracji; Ruch.Pracownik = TechLineMainAccruals.Pracownik; Movement.Chart = TechStringMainAccruals.Chart; Movement.Parameter = TechStringMainAccruals.Size; Koniec cyklu; Koniec procedury

Procedura przetwarzania (awaria, tryb)

// Główny rejestr rozliczeń międzyokresowych

Ruchy. Podstawowe rozliczenia międzyokresowe. napisz = prawda;

Ruchy. Podstawowe rozliczenia międzyokresowe. Jasne() ;

Okres rejestracji = początek miesiąca (data) ;

Dla każdego TechLine BasicAccrualsZ BasicAccrualsCycle

Ruch = ruchy. Podstawowe rozliczenia międzyokresowe. Dodać() ;

Ruch. Storno= Fałsz;

Ruch. Typ obliczenia=TexLineMainAcccruals. Typ obliczenia;

Ruch. PeriodActionStart = TechLineMainAcccruals. Data rozpoczęcia;

Ruch. ActionPeriodEnd=DzieńKońca(TexLineMainAccruals.EndDate) ;

Ruch. Okres Rejestracji = Okres Rejestracji;

Ruch. Pracownik = TechLineMainAccruals. Pracownik;

Ruch. Wykres = TechLineMainAcccruals. Harmonogram;

Ruch. Parametr = TechStringMainAccruals. Rozmiar;

Koniec cyklu;

Koniec procedury

Utwórzmy dokument testowy i uruchommy go:

Przejdźmy do „Przesunięć dokumentów”:

Widzimy, że okres rejestracji jest ustawiony na początek miesiąca, ponieważ Częstotliwość RR jest wskazywana jako „Miesiąc”. Widzimy też, że wszystkie pola poza kwotą zostały wypełnione (wynagrodzenie nie zostało jeszcze naliczone).

Krok 7.Napiszmy kod do obliczania listy płac.

Stwórzmy ogólny moduł „Obliczenia” z następującymi flagami:

Samo obliczenie odbędzie się w tym module ogólnym.

Napiszmy funkcję eksportu „Oblicz opłaty” w module „Kalkulacja”:

Ponieważ wypełniliśmy pola „Harmonogram”, „Wartość harmonogramu”, „Data harmonogramu” w ustawieniach RR „Opłaty podstawowe”, udostępniona została nam wirtualna tabela rejestru kalkulacyjnego Grafika danych, w zapytaniu do wirtualnej tabeli interesują nas następujące pola:

„Liczba godzin rzeczywistego okresu działania” — zawiera liczbę faktycznie przepracowanych godzin obliczoną na podstawie danych harmonogramu

„Liczba godzinOkres działania” – zawiera liczbę godzin pracy obliczoną na podstawie danych harmonogramowych w okresie rozliczeniowym

Procedura naliczania wynagrodzeń

1C (Kod)

Procedura CalculateAccruals(Rejestrator, Zbiór rekordów) Eksport //Żądanie wynagrodzenia=Nowe żądanie; Query.Text="SELECT | ISNULL(BasicAccrualsGraphicsData.NumberofHoursActualActionPeriod, 0) AS HoursFact, |BasicAccrualsGraphicsData.Parameter, |ISNULL(BasicAccrualsGraphicsData.NumberofHoursActionPeriod, 0) AS HoursPlan, |BasicAccrualsGraphicsData i ok.Numer wiersza |Z |Rejestr obliczeniowy.Podstawowe rozliczenia międzyokresowe. Dane graficzne(| Rejestrator = &Rejestrator | Oraz typ obliczenia = &Typ obliczeniaWynagrodzenie) AS Basic AccrualsDataGraphics"; Request.SetParameter("Rejestrator", Rejestrator); // przekaż dokument rejestratorowi, aby wyszukiwanie zostało przeprowadzone tylko na bieżącym dokumencie Request.SetParameter("Typ obliczeniaWynagrodzenie", Plany typów obliczeń. Podstawowe rozliczenia międzyokresowe. Wynagrodzenie); //ustaw typ obliczania wynagrodzenia, ponieważ oblicz wynagrodzenie Selection=Request.Run().Select(); SearchStructure=NowaStruktura; SearchStructure.Insert("Numer wiersza",0); //utwórz strukturę do wyszukiwania danych do obliczeń według numeru wiersza Dla każdego rekordu z zestawu rekordów Cykl //przechodź przez zbiór rekordów bieżącego dokumentuSearch Structure.LineNumber=Record.LineNumber; //wpisz numer linii do wyszukiwania If Selection.FindNext(Search Structure) Następnie //szukamy w próbce danych do obliczeń na podstawie bieżącego numeru linii Record.Sum =?(Selection.HoursPlan=0.0, Selection.HoursFact /Sample.HoursPlan * Próbkowanie .Parametr); //oblicz wynagrodzenie proporcjonalnie do przepracowanych dni, w parametrze - aktualne wynagrodzenie EndIf; Wybór.Reset(); //zresetuj wybór, potrzebujemy następnego rekordu zestawu rekordów, aby najpierw przeszukać zaznaczenie EndCycle; Zestaw rekordów.Write(, True); //zapisz obliczone rekordy do bazy danych, przekaż parametr Zamień = True EndProcedure

//Wynagrodzenie

Żądanie=Nowe żądanie;

Wniosek. Tekst="WYBIERZ

| ISNULL(BasicAccrualsDataGraphics.NumberofHoursActualActionPeriod, 0) AS HoursFact,

| BasicAccrualsDataGraphics.Parametr,

| ISNULL(BasicAccrualsDataGraphics.NumberofHoursActionPeriod, 0) AS Plan godzin,

| BasicAccrualsDataGraphics.NumberLines

|OD

| Rejestr obliczeniowy Podstawowe rozliczenia międzyokresowe Dane graficzne (

| Rejestrator = &Nagrywarka

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 zostały 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

    Oblicz różnicę między dwiema datami w określonych jednostkach.
    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.

Wielu programistów, którzy znają wersję 7.7 i chcą opanować wersję 8, pyta, gdzie poszły szczegóły odniesienia okresowego i stałe okresowe. A jeśli ich nie ma, jaki mechanizm je zastępuje? W 1C:Enterprise 8 okresowe rejestry informacyjne służą do przechowywania historii zmian wartości.

Ogólnie rzecz biorąc, rejestry informacyjne są przeznaczone do przechowywania informacji rozszerzonych poprzez kombinację pomiarów. Zasadnicza różnica między okresowym rejestrem informacji a zwykłym rejestrem polega na tym, że zawiera on dodatkowy wymiar systemowy „Okres”, który jest typu „data”. Dzięki temu można uzyskać nie tylko aktualną informację o obiekcie, ale także w dowolnym momencie.

Tworząc atrybut okresowy, określ właściwość „Okresowość” spośród następujących możliwych wartości:
- w ciągu sekundy,
- w ciągu dnia,
- w ciągu miesiąca,
- w obrębie bloku,
- w ciągu roku,
- według stanowiska rejestratora (dostępne, jeśli tryb rejestracji rejestru to „Przesłanie do rejestratora”).

Należy pamiętać, że typ zasobu informacyjnego może być pierwotny (liczba, ciąg znaków, data, wartość logiczna) lub odwołanie (DirectoryLink, DocumentLink, EnumerationLink itp.). Co więcej, możesz nawet przechowywać zdjęcia i inne nieustrukturyzowane informacje w rejestrze informacji, ponieważ możesz utworzyć zasób typu „Przechowywanie wartości”.

Najprostszym przykładem okresowego rejestru informacji są Kursy Walut. W tym rejestrze informacyjnym przechowywane są kursy wszystkich walut na każdy dzień.

Szczegółowe informacje o strukturze rejestru informacji o Kursach Walut zawiera poniższa tabela:
Wymiary: Waluty typu „DirectoryLink.Waluty”, wiodące, zakaz pustych wartości
Zasoby: Typ kursu „numer”, długość 15, dokładność 4, wartość nieujemna
Typ krotności „liczba”, długość 10, dokładność 0, wartość nieujemna
Częstotliwość W ciągu jednego dnia
Niezależny tryb nagrywania

Dane do tego rejestru informacyjnego można wprowadzić ręcznie za pomocą formularza listy.

UWAGA. Niemożliwe jest wprowadzenie do rejestru informacyjnego dwóch rekordów o tym samym zestawie miar i okresie z określoną częstotliwością nierówną „Według stanowiska do rejestratora”, tj. Nie można wprowadzić dwóch kursów tej samej waluty tego samego dnia. Jeżeli częstotliwość wpisów do rejestru jest ustawiona na „Według stanowiska rejestratora”, wówczas klucz unikalności wpisu zawiera także odnośnik do dokumentu rejestratora, tj. w takim rejestrze nie mogą znajdować się dwa rekordy z tym samym zestawem pomiarów, okresem i rejestratorem. Jest to integralna właściwość rejestru informacyjnego, odróżniająca go od innych rejestrów.
Dodawanie nowych wpisów do rejestru informacyjnego, jak również wyliczanie wpisów istniejących, odbywa się w sposób standardowy dla wszystkich rejestrów. W tej sekcji rozważymy tylko najważniejsze
- uzyskanie informacji z rejestru okresowego w określonym momencie.

Dostęp do informacji okresowych za pomocą metod
Obiekt Information RegisterManager umożliwia dostęp do „wyników” rejestru. Przez „wyniki” okresowego rejestru informacji rozumie się pierwszą lub ostatnią wartość zasobów dla określonych wymiarów. Stosowane są następujące metody:

Dostawać (<Период>, <Отбор>)

Zwraca jako strukturę wartości zasobów jednego wpisu rejestru odpowiadające określonym wartościom wszystkich (!) wymiarów i okresu rejestru.
Uzyskać najnowsze (<Конец периода>, <Отбор>)
Ta metoda zwraca bieżącą wartość zasobu, która obowiązywała w określonym dniu. Jeżeli nie znajdzie wpisu w rejestrze dla danej kombinacji wymiarów dokładnie za podany okres, to zwracana jest struktura zawierająca wartości zasobu najbliższego późniejszego wpisu.
PobierzFirst (<Начало периода>, <Отбор>)
Metoda ta działa podobnie do metody GetLast, z tym że jeśli aktualnie nie odnaleziono żadnego rekordu, to zwracana jest struktura zawierająca wartości zasobów najbliższego wcześniejszego rekordu.
Kawałek Ostatniego (<Конец периода>, <Отбор>)
Metody te są podobne odpowiednio do metod GetLast i GetFirst, ale zazwyczaj nie określają jednego lub większej liczby wymiarów. W rezultacie nie jest zwracana struktura jak w poprzednich przypadkach, ale tabela wartości wypełniona danymi ze znalezionych wpisów rejestru informacyjnego.

Przy wywoływaniu metod GetFirst, GetLast, SliceFirst i SliceLast pierwszy parametr może być typu „data”, Instant in Time lub Boundary, ale można go w ogóle pominąć, wówczas wartości zasobów z pierwszego lub ostatniego wpisu do rejestru zostaną znalezione, odpowiednio.

Zademonstrujmy zastosowanie tych metod na przykładach:

Przykład 1. Uzyskanie kursu waluty dokładnie na daną datę (jeżeli nie ma zapisu na tę datę, to elementy struktury będą zawierały wartości puste).


StructureRateMultiplicity = Rejestry informacyjne.Stawki walut.Get(SelectDate, CurrencySelection);
Jeżeli StructureRateMultiplicity.Rate = 0 Wtedy
Report("Nie określono kursu wymiany na tę datę!");
W przeciwnym razie
Report("Kurs waluty:" + Abbr(StructureRateMultiplicity.Rate) + ", krotność: " + Abbr(StructureRateMultiplicity.Multiplicity));
koniecJeśli;

Przykład 2. Uzyskanie aktualnego kursu waluty na dany dzień (w przypadku braku zapisu na tę datę zostanie znaleziony najbliższy późniejszy rekord)

CurrencySelection = Nowa struktura("Waluta", SelectCurrency);
StructureRateMultiplicity = Rejestry informacyjne.Stawki walut.GetLast(SelectDate, CurrencySelection);
Report("Aktualny kurs wymiany na dany dzień: " + StructureRateMultiplicity.Rate);

Przykład 3. Uzyskanie aktualnych kursów wszystkich walut na dany dzień (wybór nie jest określony, tzn. chcemy uzyskać informację o wszystkich wartościach pomiaru).

tzData = Rejestry informacyjne.Kursy walut.Last Slice(SelectDate,);

Report("Dla waluty " + Linia(String.Waluta) + " kurs na daną datę: " + Linia(String.Rate) + ", krotność: " + Linia(String.Multiplicity));
Koniec cyklu;

Przykład 4. Uzyskanie aktualnych cen hurtowych towarów (wskazany jest wybór według wymiaru „TypePrice”)

SelectionPriceType = Nowa struktura("PriceType", Enumeration.PriceTypes.Wholesale);
tzData = Rejestry informacyjne.CompanyPrices.Last Slice(SelectDate, SelectionPriceType);
Dla każdej strony cyklu TzData
Report("Dla pozycji " + Linia(Linia.Nomenklatura) + "cena hurtowa: " + Linia(Linia.Cena));
Koniec cyklu;

Dostęp do informacji okresowych za pomocą zapytań

Aby uzyskać te informacje, należy skorzystać z wirtualnej tabeli przekrojów ostatnich/pierwszych rekordów rejestru informacyjnego. Jej struktura jest całkowicie identyczna z tabelą główną rejestru informacyjnego i zawiera następujące pola:
<Имя измерения> - Zestaw pól zawierających wartości wymiarów rejestru. Nazwy pól odpowiadają nazwom wymiarów.
<Имя реквизита> - Zestaw pól zawierających wartości szczegółów rejestru.
<Имя ресурса> - Zestaw pól zawierających wartości zasobów rejestru.
Działalność- Zawiera oznaki aktywności rejestrującej. Rekordy, dla których wartość tej właściwości jest ustawiona na False, nie będą brane pod uwagę przy pobieraniu „pierwszego” lub „ostatniego” rekordu rejestru, a także przy pobieraniu informacji za konkretny moment w czasie.
Chwila czasu- Zawiera moment w czasie wpisu do rejestru.
Numer kolejki- Zawiera numer linii zdefiniowany jako numer kolejny rekordu w zestawie rekordów.
Okres- Zawiera okres, którego dotyczy wpis do rejestru.
Rejestrator- Zawiera łącze do dokumentu rejestratora ruchu.

Uzyskując dostęp do tabel wirtualnych SliceFirst i SliceLast, możesz określić następujące parametry:

Data - Wskazana jest data lub moment, dla którego informacje będą otrzymywane. Jeżeli parametr nie zostanie określony, zostaną wybrane najnowsze/najstarsze rekordy.
Stan - Warunek jest określony w języku zapytań. Będzie ona wykorzystywana do ograniczenia składu rekordów, spośród których zostanie wybrany najnowszy/najwcześniejszy. Warunek zostanie zastosowany do oryginalnych rekordów, a nie do już wybranych.

Oto przykłady dostępu do wpisów rejestru informacji za pomocą zapytań:

Przykład 1. Zaznacz wszystkie wpisy rejestru informacyjnego

WYBIERZ * Z RejestruInformacji.Kursy walut

Przykład 2. Uzyskaj aktualny kurs jednej waluty na dany dzień

WYBIERZ walutę, kurs
Z RegisterInformation.CurrencyRates.SliceLast(&SelectDate, Currency = &SelectCurrency);

Przykład 3. Wybierz aktualne kursy wszystkich walut na dany dzień

WYBIERZ walutę, kurs
Z RegisterInformation.CurrencyRates.SliceLast(&SelectDate);

Przykład 4. Uzyskaj aktualny cennik na dany dzień (wskazany jest konkretny rodzaj ceny, np. „Detaliczna”)

WYBIERZ Nazewnictwo, Cena
Z RegisterInformation.CompanyPrices.SliceLast(&SelectDate,PriceType=&SelectPriceType);

Streszczenie
- Rejestr informacji okresowych jest potężnym narzędziem do przechowywania historii zmian niemal każdej informacji.
- Częstotliwość prowadzenia rejestru informacji może być bardzo zróżnicowana: od stanowiska rejestratora dokumentów (częstotliwość minimalna) do roku (częstotliwość maksymalna). 1C:Enterprise 8 posiada również nieokresowe rejestry informacyjne.
- Typ zasobu rejestru informacyjnego może być pierwotny (liczba, ciąg znaków, data, wartość logiczna), odwołanie (link do elementu katalogu, dokumentu, wartości wyliczeniowej) lub magazyn wartości.
- Rejestr informacji okresowych może generować wartości zasobów dokładnie w danym dniu, najnowszą lub najwcześniejszą wartość w danym dniu lub wycinek pierwszego i wycinek drugiego w określonym dniu w oparciu o określone wartości wymiarowe.
- Dostęp do danych rejestru informacyjnego możliwy jest zarówno przy wykorzystaniu metod, jak i zapytań.