Salda i obroty wirtualnego stołu 1c. Karta Zapytanie wsadowe

Postanowiłem wnieść swój wkład i opisać te cechy języka, które nie zostały omówione w powyższych artykułach. Artykuł skierowany jest do początkujących programistów.

1. Projekt „IZ”.

Aby uzyskać dane z bazy danych, wcale nie jest konieczne stosowanie konstrukcji „FROM”.
Przykład: Musimy wybrać wszystkie informacje o bankach z katalogu banków.
Wniosek:

WYBIERZ katalog.Banki.*

Wybiera wszystkie pola z katalogu Banki. I jest podobny do żądania:

WYBIERZ Banki.* Z katalogu.Banki AS Banki

2. Porządkowanie danych według pola referencyjnego

Kiedy musimy uporządkować dane zapytania według typów pierwotnych: „String”, „Numer”, „Data” itp., to wszystko rozwiązuje się za pomocą konstrukcji „ORDER BY”, jeśli chcesz uporządkować dane według pola referencyjnego? Pole referencyjne to link, unikalny identyfikator, tj. Z grubsza rzecz biorąc, dowolny zestaw znaków i zwykła kolejność mogą dać wynik, który nie jest całkowicie oczekiwany. Do zamówienia pól referencyjnych stosowana jest konstrukcja „AUTO ZAMÓWIENIE”. W tym celu należy najpierw uporządkować dane bezpośrednio według typu referencyjnego stosując konstrukcję „ORDER BY”, a następnie konstrukcję „AUTO ORDER”.

W tym przypadku dla dokumentów kolejność będzie następować w kolejności „Data->Numer”, dla podręczników w „Widoku Głównym”. Jeżeli uporządkowanie nie następuje poprzez pola referencyjne, wówczas nie zaleca się stosowania konstrukcji „AUTO ZAMÓWIENIE”.

W niektórych przypadkach konstrukcja „AUTO ZAMÓWIENIE” może spowolnić proces selekcji. Podobnie możesz przepisywać dokumenty bez automatycznego porządkowania:

3.Uzyskanie reprezentacji tekstowej typu referencyjnego. Projekt „PREZENTACJA”.

Gdy zachodzi potrzeba wyświetlenia pola typu referencyjnego, np. pola „Bank”, będącego odnośnikiem do elementu katalogu „Banki”, należy pamiętać, że wyświetlając to pole, należy uwzględnić podzapytanie do pola „Banki”. Banki” zostanie automatycznie uruchomiony w celu uzyskania widoku katalogu. Spowoduje to spowolnienie przesyłania danych. Aby tego uniknąć, należy w żądaniu zastosować konstrukcję „PREZENTACJA”, aby od razu uzyskać reprezentację obiektu, a następnie wyświetlić ją do obejrzenia.

W systemie kompozycji danych ten mechanizm jest domyślnie stosowany, jednak tworząc układy w komórkach należy określić reprezentację pola referencyjnego i np. samo łącze umieścić w transkrypcie.

4. Warunek próbkowania danych według szablonu.

Na przykład musisz zdobyć telefony komórkowe pracowników w formie (8 -123-456-78-912). Aby to zrobić, musisz ustawić w żądaniu następujący warunek:

WYBIERZ pracownika.Imię, Pracownik.Telefon JAKO telefon Z katalogu.Pracownicy JAKO Pracownicy GDZIE Telefon JAK „__-___-___-__-__”

Znak „_” jest znakiem usługowym i zastępuje dowolny znak.

5. Jednoczesne wykorzystanie sum i grupowań.


Sumy są często używane w połączeniu z grupowaniem; w tym przypadku funkcje agregujące nie mogą być określone w sumach.

WYBIERZ Świadczenie usług.Organizacja AS Organizacja, świadczenie usług.Nomenklatura AS Nomenklatura, SUM(Świadczenie usług.Ilość dokumentu) AS Suma dokumentu Z dokumentu.Świadczenie usług AS Świadczenie usług GRUPA WG świadczenie usług.Organizacja, świadczenie Usług.Nomenklatura WYNIKI PRZEZ OGÓLNE, Organizacja, Nomen klatura

W takim przypadku zapytanie zwróci prawie to samo, co poniższe zapytanie:

WYBIERZ Świadczenie usług.Organizacja AS Organizacja, Świadczenie usług.Nomenklatura AS Nomenklatura, Świadczenie usług.Ilość dokumentu JAKO Ilość dokumentu Z dokumentu.Świadczenie usług JAKO Świadczenie usług WYNIKI KWOTA (Ilość dokumentu) PRZEZ OGÓLNE, Organizacja, Nomenklatura

Tylko pierwsze zapytanie zwinie rekordy o tej samej nomenklaturze.

6. Pola dereferencyjne.

Odwoływanie się do pól za pomocą kropki nazywa się operacją dereferencji pola odniesienia. Na przykład Płatność.Organizacja.Jednostka administracyjna. W tym przypadku w polu referencyjnym „Organizacja” dokumentu „Płatność” odnosi się do innej tabeli „Organizacje”, w której zostanie uzyskana wartość atrybutu „Jednostka administracyjna”. Ważne jest, aby zrozumieć, że uzyskując dostęp do pól za pomocą kropki, platforma domyślnie tworzy podzapytanie i łączy te tabele.

Wniosek:

Można przedstawić jako:

WYBIERZ Płatność.Link, Płatność.Organizacja, Płatność.Organizacja, Organizacje. Jednostka administracyjna Z Dokument.Płatność JAKO Płatność LEWY DOŁĄCZ Katalog.Organizacje AS Oprogramowanie Organizacje Płatność.Organizacja = Organizacje.Link

Podczas wyłuskiwania pól referencyjnych typu złożonego struktura próbuje utworzyć niejawne połączenia ze wszystkimi tabelami, które są częścią typu tego pola. W takim wypadku zapytanie nie będzie optymalne.Jeżeli wiadomo jaki to typ pola to należy ograniczyć takie pola ze względu na typ konstruktem WYRAZIĆ().

Na przykład istnieje rejestr akumulacji „Płatności nierozdzielone”, w którym kilka dokumentów może pełnić funkcję rejestratora. W takim przypadku nieprawidłowe jest uzyskanie wartości danych rejestratora w ten sposób:

WYBIERZ UnallocatedPayments.Register.Date, ..... Z RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

powinieneś ograniczyć typ pola złożonego do rejestratora:

WYBIERZ EXPRESS(UnallocatedPayments.Zarejestruj jako dokument.Płatność).Data, ..... Z RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

7. Konstrukcja „GDZIE”

W przypadku lewego złączenia dwóch tabel, gdy na prawą tabelę nałożymy warunek „GDZIE”, otrzymamy wynik podobny do wyniku przy wewnętrznym złączeniu tabel.

Przykład. Należy wybrać wszystkich Klientów z Katalogu Klientów i dla tych klientów, którzy posiadają dokument płatniczy o wartości atrybutu „Organizacja” = &Organizacja, wyświetlić dokument „Płatność”, dla tych, którzy go nie posiadają, nie wyświetlają go.

Wynik zapytania zwróci rekordy tylko dla tych klientów, którzy w parametrze mieli płatność według organizacji, a pozostałych klientów odfiltruje. Dlatego należy najpierw otrzymać wszystkie płatności za „taką a taką” organizację w tabeli tymczasowej, a następnie połączyć ją z katalogiem „Klienci” za pomocą lewego złączenia.

WYBIERZ Płatność.Link JAKO Płatność, Płatność.Udziałowiec JAKO Klient MIEJSCE doPłatności Z Dokumentu.Płatność JAKO Płatność GDZIE Płatność.Oddział = &Oddział; /////////////////////////////////////////////// ///////////////////////// WYBIERZ Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Płatność Z katalogu .Clients AS Klienci Opuścili POŁĄCZENIE dopłatności JAKO OPROGRAMOWANIE dopłat Klienci.Link = topłatności.Klient

Możesz obejść ten stan w inny sposób. Konieczne jest nałożenie warunku „GDZIE” bezpośrednio na relację między dwiema tabelami. Przykład:

WYBIERZ Klienci.Link, Płatność.Link Z katalogu.US_Subscribers AS US_Subscribers LEWE POŁĄCZENIE Dokument.Płatność AS Oprogramowanie płatnicze (Clients.Link = Płatność.Klient ORAZ Płatność.Klient.Nazwa JAK „Pakiet cukru”) GRUPA WEDŁUG Klientów.Link, Płatność. Połączyć

8. Łączy się z tabelami zagnieżdżonymi i wirtualnymi

Zagnieżdżone zapytania często konieczne do pobrania danych w oparciu o pewien warunek. Jeśli następnie użyjesz ich w połączeniu z innymi tabelami, może to krytycznie spowolnić wykonanie zapytania.

Na przykład dla niektórych klientów musimy uzyskać kwotę salda na bieżącą datę.

WYBIERZ UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (WYBIERZ Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEWO DOŁĄCZ RegisterAccumulations.UnallocatedPayments. Salda AS UnallocatedPayments BY Zagnieżdżone żądanie.Link = UnallocatedPaymentsBa lance. Klient

Wykonując takie zapytanie, optymalizator DBMS może popełnić błędy przy wyborze planu, co doprowadzi do nieoptymalnego wykonania zapytania. Podczas łączenia dwóch tabel optymalizator DBMS wybiera algorytm łączenia tabel na podstawie liczby rekordów w obu tabelach. Jeśli istnieje zapytanie zagnieżdżone, niezwykle trudno jest określić liczbę rekordów, które zwróci zapytanie zagnieżdżone. Dlatego zamiast zapytań zagnieżdżonych należy zawsze używać tabel tymczasowych. Przepiszmy więc prośbę.

WYBIERZ Klienci.Link AS Link UMIEŚĆ tKlientów Z katalogu.Klienci JAKO Klienci GDZIE
Klienci.Link B (&Klienci) ; /////////////////////////////////////////////// ////////////////////////// WYBIERZ tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT DOŁĄCZ RegisterAccumulations.UnallocatedPayments.Balances (, Client IN (WYBIERZ tClients.Link Z tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

W tym przypadku optymalizator będzie w stanie określić z ilu rekordów korzysta tabela tymczasowa tClients i będzie mógł wybrać optymalny algorytm łączenia tabel.

Wirtualne stoły , pozwalają na uzyskanie praktycznie gotowych danych dla większości stosowanych zadań (Kawałek Pierwszy, Kawałek Ostatni, Pozostałości, Obroty, Pozostałości i Obroty) Słowo klucz jest tutaj wirtualne. Tabele te nie mają charakteru fizycznego, lecz są kompilowane przez system na bieżąco, tj. Po otrzymaniu danych z tablic wirtualnych system pobiera dane z tablic rejestrów końcowych, zestawia je, grupuje i wydaje użytkownikowi.

Te. Podczas łączenia się z tabelą wirtualną nawiązywane jest połączenie z podzapytaniem. W tym przypadku optymalizator DBMS może również wybrać nieoptymalny plan połączeń. Jeżeli zapytanie nie zostanie wygenerowane wystarczająco szybko i wykorzystuje złączenia w tabelach wirtualnych, wówczas zaleca się przeniesienie dostępu do tabel wirtualnych do tabeli tymczasowej, a następnie dokonanie złączenia pomiędzy dwiema tabelami tymczasowymi. Przepiszmy poprzednią prośbę.

WYBIERZ Klienci.Link AS Link UMIEŚĆ tKlientów Z katalogu.Klienci JAKO Klienci INDEKS WEDŁUG łącza GDZIE
Klienci.Link B (&Klienci) ; /////////////////////////////////////////////// ////////////////////////// WYBIERZ UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Klient MIEJSCE salda Z RegisterAccumulations.UnallocatedPayments.Balances(, Klient B ( WYBIERZ tClients. Link Z tClients)) AS UnallocatedPaymentsBalance; /////////////////////////////////////////////// ////////////////////////// WYBIERZ tClients.Link, toRemainders.AmountRemaining AS AmountRemaining OD tClients AS tClients LEFT DOŁĄCZ doRemainders AS Remainders PRZEZ tClients.Link = tPozostałe.Klient

9.Sprawdzanie wyniku żądania.

Wynik zapytania może być pusty; aby sprawdzić puste wartości, użyj następującej konstrukcji:

ResRequest = Request.Execute(); Jeśli resQuery.Empty() Następnie wróć; koniecJeśli;

metoda Pusty() należy stosować przed metodami Wybierać() Lub Rozładować(), ponieważ odzyskanie kolekcji wymaga czasu.

Nie jest dla nikogo odkrywcą, że używanie zapytań w pętli jest wyjątkowo niepożądane. Może to mieć krytyczny wpływ na czas działania określonej funkcji. Jest wysoce pożądane, aby otrzymać wszystkie dane w żądaniu, a następnie przetworzyć je w pętli. Ale czasami zdarzają się przypadki, gdy przeniesienie żądania poza pętlę staje się niemożliwe. W tym przypadku dla optymalizacji można przenieść tworzenie zapytania poza pętlę i w pętli podstawić niezbędne parametry i wykonać zapytanie.

Żądanie = Nowe żądanie; Query.Text = "WYBIERZ | Klienci.Link, | Klienci.Data urodzenia |FROM | Katalog.Klienci AS Klienci |GDZIE | Klienci.Link = &Klient"; Dla każdego wiersza z tabeli TableClients Loop Query.SetParameter("Client", Client); QueryResult = Query.Execute().Wybierz(); Koniec cyklu;

Dzięki temu system nie będzie musiał sprawdzać składni żądania w pętli.

11. Konstrukcja „MIEĆ”.

Projekt dość rzadki w prośbach. Umożliwia nakładanie warunków na wartości funkcji agregujących (SUMA, MINIMUM, ŚREDNIA itp.). Na przykład musisz wybrać tylko tych klientów, których kwota płatności we wrześniu wyniosła ponad 13 000 rubli. Jeśli skorzystasz z warunku „GDZIE” będziesz musiał najpierw utworzyć tabelę tymczasową lub zagnieżdżone zapytanie, pogrupować tam rekordy według kwoty płatności, a następnie zastosować warunek. Konstrukcja „HAVING” pomoże tego uniknąć.

WYBIERZ Płatność.Klient, KWOTA(Kwota.Płatności) JAKO Kwota Z Dokumentu.Płatność JAKO Płatność GDZIE MIESIĄC(Data.Płatności) = 9 GRUPA WG Płatności.Klient MAJĄCY KWOTĘ(Kwota.Płatności) > 13000

Aby to zrobić w konstruktorze, wystarczy przejść do zakładki „Warunki”, dodać nowy warunek i zaznaczyć pole wyboru „Niestandardowy”. Potem po prostu napisz Kwota (płatność. kwota) > 13000


12. Wartość NULL

Nie będę tutaj opisywał zasad logiki trójwartościowej w bazie danych, artykułów na ten temat jest wiele. Krótko o tym jak ZERO może mieć wpływ na wynik zapytania. Wartość NULL w rzeczywistości nie jest wartością i fakt, że wartość jest niezdefiniowana, jest nieznany. Dlatego każda operacja z wartością NULL zwraca wartość NULL, niezależnie od tego, czy jest to dodawanie, odejmowanie, dzielenie czy porównanie. Wartości NULL nie można porównać z wartością NULL, ponieważ nie wiemy, co porównać. Te. oba te porównania to: NULL = NULL, NULL<>NULL nie jest prawdą ani fałszem, nie jest znane.

Spójrzmy na przykład.

Dla tych klientów, którzy nie mają płatności, musimy wyświetlić pole „Podpisz” z wartością „Brak płatności”. Co więcej, wiemy na pewno, że mamy takich klientów. I żeby oddać istotę tego co napisałem powyżej, zróbmy to tak.

WYBIERZ „Brak płatności” jako atrybut, NULL jako dokument MIEJSCE dopłat; /////////////////////////////////////////////// ///////////////////////// WYBIERZ Klienci.Połącz AS Klienta, Płatność.Link JAK Płatność PUT tClientPayment Z Katalogu.Klienci JAKO Klienci LEWY Dokument POŁĄCZENIA. Klienci oprogramowania płatniczego Payment AS.Link = Payment.Shareholder; /////////////////////////////////////////////// ///////////////////////// WYBIERZ tClientPayment.Client Z tClientPayment AS tClientPayment DOŁĄCZENIE WEWNĘTRZNE tPayment AS tTopay PRZEZ tClientPayment.Payment = tPayment.Dokument

Zwróć uwagę na drugą tabelę tymczasową tClientPayment. Lewym złączeniem wybieram wszystkich klientów i wszystkie płatności dla tych klientów. Dla klientów, którzy nie mają płatności, pole „Płatność” będzie miało wartość NULL. Kierując się logiką, w pierwszej tabeli tymczasowej „tPayments” wyznaczyłem 2 pola, jedno z nich NULL, drugie wiersze „Nie ma płatności”. W trzeciej tabeli łączę tabele „tClientPayment” i „tPayment” za pomocą pól „Płatność” i „Dokument” złączeniem wewnętrznym. Wiemy, że w pierwszej tabeli pole „Dokument” ma wartość NULL, a w drugiej tabeli osoby, które nie mają płatności w polu „Płatność” również mają wartość NULL. Co nam da takie połączenie? Ale to nic nie zwróci. Ponieważ porównanie NULL = NULL nie daje wartości True.

Aby żądanie zwróciło oczekiwany wynik napiszmy je od nowa:

WYBIERZ „Brak płatności” JAKO atrybut, WARTOŚĆ(Document.Payment.EmptyLink) JAKO Dokument MIEJSCE toPayments; /////////////////////////////////////////////// ///////////////////////// WYBIERZ Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) JAK Płatność PUT tClientPayment Z katalogu.Klienci JAKO Klienci LEWY POŁĄCZENIE Dokument.Płatność JAKO Płatność PRZEZ Klientów.Link = Płatność.Udziałowiec; /////////////////////////////////////////////// ///////////////////////// WYBIERZ tClientPayment.Client Z tClientPayment AS tClientPayment DOŁĄCZENIE WEWNĘTRZNE tPayment AS tTopay PRZEZ tClientPayment.Payment = tPayment.Dokument

Teraz w drugiej tabeli tymczasowej wskazaliśmy, że jeśli pole „Płatność” ma wartość NULL, to pole to = pusty link do dokumentu płatności. W pierwszej tabeli zastąpiliśmy także NULL pustym odwołaniem. Teraz połączenie obejmuje pola inne niż NULL i żądanie zwróci oczekiwany wynik.

Wszystkie prośby zawarte w artykule odzwierciedlają sytuacje, które chciałbym rozważyć i nic więcej. O Nie mogą być urojeniowe ani nieoptymalne, najważniejsze jest to, że odzwierciedlają istotę przykładu.

13. Nieudokumentowana cecha projektu „WYBÓR KIEDY…TO…KOŃC”.

W przypadku konieczności opisania w żądaniu konstrukcji „Warunki” stosujemy standardową składnię:

WYBIERZ WYBÓR, GDY Users.Name = „Vasya Pupkin” WTEDY „Nasz ulubiony pracownik” W przeciwnym razie „Nie wiemy tego” KONIEC JAKO Pole 1 Z katalogu.Użytkownicy JAKO Użytkownicy

A co jeśli na przykład w żądaniu będziemy musieli uzyskać nazwę miesiąca? Pisanie ogromnej konstrukcji w żądaniu jest brzydkie i czasochłonne, dlatego powyższa forma pisania może nam pomóc:

WYBIERZ MIESIĄC(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) KIEDY 1 NASTĘPNIE „styczeń” KIEDY 2 NASTĘPNIE „luty” KIEDY 3 NASTĘPNIE „marzec” KIEDY 4 NASTĘPNIE „kwiecień” KIEDY 5 NASTĘPNIE „maj” KIEDY 6 NASTĘPNIE „czerwiec” KIEDY 7 WTEDY „lipiec” K KIEDY 8 WTEDY „sierpień” KIEDY 9 WRZESIEŃ KIEDY 10 WTEDY „październik” KIEDY 11 WTEDY „listopad” KIEDY 12 WTEDY „grudzień” KOŃCZY SIĘ JAKO miesiąc

Teraz projekt wygląda mniej uciążliwie i jest łatwy do zrozumienia.

14. Wykonywanie zapytań wsadowych.


Aby nie mnożyć żądań, możesz utworzyć jedno duże żądanie, podzielić je na pakiety i pracować z nimi.
Na przykład muszę pobrać z katalogu „Użytkownicy” następujące pola: „Data urodzenia” i dostępne role dla każdego użytkownika. prześlij to do różnych części tabelarycznych formularza. Oczywiście możesz to zrobić w jednym żądaniu, wtedy będziesz musiał iterować po rekordach lub je zwinąć, albo możesz to zrobić w ten sposób:

WYBIERZ Użytkownicy.Link AS Imię i nazwisko, Użytkownicy.Data urodzenia, Użytkownicy.Rola PUT vtUsers Z katalogu.Użytkownicy JAKO Użytkownicy; /////////////////////////////////////////////// ///////////////////////// WYBIERZ tueUsers.Imię i nazwisko, tueUsers.Data urodzenia Z tueUsers AS tueUsers GRUPA WG tueUsers.imię i nazwisko, tueUsers . Data urodzenia; /////////////////////////////////////////////// ///////////////////////// WYBIERZ wUsers.Imię i nazwisko, wUsers.Role FROM wUsers AS wUsers GRUPA WG wUsers.Imię i nazwisko, wUsers.Data Narodziny

tPackage = Żądanie.WykonajPakiet();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPakiet.Rozładuj();

Jak widzimy, zapytanie można wykonać wsadowo, a wynik można przetworzyć w postaci tablicy. W niektórych przypadkach jest to bardzo wygodne.

15. Warunki w żądaniu zbiorczym

Przykładowo mamy żądanie zbiorcze, gdzie najpierw pobieramy pola: „Imię, Data urodzenia, Kod” z katalogu „Użytkownicy” i chcemy uzyskać rekordy z warunkami dla tych pól z katalogu „Osoby fizyczne”.

WYBIERZ Users.Individual.Name AS Imię, Users.Individual.Date of Birth AS Data urodzenia, Users.Individual.Code AS Kod MIEJSCE vtUsers Z katalogu.Users AS Users; /////////////////////////////////////////////// ////////////////////////// WYBIERZ OSOBY. Link JAKO OSOBA Z katalogu. OSOBY JAKO INDYWIDUALNE.

Możesz narzucić takie warunki:

WHERE Individuals.Code IN (WYBIERZ vtUsers.Code FROM vtUsers) ORAZ Individuals.Name IN (WYBIERZ vtUsers.Code FROM vtUsers) ORAZ Individuals.BirthDate IN (WYBIERZ vtUsers.DateBirth FROM tvUsers)

A możesz to zrobić w ten sposób:

WHERE (Individuals.Code, Individuals.Name, Individuals.Date of Birth) IN (WYBIERZ wuUsers.Code, wtoUsers.Name, wtoUsers.Date of Birth FROM wuUsers)

Ponadto konieczne jest utrzymanie porządku.

16. Wywołanie konstruktora zapytań dla „warunku” w żądaniu wsadowym

Kiedy konieczne jest nałożenie warunku, jak w powyższym przykładzie, możesz zapomnieć, jak to czy tamto pole jest wywoływane w wirtualnej tabeli.
Na przykład musisz nałożyć warunek na pole „Data urodzenia”, a w wirtualnej tabeli to pole nazywa się „Data urodzenia dłużnika”, a jeśli zapomnisz imienia, będziesz musiał wyjść z edycji warunku bez zapisz i spójrz na nazwę pola. Aby tego uniknąć, możesz zastosować następującą technikę.

Należy wstawić nawiasy po konstrukcji „B” i pozostawić pomiędzy nawiasami pustą przestrzeń (spację), wybrać tę spację i wywołać konstruktor zapytań. Projektant będzie miał dostęp do wszystkich tabel zapytania wsadowego. Technika ta działa zarówno na wirtualnych tablicach rejestrowych, jak i na zakładce „Warunki”. W tym drugim przypadku należy zaznaczyć pole „P (warunek dowolny)” i wejść w tryb edycji „F4”.

Zapytania często były wymyślane na bieżąco i służyły jedynie zilustrowaniu „technik”, które rozważałem.

Chciałem przyjrzeć się wykorzystaniu indeksów w zapytaniach, ale jest to bardzo szeroki temat. Umieszczę to w osobnym artykule lub dodam tutaj później.

aktualizacja 1. Punkty 11,12
aktualizacja2. Punkty 13,14,15,16

Używane książki:
Język zapytań „1C:Enterprise 8” - E.Yu. Chrustalewa
Rozwój zawodowy w systemie 1C:Enterprise 8.”

Organizując próby w rzeczywistych problemach, w zdecydowanej większości przypadków dobór danych zorganizowany jest według określonych kryteriów.

W przypadku wyboru z rzeczywistej tabeli nie pojawiają się żadne trudności. Dane przetwarzane są w sposób absolutnie banalny:

W przypadku, gdy źródłem zapytania jest tabela wirtualna, sytuacja staje się nieco bardziej skomplikowana.


Język zapytań umożliwia nałożenie warunku na wybór z wirtualnych tabel na dwa sposoby: w klauzuli WHERE i przy użyciu parametrów tabeli wirtualnej. Obie metody doprowadzą do tego samego rezultatu (z wyjątkiem kilku konkretnych przypadków), ale mimo to nie są równoważne.

Wiemy już, że wirtualne tabele nazywane są wirtualnymi, ponieważ tak naprawdę nie ma ich w bazie danych. Tworzą się dopiero w momencie skierowania do nich prośby. Mimo to wygodnie jest nam (czyli piszącym zapytanie) uważać tabele wirtualne za rzeczywiste. Co stanie się w systemie 1C Enterprise 8, gdy skompilowane przez nas zapytanie nadal będzie miało dostęp do wirtualnej tabeli?

W pierwszym kroku system zbuduje wirtualną tabelę. W drugim kroku z wynikowej tabeli zostaną wybrane rekordy spełniające warunek określony w klauzuli WHERE:
Widać wyraźnie, że w ostatecznej próbie nie znajdą się wszystkie rekordy z tabeli wirtualnej (a co za tym idzie i z bazy), a jedynie te, które spełniają zadany warunek. Pozostałe rekordy zostaną po prostu wykluczone z wyniku.

W ten sposób system wykona nie tylko bezużyteczną pracę, ale podwójnie bezużyteczną pracę! W pierwszej kolejności zasoby zostaną przeznaczone na zbudowanie wirtualnej tabeli w oparciu o niepotrzebne dane (na rysunku są one oznaczone jako „obszary danych A i B”), a następnie zostanie wykonana praca nad odfiltrowaniem tych danych z wyniku końcowego.

Czy można od razu, na etapie konstruowania wirtualnej tabeli, zaprzestać wykorzystywania niepotrzebnych danych? Okazuje się, że jest to możliwe. Właśnie do tego służą parametry tabeli wirtualnej:

Parametryzując wirtualną tabelę, od razu ograniczamy ilość danych, które będą przetwarzane przez zapytanie.

Jaka jest różnica pomiędzy wartościami parametru tabeli wirtualnej „Metoda dodawania”?
Gdy Metoda dodawania jest ustawiona na „ruchy”, zwrócone zostaną tylko te okresy, w których wystąpiły ruchy. W przypadku ustawienia „Ruchów i granic okresów” do powyższych ruchów zostaną dodane 2 rekordy: ruchy na początku i na końcu okresu określonego w parametrach VT. Pole „Rejestrator” będzie puste dla tych 2 rekordów.

Informacje zaczerpnięte ze strony

Organizując próby w rzeczywistych problemach, w zdecydowanej większości przypadków dobór danych zorganizowany jest według określonych kryteriów.

W przypadku wyboru z rzeczywistej tabeli nie pojawiają się żadne trudności. Dane przetwarzane są w sposób absolutnie banalny:

W przypadku, gdy źródłem zapytania jest tabela wirtualna, sytuacja staje się nieco bardziej skomplikowana.

Język zapytań umożliwia nałożenie warunku na wybór z wirtualnych tabel na dwa sposoby: w klauzuli WHERE i przy użyciu parametrów tabeli wirtualnej. Obie metody doprowadzą do tego samego rezultatu (z wyjątkiem kilku konkretnych przypadków), ale mimo to nie są równoważne.

Wiemy już, że wirtualne tabele nazywane są wirtualnymi, ponieważ tak naprawdę nie ma ich w bazie danych. Tworzą się dopiero w momencie skierowania do nich prośby. Mimo to wygodnie jest nam (czyli piszącym zapytanie) uważać tabele wirtualne za rzeczywiste. Co stanie się w systemie 1C Enterprise 8, gdy skompilowane przez nas zapytanie nadal będzie miało dostęp do wirtualnej tabeli?

W pierwszym kroku system zbuduje wirtualną tabelę. W drugim kroku z wynikowej tabeli zostaną wybrane rekordy spełniające warunek określony w klauzuli WHERE:


Widać wyraźnie, że w ostatecznej próbie nie znajdą się wszystkie rekordy z tabeli wirtualnej (a co za tym idzie i z bazy), a jedynie te, które spełniają zadany warunek. Pozostałe rekordy zostaną po prostu wykluczone z wyniku.

W ten sposób system wykona nie tylko bezużyteczną pracę, ale podwójnie bezużyteczną pracę! W pierwszej kolejności zasoby zostaną przeznaczone na zbudowanie wirtualnej tabeli w oparciu o niepotrzebne dane (na rysunku są one oznaczone jako „obszary danych A i B”), a następnie zostanie wykonana praca nad odfiltrowaniem tych danych z wyniku końcowego.

Czy można od razu, na etapie konstruowania wirtualnej tabeli, zaprzestać wykorzystywania niepotrzebnych danych? Okazuje się, że jest to możliwe. Właśnie do tego służą parametry tabeli wirtualnej:


Parametryzując wirtualną tabelę, od razu ograniczamy ilość danych, które będą przetwarzane przez zapytanie.

Jaka jest różnica pomiędzy wartościami parametru tabeli wirtualnej „Metoda dodawania”?
Gdy Metoda dodawania jest ustawiona na „ruchy”, zwrócone zostaną tylko te okresy, w których wystąpiły ruchy. W przypadku ustawienia „Ruchów i granic okresów” do powyższych ruchów zostaną dodane 2 rekordy: ruchy na początku i na końcu okresu określonego w parametrach VT. Pole „Rejestrator” będzie puste dla tych 2 rekordów.

Wywołajmy okno dialogowe umożliwiające wprowadzenie parametrów wirtualnej tabeli PriceSliceLast i wskażmy, że okres zostanie przekazany w parametrze ReportDate. W tym celu zaznacz tę tabelę na liście Stoły i kliknij przycisk Opcje wirtualnego stołu. Następnie wybierz z tabel następujące pola:

    SprNomenklatura. Rodzic,

    CenyKawałek najnowszego.Cena.

Dołącz do lewego stołu

- Na zakładkę Znajomości: w polu Warunek łącza wartość wymiaru Nomenklatury rejestru informacyjnego musi być równa odwołaniu do elementu katalogu Nomenklatury. A także odznacz pole wyboru Wszystkie dla tabeli rejestrów i zaznacz je dla tabeli przeglądowej, ustawiając w ten sposób typ połączenia jako lewe połączenie dla tabeli przeglądowej:

Ryż. 13.15. Relacja między tabelami w zapytaniu

- Na zakładkę Warunki postawmy warunek wyboru elementów z katalogu Nomenklatura - wybrane elementy muszą odpowiadać typowi nomenklatury przekazanemu w parametrze żądania Typ Nomenklatury:

Ryż. 13.16. Warunki doboru elementów

- Na zakładkę Związki/aliasy: podaj alias pola Parent = Service Group oraz pola Link = Service. - Kliknij OK-

Następnie musisz edytować schemat układu danych, aby to zrobić na karcie Zasoby, kliknij przycisk dodać i wybierz zasób - Cena

- Na zakładkę Opcje ustaw wartość parametru Typ nomenklatury - Enumeration.Nomenclature Types.Service. Ponadto usuniemy ograniczenie dostępności parametru ReportDate. W polu Typ tego parametru ustaw skład daty - Data. Natomiast dla parametru Okres ustawiamy ograniczenie dostępności:

Ryż. 13.17. Opcje schematu układu

Ustawienia

- Przejdźmy do zakładki Ustawienia: Utwórzmy grupowanie na podstawie pola Grupa usług, określając typ grupowania Hierarchia.

Istnieją następujące typy hierarchii grupowania raportów: Bez hierarchii - w grupowaniu wyświetlane są tylko rekordy niehierarchiczne. Hierarchia — w grupowaniu wyświetlane są zarówno rekordy niehierarchiczne, jak i hierarchiczne. Tylko hierarchia — w grupowaniu wyświetlane są tylko rekordy hierarchiczne (nadrzędne). Wewnątrz tej grupy utworzymy kolejną, bez określania pola grupy. Na podzakładce Wybrane pola: określ pola wyjściowe Usługa i Cena:

Ryż. 13.18. Struktura i pola raportu

Na podzakładce Inny ustawienia, wykonamy następujące kroki:

Ryż. 13.19. Ustawienia wyświetlania sum ogólnych dla grupowania „Grupa usług”.

Ryż. 13.20. Konfigurowanie i wyświetlanie wyników raportu globalnego

Na koniec włączmy parametr Data raportu w ustawieniach użytkownika i ustawmy jego Tryb edycji na Szybki dostęp. Zamknijmy projektanta schematów kompozycji danych i w oknie edycji obiektu Lista usług przejdźmy do zakładki Podsystemy. Na liście podsystemów konfiguracyjnych zwróć uwagę na podsystemy Świadczenie usług i Księgowość.

    W 1C: tryb korporacyjny

Uruchommy 1C:Enterprise w trybie debugowania i przede wszystkim otwórzmy rejestr okresowy Ceny. Następnie przetestujemy raport.

Na przykładzie tego raportu sprawdziliśmy, w jaki sposób system kompozycji danych pozyskuje najnowsze wartości z rejestru informacji okresowych i jak wyświetlane są grupowania według hierarchii katalogów.

Jeśli moja publikacja była dla Ciebie przydatna, nie zapomnij dać jej plusa :-)

Oto rubrykator dla wszystkich zadań w kolekcji(strona zawierająca linki do wątków na forum dla każdego zadania)
http://chistov.spb.ru/forum/16-969-1

Cóż, teraz moje rozwinięcia i notatki, które stworzyłem w procesie przygotowawczym.
Postaram się jak najmniej powtarzać dwa powyższe ostatni publikacje.

Więc zacznijmy:


Jeśli zdajesz go zdalnie, na koniec egzaminu powinieneś mieć na pulpicie dwa obiekty:

1. Ostateczne załadowanie bazy informacji (plik dt)
2. Nota wyjaśniająca

Nie powinno być nic więcej, żadnych kopii pośrednich itp.

Pamiętaj, aby napisać notę ​​wyjaśniającą!
W przypadku niejasno sformułowanego zadania koniecznie napisz tam, że wybrałeś dokładnie taki a taki wariant rozwiązania.
Także w kluczowych miejscach kodu lepiej zostawić krótki komentarz, bez fanatyzmu, natomiast tam, gdzie egzaminator może mieć pytania, lepiej pisać.

Ale zostaniesz o tym poinformowany w instrukcji, którą otrzymasz do przeczytania przed egzaminem.
Po prostu lepiej wiedzieć wcześniej)


Używanie znaku ampersand w zapytaniach.

Czasami szybciej jest pisać na dodatkowej klawiaturze, niż zmieniać układ w tę i z powrotem, oszczędzając czas
& = Alt+38

*************************************************************************************************
Używanie TimePoint() w zapytaniach

W zapytaniach do rejestrów akumulacyjnych i księgowych jako parametru wirtualnej tabeli (kropki) należy stosować nie datę dokumentu, lecz parametr Moment, który w kodzie zdefiniowany jest następująco:

Moment =?(Tryb przekazywania = Tryb wysyłania dokumentu. Operacyjny, Nieokreślony, Moment czasu());

*************************************************************************************************
Podczas generowania przesunięć dokumentów według rejestru, już na samym początku procedury księgowania konieczne jest rozliczenie przesunięć bieżącego dokumentu według rejestru.

Kod to:

Movement.RegisterName.Write = True; Ruchy.Nazwa Rejestru.Wyczyść();

Możliwe, że w trakcie procesu konieczna będzie analiza zapisów z tego rejestru.
Aby więc analizując aktualne rekordy (stare, sprzed zmiany dokumentu) na pewno nie zostały one uwzględnione w próbie, możesz do powyższych dwóch linii dodać jeszcze jedną linię:

Ruch.Nazwa Rejestru. Zapis();

Lub, analizując zapisy, wyraźnie wskaż granicę, która nie obejmuje punktu w czasie bieżącego dokumentu.

Ale wszędzie po prostu wskazałem konstrukcję tych trzech linii:

Movement.RegisterName.Write = True; Ruchy.Nazwa Rejestru.Wyczyść(); Ruch.Nazwa Rejestru. Zapis();

*************************************************************************************************
Istnieją dwa sposoby blokowania danych, wybór między nimi zależy od zastosowanej metody - starej lub nowej:

1) Regularne kontrolowane blokowanie, stara metoda przetwarzania dokumentów (obiekt Data Blocking)

Ustaw, czy salda są najpierw sprawdzane, a następnie spisywane.
W przypadku gdy potrzebujemy jakichś informacji z rejestru aby utworzyć ruch.


Przykład:

W dokumencie - ilość, w rejestrze - ilość i kwota (koszt)
Z dokumentu wiemy więc ile towaru odpisujemy, ale koszt - nie.
Dowiemy się tego jedynie z rejestru, jednak aby mieć pewność, że nikt nie będzie zmieniał rejestru pomiędzy momentem otrzymania sald, a momentem zarejestrowania ruchów, musimy zablokować rejestr jeszcze przed odczytaniem sald.
Zatem w tym przypadku używany jest obiekt Data Locking. A przy jego tworzeniu bardziej poprawne jest wskazanie, jakimi wymiarami blokujemy kasę (na przykład w naszym przypadku - tylko pozycją określoną w dokumencie) - aby nie było zbędnych zamków i inny użytkownik mógł sprzedać inny przedmiot.


1. Ustaw blokadę za pomocą obiektu Data Lock
2. Przeczytaj resztę
3. Sprawdzamy możliwość odpisu
4. Tworzymy ruchy, np. odpisujemy towary
5. Po zaksięgowaniu dokumentu blokada zostaje automatycznie usunięta (blokada obowiązuje w ramach transakcji księgowania i jest usuwana automatycznie przez system). Oznacza to, że nie ma potrzeby specjalnego odblokowywania obiektu.

2) Nowa metodologia przetwarzania dokumentów (używając właściwości LockForChange = True)

Stosuje się go, jeśli do tworzenia ruchów nie potrzebujemy informacji z rejestrów, a możemy sprawdzić, czy przy odpisie nie weszliśmy na minus, jeśli po zaksięgowaniu spojrzymy na salda w rejestrze i zobaczymy, że są salda ujemne . W takim przypadku zrozumiemy, że odpisaliśmy za dużo i anulujemy operację odpisu.

Przykład:
Rozważmy operację sprzedaży produktu.
W dokumencie - ilość, w rejestrze - tylko ilość
Znamy więc ilość towaru z dokumentu.
Tworzymy ruchy o ilości określonej w dokumencie i rejestrujemy je. Następnie czytamy rejestr, przeglądamy salda i analizujemy, czy nie ma sald ujemnych. Jeśli tak, wyświetl błąd i ustaw Odmowa = Prawda.

Oznacza to, że kolejność jest następująca:
1. Aby poruszać się po rejestrze, ustaw właściwość BlockForChange = True
2. Tworzymy ruchy - odpisz towar
3. Nagraj ruchy
4. Przeczytaj rejestr i upewnij się, że nie ma sald ujemnych. Jeśli tak, to odpisali nadwyżkę, jeśli nie, wszystko jest w porządku.

Nie ma więc w tym przypadku potrzeby wskazywania, według jakich wymiarów potrzebujemy zablokować rejestr.
Po prostu ustawiamy właściwość BlockForChange na True przed zarejestrowaniem naszych ruchów, tworzymy ruchy i nagrywamy.
System sam zablokuje rejestr na czas rejestracji według potrzebnych pomiarów, po przeanalizowaniu tego co zarejestrowaliśmy.
Po zakończeniu blokada zostanie usunięta.

Ta opcja (druga) jest prostsza, nazywa się „nową metodologią przetwarzania dokumentów” i 1C zaleca korzystanie z niej, jeśli to możliwe, i odejmuje punkty, jeśli zostanie zastosowana pierwsza opcja, ale w niektórych przypadkach po prostu nie można jej zastosować, a pierwszej opcji wykorzystywany jest obiekt Data Locking (patrz przykład powyżej).

Zwracam również uwagę, że niezależnie od wybranej metody, mechanizmy należy oczyścić przed pracą z nimi (patrz poprzednie porady)

*************************************************************************************************
Blokowanie danych (metoda blokowania nr 1 z powyższego opisu)

Kontrolowane blokowanie jest wymagane tam, gdzie odczytywane są dane i na ich podstawie wykonywane są ruchy
Najszybszym sposobem uzyskania zarządzanego kodu blokady jest wejście w „Blokowanie danych”, wywołanie Asystenta składni i po prostu skopiowanie stamtąd przykładowego kodu. Następnie po prostu zmień ją na nazwę swojego rejestru i wymiary.

Wygląda to mniej więcej tak:

Blokada = NewDataLock; Element blokujący = Locking.Add("Rejestr akumulacji.GoodsInWarehouses"); LockElement.Mode = DataLockMode.Exclusive; BlockingElement.DataSource = PM; Element blokujący.UseFromDataSource("Nomenklatura", "Nomenklatura"); Zablokuj.Zablokuj();

*************************************************************************************************
Lepiej nazwać tabelaryczną część dokumentów po prostu „TC”

W 99% dokumentów występuje tylko jedna część tabelaryczna. Taka ujednolicona nazwa części tabelarycznych znacznie pomoże zaoszczędzić czas, ponieważ:
1) Bardzo krótko – pisz szybko
2) To samo dla wszystkich dokumentów, nie musisz pamiętać, jak się to nazywa podczas pisania kodu

*************************************************************************************************
Wynik zapytania należy sprawdzić pod kątem pustki przed pobraniem lub przesłaniem do specyfikacji technicznej.

Generalnie we wszystkich zadaniach stosowałem próbkowanie.

Próbkowanie jest bardziej optymalne dla systemu pod względem wydajności, ponieważ jest „wyostrzane” tylko do odczytu danych (w przeciwieństwie do TK).

Ale w każdym razie przed metodą Select() lepiej sprawdzić wynik zapytania pod kątem pustki, to jeszcze bardziej zmniejszy obciążenie systemu.

Wynik = Query.Run(); Jeśli nie Result.Empty() then Select = Result.Select(TravelQueryResult.ByGrouping); ...KoniecJeśli;

I na wypadek, gdybyśmy musieli uzyskać tylko jedną wartość z żądania
(przykładowo tylko metoda odpisu zgodna z polityką rachunkowości ustaloną na ten rok):

Wynik = Query.Run(); Jeśli nie jest to Result.Empty(), to wybierz = Result.Select(); Wybór.Następny(); Metoda odpisu kosztów = Próbka. Metoda odpisu kosztów; koniecJeśli;

*************************************************************************************************
Dokument „Operacja” dla zadania księgowego

Dla zadań księgowych konieczne jest utworzenie dokumentu operacji.

Wyłączamy dla niego całkowicie możliwość księgowania (we właściwościach „Wysłanie = Odmowa”), wskazujemy, że wykonuje ruchy w księdze księgowej i przeciągamy ruchy na formularz.

*************************************************************************************************
Szybkie przetwarzanie dokumentów:

Musi być dołączony:
W obszarze operacyjnym i księgowym. musi być włączone rozliczanie dokumentów (z wyjątkiem dokumentu „Operacja”, patrz poniżej).

Musi być wyłączony:
w zadaniach obliczeniowych nie ma to sensu w przypadku dokumentu płacowego.

Dla dokumentu „Operacja” należy całkowicie wyłączyć wysyłanie (we właściwościach dokumentu „Wysyłanie = Zabroń”),
ponieważ pisze, po prostu zapisuje dane bezpośrednio do rejestru podczas pisania.

*************************************************************************************************
Warunek w żądaniu w postaci „Albo określona nomenklatura, albo dowolna, jeśli nie została określona”

W zapytaniach pojawia się następujące zadanie: na przykład należy wybrać dokumenty z określoną nomenklaturą lub wszystkie dokumenty, jeśli nomenklatura nie jest określona.
Rozwiązuje się to za pomocą następującego warunku w samym żądaniu:

Nomenklatura = &Nomenklatura LUB &Nomenklatura = Wartość(Katalog.Nomenklatura.EmptyLink)

Ale bardziej optymalne i poprawne byłoby przekształcenie tego warunku (dzięki Yukon):


Request.Text = Request.Text + "GDZIE Nomenklatura = &Nomenklatura";

koniecJeśli;

Wraz z pojawieniem się modelu obiektów zapytań w wersji 8.3.5 możliwe będzie bezpieczniejsze dodawanie warunku:

Jeśli wartość została wypełniona (nomenklatura), to
Query1.Selection.Add("Element = &Nomenklatura");
Request.SetParameter("Nomenklatura", Nomenklatura);
koniecJeśli;

*************************************************************************************************
Łączenie tabel w zapytaniach:

Liczba rekordów ogółem nie zależy od tego, czy wyświetlane jest pole łączonej tabeli, zależy jedynie od skonfigurowanych relacji.
Oznacza to, że pole załączonej tabeli może nie zostać wyświetlone.

Jeśli chcesz dołączyć tabelę bez żadnych warunków, to w zakładce warunków po prostu wpisz warunek „TRUE”.
W tym przypadku tabela zostanie dokładnie złączona.

*************************************************************************************************
Korzystanie z planu typów cech (PVC):

1. Użyj jako mechanizmu opisu cech obiektów.

1.1. Tworzymy PCV. Będą to rodzaje cech (na przykład kolor, rozmiar, maksymalna prędkość itp.). W ustawieniach wybierz wszystkie możliwe typy wartości charakterystycznych i jeśli to konieczne, utwórz obiekt z punktu 1.2 i wskaż go również w ustawieniach.

1.2. Dla dodatkowych wartości PVC tworzymy podkatalog DodatkoweWartości Charakterystyki (lub po prostu Wartości Charakterystyki).
Będzie przechowywać cechy, jeśli nie znajdują się one w istniejących katalogach. Możemy go nie stworzyć, jeśli wszystkie potrzebne nam cechy znajdują się w istniejących katalogach lub wartości te mogą być reprezentowane przez elementarne typy danych. W ustawieniach PVC wskazujemy, że ten katalog będzie używany do dodatkowych celów. wartości cech.

1.3. Tworzymy rejestr informacyjny, który tak naprawdę łączy trzy obiekty:
- Obiekt, z którym łączymy mechanizm charakterystyk
- Typ Charakterystyka (typ PVC)
- Wartość cechy (typ - charakterystyka, jest to nowy typ, który pojawił się w systemie po utworzeniu PVC
i opisujące wszystkie możliwe typy danych, jakie może przyjmować wartość charakterystyczna).
W rejestrze informacyjnym wskazujemy, że Typ Charakterystyki jest właścicielem Wartości Charakterystycznej (link do parametru wyboru), a także połączenie typu dla Wartości Charakterystycznej, ponownie z Typu Charakterystyki.

Kolejną cechą jest to, że dla każdego utworzonego typu cechy można określić typ wartości cechy, jeśli nie są potrzebne wszystkie możliwe typy do opisania wartości tej cechy.

2. Wykorzystanie PVC do stworzenia mechanizmu sub-conto dla rejestru księgowego .

2.1. Tworzymy typy PVCSubconto.

2.2. Tworzymy katalog podrzędny ValuesSubConto (podobnie jak w przypadku charakterystyk będzie on zawierał wartości subconto jeśli takich nie ma w innych katalogach).

2.3. Komunikacja odbywa się za pomocą planu kont.

*************************************************************************************************
Zasoby rejestru księgowego:

Kwota - bilans,
Ilość - pozabilansowa i związana z cechą księgową Ilościowa

*************************************************************************************************
Wirtualne tabele rejestrów księgowych:

Obrót: obrót pojedynczego rachunku
ObrótDtKt: obrót pomiędzy dowolnymi dwoma rachunkami, czyli wszystkie te same transakcje w danym okresie.

*************************************************************************************************
Rachunek walutowy na rejestrach księgowych - jak wdrożyć:

W planie kont tworzymy atrybut księgowy „waluta”.
W księdze księgowej tworzymy dodatkowo:
- Wymiar walutowy (zakaz wartości pustych, pozycji pozabilansowych, atrybutu księgowego - waluta)
- zasób CurrencyAmount (pozabilansowe, atrybut księgowy - waluta, będzie przechowywać kwotę w walucie, czyli np. 100 $)
Wszystko.

Zatem struktura rejestru jest następująca:

Wymiary:
- Waluta
Zasoby
- Ilość
- Kwota (kwota w rublach)
- CurrencyAmount (kwota w walucie)

Zatem rachunkowość walutowa jest jedynie udoskonaleniem konwencjonalnej rachunkowości w Republice Białorusi, nie zmienia istoty na przykład kwoty zasobu
(tam jak zwykle kwota jest w rublach, niezależnie od tego, czy konto jest w walucie obcej, czy nie).
A jeśli funkcja księgowania walutowego jest wyłączona dla konta, to jest to zwykła struktura Republiki Białorusi (zasoby - tylko ilość i ilość).

*************************************************************************************************
Ustawiając parametry wirtualnej tabeli, aby uzyskać jej wycinek, nakładamy warunki na wymiary, a nie na zasoby.

W przeciwnym razie otrzymamy nie wycinek najnowszych, ale ostatni rekord z określoną wartością zasobu - może nie być on ostatnim w zbiorze wymiarów

*************************************************************************************************
Znaczenie zasobu i szczegóły w rejestrze obliczeniowym

W rejestrach obliczeniowych utworzenie zasobu umożliwia jego otrzymanie przy obliczaniu podstawy za pomocą tego rejestru.
I nawet proporcjonalnie do danego okresu wartość zasobu zostanie przeliczona (jeżeli okres bazowy nie pokrywa się z okresowością rejestru).

A wartość atrybutu jest dostępna tylko w tabeli rzeczywistej rejestru obliczeniowego, nie jest dostępna w tabelach wirtualnych.

*************************************************************************************************
Pole wyboru „Podstawowe” we właściwościach wymiaru rejestru obliczeniowego
Oznacza to, że z tego wymiaru w przyszłości zostanie uzyskana baza i służy do dodatkowego indeksowania wartości dla tego pola.

*************************************************************************************************
Podział okresu ważności urlopu według miesięcy przy ewidencjonowaniu kompletów wpisów do rejestru,
jeśli urlop jest określony w dokumencie w jednym wierszu przez kilka miesięcy jednocześnie w jednym wierszu:

StartDate of CurrentMonth = Początek miesiąca (TexLineMainAccruals.ActionPeriodStart); CurrentMonthEndDate = EndMonth(TexLineMainAccruals.ActionPeriodStart); Bieżący miesiąc = data; WhileDateStartCurrentMonth<= НачалоМесяца(ТекСтрокаОсновныеНачисления.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = Макс(ДатаНачалаТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияНачало); Движение.ПериодДействияКонец = КонецДня(Мин(ДатаОкончанияТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияКонец)); Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Сумма = 0; Движение.КоличествоДней = 0; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр; Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Дата, -3)); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(Дата, -1))); ДатаНачалаТекМесяца = НачалоМесяца(ДобавитьМесяц(ДатаНачалаТекМесяца, 1)); ДатаОкончанияТекМесяца = КонецМесяца(ДатаНачалаТекМесяца); КонецЦикла; КонецЕсли;

*************************************************************************************************
Tworzenie wykresu Gantta:

Na formularzu umieszczamy element typu „Wykres Gantta”, nazywamy go DG, następnie tworzymy polecenie „Generuj” i w module formularza wpisujemy:

&OnClient Procedura Generuj(polecenie) GenerateOnServer(); Koniec procedury &Na serwerze Procedura GenerateOn Server() DG.Clear(); DG.Update = Fałsz; Żądanie = Nowe żądanie("SELECT |BasicAccrualsActualActionPeriod.Employee, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodStart, |BasicAccrualsActualActionPeriod.Period ActionsEnd AS PeriodActionsEnd | FROM |Rejestr obliczeniowy.BasicAccruals.ActualPeriodActions AS BasicAccrualsActualPeriodActions |WHERE |BasicAccrualsActualPeriodActions.PeriodActions BETWEEN &StartDate ORAZ &DataZakończenia "); Query.SetParameter("DataPoczątkowa", Okres.DataPoczątkowa); Request.SetParameter("DataKońcowa", Okres.DataKońcowa); Wybierz = Query.Run().Wybierz(); Podczas gdy Selection.Next() Loop Point = DG.SetPoint(Selection.Employee); Seria = DG.SetSeries(Selection.CalculationType); Wartość = DG.GetValue(punkt, seria); Interwał = Wartość.Dodaj(); Interval.Start = Próbka.PeriodActionStart; Interval.End = Próbka.AkcjaPeriodEnd; Koniec cyklu; DG.Update = Prawda; Koniec procedury

Właściwie ważny jest dla nas tutaj tylko kod w pętli, reszta rzeczy jest pomocnicza, podałem właśnie całą implementację tego podzadania.
We wniosku ważne jest dla nas podanie pracownika, rodzaju płatności, daty rozpoczęcia i zakończenia okresu.
Kod jest w rzeczywistości bardzo prosty, łatwy do zapamiętania, nie przejmuj się, jeśli wydaje się uciążliwy

*************************************************************************************************
Przetwarzanie zapisów „odwrócenia” w zadaniach obliczeniowych:

W procedurze przetwarzania transakcji (moduł obiektowy) tworzymy wszystkie ruchy, a następnie jeśli są zapisy w innych okresach, otrzymujemy je w ten sposób
(system generuje je automatycznie - pomaga nam):

Dodawanie rekordów = Movements.MainAccruals.GetAddition(); // Nie ma potrzeby rejestrowania ruchów, aby uzyskać dodatek

Dla każdej linii technologicznej z cyklu uzupełnień rekordów
Record = Movements.MainAccruals.Add();
FillPropertyValues(Rekord, TechString);
Record.RegistrationPeriod = TechString.RegistrationPeriodReversal;
Record.ActionPeriodStart = TechString.ActionPeriodStartReverse;
Record.ActionPeriodEnd = TechString.ActionPeriodEndReversal;
Koniec cyklu

A przy obliczaniu rekordów wstaw czeki:

Jeśli TechMotion.Reversal To
CurrentMovement.Sum = - CurrentMovement.Amount;
koniecJeśli;

*************************************************************************************************
Jak ustalić, co obejmuje główne rozliczenia międzyokresowe, a co obejmuje dodatkowe rozliczenia międzyokresowe w zadaniach obliczeniowych.

Ale nie zawsze jest to w 100% jasne, zdarzają się też bardziej skomplikowane przypadki, choć jest ich całkiem sporo
(na przykład premia zależna od liczby dni roboczych w miesiącu - to jest ON).

Opłaty podstawowe:
Jeżeli rodzaj kalkulacji jest zależny od harmonogramu (czyli rejestru informacji z datami kalendarzowymi), to dotyczy opłat głównych.

Przykład O:
- Wynagrodzenie
- Coś, co jest obliczane na podstawie liczby dni pracy (i do tego trzeba skorzystać z harmonogramu): albo w okresie ważności (jak pensja), albo w okresie bazowym

Dodatkowe opłaty:
Co jest brane pod uwagę albo z naliczonej kwoty, albo czasu PRACY (a nie normy!), Lub w ogóle nie zależy - jest to dodatkowe. rozliczenia międzyokresowe.

Czyli: rozliczenia międzyokresowe, do obliczenia których stosuje się standard czasu (a może i fakt), to OH, a dla których rzeczywiste dane lub w ogóle nic nie są potrzebne, to DN.

Lub innymi słowy:

Jeżeli VR korzysta ze standardu czasu, wówczas dla VR należy uwzględnić okres ważności.

*************************************************************************************************
Dodano możliwość otwarcia wbudowanej sekcji pomocy „Praca z podręcznikami” w formie listy katalogu „Nomenklatura”.

Uruchom polecenie w formularzu:

&Na kliencie
Procedura Pomoc (polecenie)
OpenHelp("v8help://1cv8/EnterprWorkingWithCatalogs");
Koniec procedury

Linię przekroju definiujemy w następujący sposób:
Przejdź do informacji pomocy obiektu konfiguracyjnego (w konfiguratorze), wpisz słowo, wybierz je, przejdź do menu Elementy/Link i wybierz żądaną sekcję Pomocy 1C, po czym link zostanie wstawiony automatycznie. Wygląda to skomplikowanie, ale w praktyce jest łatwe.

*************************************************************************************************
Implementacja interakcji pomiędzy formularzami, np. selekcji:

1. Z aktualnego formularza otwórz żądany metodą „OpenForm()”, przekazując jako drugi parametr strukturę z parametrami (jeśli to konieczne). Trzeci parametr może przekazać link do tego formularza - ThisForm.

2. W otwartym formularzu, w procedurze obsługi „When CreatedOnServer()” możemy przechwycić parametry przekazane w kroku 1 poprzez „Parametry.[NazwaParametru]”. Formularz inicjujący otwarcie tego formularza będzie dostępny poprzez identyfikator „Właściciel” (jeśli oczywiście został podany w kroku 1).

A co najważniejsze, dostępne będą funkcje eksportu formularza właściciela. Oznacza to, że możemy wywołać funkcję eksportu formularza źródłowego i przekazać tam coś jako parametr w celu przetworzenia selekcji. I ta funkcja już wypełni to, co jest potrzebne w oryginalnej formie. Jest tylko jedno zastrzeżenie – nie można przekazywać tabeli wartości pomiędzy procedurami klienta, ale możemy umieścić ją w magazynie tymczasowym i po prostu przekazać adres VX, a następnie wyodrębnić go z VX.

*************************************************************************************************
Cykl życia parametrów formularza

Wszystkie parametry przekazane do formularza w momencie jego otwarcia widoczne są jedynie w procedurze „When CreateOnServer”.
Po utworzeniu wszystkie parametry zostają zniszczone i nie są już dostępne w formularzu.
Wyjątkiem są parametry zadeklarowane w edytorze formularzy z atrybutem „Key Parameter”.
Decydują o wyjątkowości formy.
Parametr ten będzie istniał tak długo, jak długo będzie istniał sam formularz.

*************************************************************************************************
Korzystanie z interfejsu Taxi

Podczas programowania możesz ustawić zwykły zarządzany interfejs 8.2 we właściwościach konfiguracji - dzięki temu wszystko będzie zauważalnie bardziej zwarte i znajome.
Jest to szczególnie prawdziwe, jeśli wynajmujesz zdalnie - rozdzielczość ekranu jest bardzo mała i nie da się nic zrobić z interfejsem „taksówki”.
Tylko nie zapomnij ponownie wpisać „Taxi”, kiedy skończysz!W przeciwnym razie egzaminator odejmie punkty!

*************************************************************************************************

PS: E Istnieją osobne standardowe podzadania, które są używane we wszystkich zadaniach i to właśnie te musisz umieć rozwiązać (na przykład spisywanie partiami, użycie PVC (cóż, to naprawdę rzadkie) i inne). I we wszystkich zadaniach są one po prostu powtarzane (gdzieś są jakieś podzadania, gdzie indziej, tylko w różnych kombinacjach). Co więcej, od dawna obiecywali wydanie nowego zbioru (jeśli jeszcze tego nie zrobili), w którym powinno być znacznie więcej problemów, czyli nie ma sensu zapamiętywać rozwiązań poszczególnych problemów, warto nauczyć się, jak je rozwiązywać rozwiąż poszczególne standardowe podzadania, wtedy rozwiążesz każdy problem.

PSS: Koledzy, jeśli ktoś ma inne przydatne informacje dotyczące przygotowania się do egzaminu i jego zdania, proszę pisać w komentarzach, a my uzupełnimy artykuł.