Połącz wyniki zapytania. Połącz wyniki zapytania Jak połączyć zapytania w jedno 1s

Język zapytań jest jednym z podstawowych mechanizmów 1C 8.3 dla programistów. Za pomocą zapytań można szybko uzyskać dowolne dane przechowywane w bazie danych. Jego składnia jest bardzo podobna do języka SQL, ale istnieją pewne różnice.

Główne zalety języka zapytań 1C 8.3 (8.2) w porównaniu z SQL:

  • dereferencja pól referencyjnych (zamienianie jednej lub więcej kropek na atrybuty obiektów);
  • praca z wynikami jest bardzo wygodna;
  • możliwość tworzenia wirtualnych tabel;
  • wniosek może być napisany zarówno w języku angielskim, jak i rosyjskim;
  • możliwość blokowania danych w celu uniknięcia impasu.

Wady języka zapytań w 1C:

  • w przeciwieństwie do SQL, w zapytaniach 1C nie pozwalają na zmianę danych;
  • brak procedur składowanych;
  • niemożność konwersji ciągu znaków na liczbę.

Rozważ nasz mini samouczek na temat podstawowych konstrukcji języka zapytań 1C.

Ze względu na fakt, że żądania w 1C pozwalają tylko na otrzymywanie danych, każde żądanie musi zaczynać się od słowa „WYBIERZ”. Po tym poleceniu wskazane są pola, z których chcesz uzyskać dane. W przypadku określenia „*” zostaną wybrane wszystkie dostępne pola. Miejsce, z którego będą pobierane dane (dokumenty, rejestry, katalogi itp.) jest wskazane po słowie „OD”.

W poniższym przykładzie nazwy całej nomenklatury są wybrane z podręcznika „Nomenklatura”. Po słowie „JAK” wskazane są aliasy (nazwy) tabel i pól.

WYBIERAĆ
Nomenclature.Name AS NameNomenclature
Z
Katalog Nomenklatura AS Nomenklatura

Obok polecenia „WYBIERZ” możesz określić słowa kluczowe:

  • RÓŻNY. Zapytanie wybierze tylko te wiersze, które różnią się co najmniej jednym polem (bez duplikatów).
  • PIERWSZY rz, Gdzie N– ilość wierszy od początku wyniku do wybrania. Najczęściej ta konstrukcja jest używana w połączeniu z sortowaniem (ORDER BY). Na przykład, gdy trzeba wybrać określoną liczbę najnowszych dokumentów według daty.
  • DOZWOLONY. Ten projekt pozwala wybrać z bazy danych tylko te rekordy, które są dostępne dla bieżącego użytkownika. W przypadku użycia tego słowa kluczowego użytkownik otrzyma komunikat o błędzie, jeśli spróbuje przeszukać rekordy, do których nie ma dostępu.

Tych słów kluczowych można używać razem lub osobno.

NA ZMIANĘ

Ta klauzula blokuje dane, aby uniknąć konfliktów. Zablokowane dane nie zostaną odczytane z innego połączenia do czasu zakończenia transakcji. W tej klauzuli możesz określić konkretne tabele, które chcesz zablokować. W przeciwnym razie wszystkie zostaną zablokowane. Projekt dotyczy tylko trybu automatycznego blokowania.

Najczęściej przy odbiorze sald stosowana jest klauzula „NA ZMIANĘ”. Rzeczywiście, gdy kilku użytkowników pracuje w programie w tym samym czasie, podczas gdy jeden otrzymuje salda, drugi może je zmienić. W takim przypadku wynikowe saldo nie będzie już prawidłowe. Jeśli zablokujesz dane za pomocą tej propozycji, to dopóki pierwszy pracownik nie otrzyma prawidłowego salda i nie wykona z nim wszystkich niezbędnych manipulacji, drugi pracownik będzie musiał czekać.

WYBIERAĆ
Wzajemne rozliczenia Pracownik,
Wzajemne rozliczenia Kwota Wzajemne rozliczenia Saldo
Z
Rejestr akumulacyjny Wzajemne rozliczenia Z pracownikami Salda JAKO Wzajemne rozliczenia
NA ZMIANĘ

GDZIE

Konstrukcja jest niezbędna do narzucenia dowolnej selekcji na wyładowanych danych. W niektórych przypadkach pozyskiwania danych z rejestrów bardziej zasadne jest zapisanie warunków selekcji w parametrach tablic wirtualnych. W przypadku użycia opcji „WHERE” wszystkie rekordy są uzyskiwane w pierwszej kolejności, a dopiero potem stosowana jest selekcja, co znacznie spowalnia zapytanie.

Poniżej przykładowa prośba o pozyskanie osób kontaktowych na określone stanowisko. Parametr wyboru ma następujący format: &ParameterName (nazwa parametru jest dowolna).

WYBÓR (PRZYKŁAD)

Konstrukcja umożliwia określenie warunków bezpośrednio w treści żądania.

W poniższym przykładzie pole „AdditionalField” będzie zawierać tekst w zależności od tego, czy dokument został zaksięgowany, czy nie:

WYBIERAĆ
WstępT&U.Link,
WYBÓR
GDY
WTEDY „Dokument wysłany!”
ELSE „Dokument nie został wysłany…”
END AS Dodatkowe pole
Z
Dokument.Odbiór TowaruUsługi AS Odbiór OWU

DOŁĄCZYĆ

Łączy dwie tabele za pomocą określonego warunku połączenia.

LEWY/PRAWY DOŁĄCZ

Istotą LEFT join jest to, że pierwsza określona tabela jest zajęta w całości, a druga jest do niej dołączona przez warunek połączenia. Jeśli w drugiej tabeli nie ma rekordów odpowiadających pierwszej tabeli, to NULL jest zastępowane jako ich wartości. Mówiąc najprościej, główną tabelą jest pierwsza określona tabela, a dane z drugiej tabeli (jeśli istnieje) są już zastąpione jej danymi.

Na przykład musisz uzyskać pozycje pozycji z dokumentów „Odbiór towarów i usług” oraz ceny z rejestru informacyjnego „Ceny pozycji”. W takim przypadku, jeśli cena dowolnej pozycji nie zostanie znaleziona, zamiast tego wstaw NULL. Wszystkie pozycje z dokumentu zostaną wybrane niezależnie od tego, czy mają cenę, czy nie.

WYBIERAĆ
Odbiór T&U Nomenklatura,
Ceny.Cena
Z
Dokument.Odbiór TowarówUsługi.Towary AS Odbiór OWU
POŁĄCZENIE WEWNĘTRZNE
ON Odbiór pytań i odpowiedzi. Nomenklatura = Ceny. Nomenklatura

W PRAWO wszystko jest dokładnie na odwrót.

PEŁNE POŁĄCZENIE

Ten typ łączenia różni się od poprzednich tym, że w wyniku zostaną zwrócone wszystkie rekordy zarówno pierwszej, jak i drugiej tabeli. Jeśli w pierwszej lub drugiej tabeli nie zostaną znalezione żadne rekordy dla określonego warunku połączenia, zamiast tego zostanie zwrócona wartość NULL.

W przypadku korzystania z pełnego łączenia w poprzednim przykładzie zostaną wybrane wszystkie pozycje pozycji z dokumentu Przyjęcie towarów i usług oraz wszystkie najnowsze ceny z rejestru Ceny pozycji. Wartości nie znalezionych rekordów, zarówno w pierwszej, jak iw drugiej tabeli, będą miały wartość NULL.

POŁĄCZENIE WEWNĘTRZNE

Różnica między łączeniem INNER a łączeniem FULL polega na tym, że jeśli rekord nie zostanie znaleziony w co najmniej jednej z tabel, zapytanie w ogóle go nie wyświetli. W rezultacie zostaną wybrane tylko te pozycje towarowe z dokumentu PZ, dla których istnieją wpisy w rejestrze informacyjnym Ceny pozycji, jeśli w poprzednim przykładzie zamienimy PEŁNY na WEWNĘTRZNY.

GRUPUJ WEDŁUG

Grupowanie w zapytaniach 1C umożliwia zwijanie wierszy tabeli (grupowanie pól) zgodnie z pewną wspólną cechą (grupowanie pól). Pola grupowania mogą być wyświetlane tylko przy użyciu funkcji agregujących.

Wynikiem następnego zapytania będzie lista typów artykułów wraz z ich maksymalnymi cenami.

WYBIERAĆ
,
MAX(cena.cena) jako cena
Z

GRUPUJ WEDŁUG
Ceny. Nomenklatura. Typ Nomenklatura

WYNIKI

W przeciwieństwie do grupowania, podczas korzystania z sum wyświetlane są wszystkie rekordy, a wiersze sum są już do nich dodane. Grupowanie wyświetla tylko uogólnione rekordy.

Wyniki można podsumować dla całej tabeli (za pomocą słowa kluczowego „OGÓLNE”), dla kilku pól, dla pól o strukturze hierarchicznej (słowa kluczowe „HIERARCHY”, „TYLKO HIERARCHIA”). Podczas podsumowania nie jest konieczne stosowanie funkcji agregujących.

Rozważmy przykład podobny do powyższego przy użyciu grupowania. W takim przypadku wynik zapytania zwróci nie tylko zgrupowane pola, ale także szczegółowe rekordy.

WYBIERAĆ
Ceny.Nomenklatura.Typ nomenklatury AS Rodzaj nomenklatury,
Ceny.Cena AS Cena
Z
RegisterInformation.PricesNomenclature.SliceLast AS Ceny
WYNIKI
MAKSYMALNA (cena)
PRZEZ
Nazewnictwo typów

MAJĄCY

Ten operator jest podobny do operatora WHERE, ale jest używany tylko w przypadku funkcji agregujących. Pola inne niż używane przez tego operatora muszą być pogrupowane. Operator „WHERE” nie ma zastosowania do funkcji agregujących.

W poniższym przykładzie wybierane są maksymalne ceny artykułów, jeśli przekraczają 1000, pogrupowane według typu artykułu.

WYBIERAĆ

MAX(cena.cena) jako cena
Z
RegisterInformation.PricesNomenclature.SliceLast AS Ceny
GRUPUJ WEDŁUG
Ceny. Nomenklatura. Typ Nomenklatura
MAJĄCY
MAX(ceny.cena) > 1000

SORTUJ WEDŁUG

Operator „ORDER BY” sortuje wynik zapytania. Aby upewnić się, że rekordy są wyprowadzane w spójnej kolejności, używana jest funkcja AUTO-ORDER. Typy pierwotne są sortowane zgodnie ze zwykłymi regułami. Typy odwołań są sortowane według identyfikatora GUID.

Przykład pobrania listy pracowników posortowanej według nazwiska:

WYBIERAĆ
Pracownicy.Nazwisko AS Nazwisko
Z
Katalog Pracownicy AS Pracownicy
SORTUJ WEDŁUG
Nazwa
AUTOMATYCZNE ZAMÓWIENIE

Inne konstrukcje języka zapytań 1C

  • ZJEDNOCZYĆ- wyniki dwóch zapytań w jednym.
  • ZJEDNOCZCIE WSZYSTKICH– podobny do JOIN, ale bez grupowania identycznych wierszy.
  • PUSTY STOLIK- czasami używane podczas łączenia zapytań w celu określenia pustej tabeli zagnieżdżonej.
  • UMIEŚCIĆ- tworzy tymczasową tabelę w celu optymalizacji złożonych zapytań 1C. Takie żądania są nazywane żądaniami wsadowymi.

Funkcje języka zapytań

  • PODŁAŃCUCH obcina ciąg z określonej pozycji o określoną liczbę znaków.
  • ROK… DRUGI pozwalają uzyskać wybraną wartość typu numerycznego. Parametrem wejściowym jest data.
  • POCZĄTEK I KONIEC OKRESU są używane podczas pracy z datami. Typ okresu (DZIEŃ, MIESIĄC, ROK itp.) jest określany jako parametr dodatkowy.
  • DODAJ pozwala dodawać lub odejmować od daty określony czas określonego typu (SEKUNDA, MINUTA, DZIEŃ itp.).
  • RÓŻNICA DATY określa różnicę między dwiema datami, określając typ wartości wyjściowej (DZIEŃ, ROK, MIESIĄC itp.).
  • JEST NASTĘPNY zastępuje brakującą wartość określonym wyrażeniem.
  • PREZENTACJA i PREZENTACJALINKI pobierz ciąg reprezentujący określone pole. Są one używane odpowiednio dla dowolnych wartości i tylko wartości referencyjnych.
  • TYP, TYP WARTOŚCI służą do określenia typu parametru wejściowego.
  • POŁĄCZYĆ jest logicznym operatorem porównania dla typu wartości atrybutu.
  • WYRAZIĆ służy do konwersji wartości na żądany typ.
  • DATA GODZINA pobiera wartość typu „Data” z wartości liczbowych (Rok, Miesiąc, Dzień, Godzina, Minuta, Sekunda).
  • OZNACZAJĄCY w żądaniu 1C służy do określenia predefiniowanych wartości - katalogów, wyliczeń, planów typów cech. Przykład użycia: " Gdzie LegalIndividual = Value(Enumeration.LegalIndividual.Individual)«.

Konstruktor zapytań

Aby tworzyć zapytania za pomocą 1C, istnieje bardzo wygodny wbudowany mechanizm - projektant zapytań. Zawiera następujące główne zakładki:

  • „Tabele i pola” – zawiera pola do wyboru oraz ich źródła.
  • „Linki” — opisuje warunki konstrukcji CONNECTION.
  • „Grupowanie” – zawiera opis konstrukcji grupowania oraz podsumowane przez nie pola.
  • „Warunki” – odpowiada za wybór danych w zapytaniu.
  • „Zaawansowane” – dodatkowe parametry zapytania, takie jak słowa kluczowe polecenia „WYBIERZ” itp.
  • „Joins / Aliases” - wskazane są możliwości łączenia tabel i ustawiane aliasy (konstrukcja „JAK”).
  • „Kolejność” – odpowiada za sortowanie wyniku zapytania.
  • „Suma” – podobna do zakładki „Grupowanie”, ale służy do konstrukcji „SUMY”.

Tekst samego żądania można wyświetlić, klikając przycisk „Zapytaj” w lewym dolnym rogu. W tej postaci można go poprawić ręcznie lub skopiować.


Konsola zapytań

Aby szybko wyświetlić wynik zapytania w trybie „Enterprise” lub debugować złożone zapytania, użyj . W nim zapisywany jest tekst zapytania, ustawiane są parametry i wyświetlany jest jego wynik.

Konsolę zapytań można pobrać na dysk ITS lub przez .

Jeśli pracujesz z pojedynczą tabelą, nie musisz używać łączenia. Zupełnie inaczej jest, gdy pracujesz z kilkoma tabelami i np. potrzebujesz uzyskać dane zarówno o zakupach, jak i sprzedaży towarów.

Zdanie służy do łączenia ZJEDNOCZYĆ. W rzeczywistości wyniki zapytań są łączone, to znaczy każde zapytanie zbiera dane niezależnie od siebie, a następnie wyniki te są łączone w jedno. I tylko na ostatnim zapytaniu wykonywane są inne operacje, na przykład porządkowanie i obliczanie sum.

Podczas łączenia zapytań wyniki są „sklejane w pionie”, to znaczy wiersze wyników pierwszego zapytania są umieszczane jako pierwsze, a następnie drugie.

Przejdźmy do ćwiczeń:
Kod 1C v 8.x WYBIERZ
Nomenklatura,
Ilość,
Suma
Z
Dokument.Pokwitowanie.Towary

ZJEDNOCZYĆ

WYBIERAĆ
Nomenklatura,
Ilość,
Suma
Z
Dokument.Pokwitowanie.Towary

Wynik tego zapytania jest następujący:
Nomenklatura Ilość Ilość
Papier A4 25 14 500
Naklejki 500 l 8 4 880
Plik przezroczysty 5 4 100
Zestaw biurowy 8 8 840

W efekcie otrzymamy dwie tabele, które zostaną ze sobą połączone. Trudno jest dostrzec, gdzie kończy się dokument przychodzący, a zaczyna dokument wychodzący. Ale zrobimy coś, żeby to zrozumieć:
Kod 1C v 8.x
WYBIERAĆ
Nomenklatura,
Ilość AS Ilość Przychodząca,
Kwota jako SumaDochodu,
0 JAK Ilość Zużycie,
0 JAKO SUMAKoszt
Z
Dokument.Pokwitowanie.Towary

ZJEDNOCZYĆ

WYBIERAĆ
Nomenklatura,
0 AS NumerPrzychodzące,
0 AS suma dochodów,
Ilość AS Ilość Wydatek,
Kwota AS SumExpense
Z
Dokument.Materiały eksploatacyjne.Towary

Jak widać z tekstu żądania, dla każdego dokumentu ustawiliśmy różne aliasy dla ilości i kwoty. Ponadto w miejsce tych pól, w których otrzymamy wartości kwoty i ilości, wstawimy zera. Jest to konieczne, aby puste wartości kwoty i kwoty zostały zastąpione zerami.

Papier A4 25 14 500
Naklejki 500 l 8 4 880
Plik przezroczysty 5 4 100
Zestaw biurowy 8 8 840
Zestaw biurowy 1 1 105
Teczka przezroczysta 1 820
Naklejki 500 l 1 610

Teraz musimy usunąć zduplikowane elementy z wyniku zapytania. Mamy dwa zapytania i jeśli zwiniemy każde z nich osobno, aby wykluczyć zduplikowane elementy, nie odniesiemy sukcesu. Dlatego doprowadzimy zapytanie do następującej postaci:
Kod 1C v 8.x
WYBIERAĆ
Nomenklatura,
SUMA(liczba dochodów) AS liczba dochodów,
SUMA(SumaDochodu) AS SumaDochodu,
SUM(liczba wydatków) AS kwota wydatków,
SUMA(SumaWydatków) AS SumaWydatków
Z

(WYBIERAĆ
Nomenklatura,
Ilość AS Ilość Przychodząca,
Kwota jako SumaDochodu,
0 JAK Ilość Zużycie,
0 JAKO SUMAKoszt
Z
Dokument.Pokwitowanie.Towary

ZJEDNOCZYĆ

WYBIERAĆ
Nomenklatura,
0 AS NumerPrzychodzące,
0 AS suma dochodów,
Ilość AS Ilość Wydatek,
Kwota AS SumExpense
Z
Document.Consumable.Products) AS NestedRequest

GRUPUJ WEDŁUG nomenklatury

Widzimy więc, że całe nasze zapytanie jest ujęte w nawiasy kwadratowe i nazwane jako NestedQuery. Ma to na celu pogrupowanie rekordów z obu podzapytań i wyeliminowanie zduplikowanych elementów. Taka konstrukcja nazywana jest zapytaniem zagnieżdżonym. Wynik tego zapytania jest następujący:
Nomenklatura QtyIncoming SumIncoming QtyExpense SumExpense
Papier A4 25 14 500
Naklejki 500 l 8 4 880 1 610
Zestaw biurowy 5 4 100 1 1 105
Plik przezroczysty 8 8 840 1 820

W efekcie otrzymujemy zgrupowaną tabelę, w której dane z zagnieżdżonych podzapytań są zredukowane do przejrzystej postaci. Liczba zagnieżdżonych zapytań nie powinna przekraczać 255. Użyliśmy tutaj czterech podzapytań.

Jeśli chcemy pozostawić w zapytaniu tylko unikalne wartości rekordów, bez stosowania grupowania. Należy napisać zdanie JOIN bez słowa kluczowego ALL.

Informacje zaczerpnięte z serwisu

; Podzapytania (w fazie rozwoju).

Odbiór towarów i usług I Zwrot towaru do dostawcy na określony okres.

Nowe zakładki: Związki/Aliasy.

Część teoretyczna lekcji nr 4

Query Builder 1c umożliwia tworzenie agregacji zapytań. Z ich pomocą można sekwencyjnie wyprowadzać dane uzyskane z kilku zapytań do wyniku bez użycia relacji. Jedynym warunkiem dołączenia jest ten sam zestaw pól w każdym pojedynczym zapytaniu.

W konstruktorze przejdź do zakładki Związki/Aliasy. Jest przeznaczony do tworzenia sprzężeń zapytań i ustawiania aliasów dla pól zapytań. Aliasy pól są potrzebne, jeśli nie znasz standardowych nazw pól bazy danych. Jeśli pole zapytania składa się tylko z pola tabeli bazy danych, alias nie jest dla niego wymagany. Jeśli podczas tworzenia pola użyłeś funkcji języka zapytań, wymagany jest alias dla takiego pola. Dla takich pól konstruktor zapytań tworzy standardowe aliasy Pole1…PoleN, aliasy te można zastąpić dowolnymi dogodnymi dla Ciebie.

Rozważ sekcje zakładki Związki / Aliasy:

  • Upraszanie(czerwona ramka). Ta sekcja zawiera tabelę, która pokazuje wszystkie połączone zapytania, korzystając z menu znajdującego się nad tą sekcją, możesz dodawać nowe, kopiować istniejące i usuwać wybrane, a także zamieniać je miejscami. Podczas dodawania lub kopiowania zapytania projektant przechodzi do zakładki Tabele i pola, w którym można ustawić tabele bazy danych i pola wymagane dla nowego zapytania. Możesz przełączać się między żądaniami za pomocą kart, które pojawią się po prawej stronie konstruktora w miarę dodawania nowych żądań 1;

  • Tabela Upraszanie dwie kolumny:
    • Nazwa. Ustaw automatycznie w formacie Żądanie 1 … Żądanie N;
    • Brak duplikatów. Ustaw, jeśli konieczne jest wykluczenie zduplikowanych wierszy podczas łączenia z poprzednim zapytaniem. Warto zauważyć, że ta flaga wpłynie tylko na unię żądania, w którym jest ustawiona, z poprzednim żądaniem.

  • Skróty(niebieska ramka). W tej sekcji możesz ustawić aliasy dla pól zapytań, a także dopasować pola dla zapytań złożonych, tak aby w wyniku zapytania znajdowały się w tej samej kolumnie i były wyświetlane pod tym samym aliasem. Jeśli pola w połączonych zapytaniach mają takie same nazwy, zgodność między nimi jest dostosowywana automatycznie. Aby ustawić zgodność pól, należy znaleźć wiersz z wymaganym aliasem w tabeli, znaleźć wymagane zapytanie w kolumnach i wybrać pole z rozwijanej listy.

Część praktyczna lekcji nr 4

Przeanalizujmy rozwiązanie problemu podane na początku lekcji. Przypominam warunki:

Zadanie: wybierz wszystkie opublikowane dokumenty według zapytania Odbiór towarów i usług I Zwrot towaru do dostawcy na określony okres.

  1. Utwórzmy nowe żądanie;
  2. Uruchommy kreator zapytań;
  3. Wybierzmy stół Usługi w zakresie towarów przychodzących z oddziału Dokumentacja;
  4. Ze stołu Usługi w zakresie towarów przychodzących wybierz pole Połączyć;
  5. Przejdźmy do zakładki Warunki;
  6. w rozdziale pola, otwórz oddział Usługi w zakresie towarów przychodzących za pomocą przycisku „+”;
  7. Znajdźmy rekwizyty data i przeciągnij go do sekcji warunków, wybierz operator porównania Między i określ np. parametry początku i końca okresu Początek okresu I Koniec okresu;
  8. Przejdźmy do zakładki Związki / Aliasy.
  9. Dodaj nowe żądanie, flaga Brak duplikatów nie ma potrzeby podnosić, ponieważ używamy różnych rodzajów dokumentów;

  10. Query Builder 1s automatycznie przejdzie do zakładki Tabele i pola. W prawej części okna zobaczysz, że druga prośba o dołączenie jest aktywna;


  11. Powtórzmy kroki 1 - 7 dla tabeli Zwrot towaru do Dostawcy;
  12. Wróćmy do zakładki. Związki / Aliasy. W tabeli aliasów widać, że pola Połączyć obie tabele znajdują się w tej samej linii, co oznacza, że ​​w wyniku zapytania linki do obu dokumentów znajdą się w tej samej kolumnie;
  13. Zmień nazwę kolumny z Połączyć NA Dokument(ustaw alias pola). W tym celu należy dwukrotnie kliknąć lewym przyciskiem myszy nazwę pola. Następnie możesz ustawić swoje imię, wprowadź tam Dokument;

  14. Żądanie jest gotowe, kliknij przycisk „OK” na dole okna projektanta.

W rezultacie otrzymamy zapytanie z następującym tekstem.

Zdarzają się sytuacje, kiedy konieczne jest połączenie kilku zapytań w jednym zapytaniu, a łączenia tabel w niczym nie pomogą. Najłatwiej pokazać to na przykładzie.

Załóżmy, że w naszym systemie fakty zakupu i sprzedaży towarów są rejestrowane odpowiednio w dokumentach Przychody i Wydatki. Kontrahentem może być zarówno nabywca, jak i dostawca. Potrącenia długu można dokonać poprzez dostawę towarów:

Aby obliczyć całkowite zadłużenie kontrahenta, należy zsumować sumę wszystkich wydatków dla tego kontrahenta i odjąć sumę wszystkich wpływów od tego samego kontrahenta, najłatwiej to zrobić za pomocą operatora UNITE ALL:

Żądanie.Tekst =
"
//oblicz ile wysłaliśmy do kontrahentów
|WYBIERZ
| Konsumpcja Kontrahent,
| OD
| Dokument.Wydatek AS Wydatki
|GRUPUJ WEDŁUG
| Konsumpcja Kontrahent
| DOŁĄCZ DO WSZYSTKICH
//oblicz liczbę kontrahentów
//dostarczył nam towar
|WYBIERZ
| Przyjazd.Kontrahent,
//weź kwotę ze znakiem ujemnym,
//że po połączeniu zostało to odjęte od kwoty wydatku
| SUMA(-Przychodząca.Kwota)
| OD
| Document.Incoming AS Incoming
|GRUPUJ WEDŁUG
| Przyjazd.Kontrahent";

W pierwszym wezwaniu obliczamy wysokość wydatków dla każdego kontrahenta, w drugim - kwotę, za jaką każdy z kontrahentów dostarczył nam towar. Kwota w drugim zapytaniu jest pobierana ze znakiem minus, aby po zwinięciu wynikowej tabeli została odjęta od kwoty wysyłki do tego kontrahenta. W rezultacie otrzymujemy tabelę postaci:

Nie jest to dokładnie to, czego chcieliśmy, ale jest blisko. Aby osiągnąć pożądany rezultat, pozostaje pogrupować według kontrahenta. W tym celu zapytanie musi zostać umieszczone w tabeli tymczasowej (praca z tabelami tymczasowymi została omówiona w zamknięta część kursu ) oraz wybierz i pogrupuj z niego pola:

Żądanie = Nowe żądanie;
Żądanie.Tekst =
"WYBIERAĆ
| Konsumpcja Kontrahent,
| AMOUNT(Wydatek.Kwota) AS Dług
|PUT TU_IncomeExpense
| OD
| Dokument.Wydatek AS Wydatki
|GRUPUJ WEDŁUG
| Konsumpcja Kontrahent
| DOŁĄCZ DO WSZYSTKICH
|WYBIERZ
| Przyjazd.Kontrahent,
| SUMA(-Przychodząca.Kwota)
| OD
| Document.Incoming AS Incoming
|GRUPUJ WEDŁUG
| Przyjazd.Wykonawca
|;
|////////////////////////////////////////////////////////////////////////////////
|WYBIERZ
| Tue_IncomingExpense.Kontrahent,
| SUM(BT_IncomeExpense.Debt) AS Dług
| OD
| Tue_IncomeExpense AS Tue_IncomeExpense
|GRUPUJ WEDŁUG
| Tue_IncomingExpense.Counterparty";

Wymagania dotyczące scalania zapytań

Przy łączeniu dwóch zapytań ilość pól w nich musi być taka sama, jeżeli w którymś z zapytań brakuje pól, to należy je dodać jako stałe. Spójrzmy na powyższy przykład, powiedzmy, że dokument rozchodowy ma również pole dyskonta, co zmniejsza zadłużenie kontrahenta, ale w dokumencie przychodowym nie ma dyskonta. Jak być w tym przypadku? Więc:

Żądanie = Nowe żądanie;
Żądanie.Tekst =
"WYBIERAĆ
| Konsumpcja Kontrahent,

| OD
| Dokument.Wydatek AS Wydatki
|GRUPUJ WEDŁUG
| Konsumpcja Kontrahent
| DOŁĄCZ DO WSZYSTKICH
|WYBIERZ
| Przyjazd.Kontrahent,
| SUMA(-Przychodząca.Kwota),
// dodaj zerową zniżkę dla pola
| 0
| OD
| Document.Incoming AS Incoming
|GRUPUJ WEDŁUG
| Przyjazd.Kontrahent";

Pozostaje odjąć rabat i grupę.

Kolejność też jest ważna. Pola zostaną połączone dokładnie w takiej kolejności, w jakiej zostały określone w sekcjach SELECT obu zapytań. W odniesieniu do poprzedniego przykładu zamieńmy polami rabat i kwota w wyborze paragonów:

Żądanie = Nowe żądanie;
Żądanie.Tekst =
"WYBIERAĆ
| Konsumpcja Kontrahent,
| AMOUNT(Wydatek.Kwota) AS Dług,
| SUMA(Wydatek.Rabat) AS Rabat
| OD
| Dokument.Wydatek AS Wydatki
|GRUPUJ WEDŁUG
| Konsumpcja Kontrahent
| DOŁĄCZ DO WSZYSTKICH
|WYBIERZ
| Przyjazd.Kontrahent,
//zamieniać
| 0,
| SUMA(-Przychodząca.Kwota)
| OD
| Document.Incoming AS Incoming
|GRUPUJ WEDŁUG
| Przyjazd.Kontrahent";

Dzień dobry, drodzy czytelnicy bloga. Dzisiaj omówimy szczegółowo łączenie żądań w 1C. Możesz również pobrać dla typowej konfiguracji Business Management for Kazachstan, wydanie 1.0.

Jeśli pracujesz z pojedynczą tabelą, nie musisz używać łączenia. Zupełnie inaczej sprawa wygląda, gdy pracujesz z kilkoma tabelami i np. potrzebujesz uzyskać dane o zakupach i sprzedaży towarów.

Zdanie służy do łączenia UNIA / UNIA. Co tak naprawdę się dzieje łączenie wyników zapytania, czyli każde zapytanie zbiera dane niezależnie od siebie, a następnie wyniki te są łączone w jedno. I tylko na ostatnim zapytaniu wykonywane są inne operacje, na przykład porządkowanie i obliczanie sum.

Inaczej niż w przypadku łączenia zapytań, wyniki są „sklejane w pionie”, co oznacza, że ​​wiersze wyników pierwszego zapytania są umieszczane jako pierwsze, a następnie drugie.

Przejdźmy do ćwiczeń:

WYBIERZ Nazewnictwo, Ilość, Kwota ZJEDNOCZYĆ WYBIERZ Nazewnictwo, Ilość, Kwota Z Dokument.Materiały eksploatacyjne.Towary

Wynik tego zapytania jest następujący:

W efekcie otrzymamy dwie tabele, które zostaną ze sobą połączone. Trudno jest dostrzec, gdzie kończy się dokument przychodzący, a zaczyna dokument wychodzący. Ale zrobimy coś, żeby to rozgryźć:

WYBIERZ Nazewnictwo, Ilość AS LiczbaPrikhod, Suma AS SumaPrikhod, 0 AS IlośćKoszt, 0 AS SumaWydatków Z Dokument.Przychodzące.Towary ZJEDNOCZYĆ LiczbaPrikhod, 0 AS SumaPrikhod, Numer AS IlośćKoszt, Suma AS SumaWydatków Z dokumentu.Materiały eksploatacyjne.Towary

Jak widać z tekstu żądania, dla każdego dokumentu ustawiliśmy różne aliasy dla ilości i kwoty. Ponadto w miejsce tych pól, w których otrzymamy wartości kwoty i ilości, wstawimy zera. Jest to konieczne, aby puste wartości kwoty i kwoty zostały zastąpione zerami.

Nomenklatura LiczbaPrikhod SumaPrikhod IlośćKoszt SumaWydatków
Papier A4 25 14 500
Naklejki 500l 8 4 880
Plik jest przezroczysty 5 4 100
Zestaw biurowy 8 8 840
Zestaw biurowy 1 1 105
Plik jest przezroczysty 1 820
Naklejki 500l 1 610

Teraz musimy usunąć zduplikowane elementy z wyniku zapytania. Mamy dwa zapytania i jeśli zwiniemy każde z nich osobno, aby wykluczyć zduplikowane elementy, nie odniesiemy sukcesu. Dlatego doprowadzimy zapytanie do następującej postaci:

WYBIERAĆ
Nomenklatura,
SUMA(liczba dochodów) AS liczba dochodów,
SUMA(SumaDochodu) AS SumaDochodu,
SUM(liczba wydatków) AS kwota wydatków,
SUMA(SumaWydatków) AS SumaWydatków
Z
(
WYBIERZ Nazewnictwo, Ilość AS LiczbaPrikhod, Suma AS SumaPrikhod, 0 AS IlośćKoszt, 0 AS SumaWydatków Z Dokument.Przychodzące.Towary ZJEDNOCZYĆ WYBIERZ Nazewnictwo, 0 AS LiczbaPrikhod, 0 AS SumaPrikhod, Numer AS IlośćKoszt, Suma AS SumaWydatków Z dokumentu.Materiały eksploatacyjne.Towary ) JAK Zagnieżdżone zapytanie
GRUPUJ WEDŁUG nomenklatury

Widzimy więc, że całe nasze zapytanie jest ujęte w nawiasy kwadratowe i nazwane jako NestedQuery. Ma to na celu pogrupowanie rekordów z obu podzapytań i wyeliminowanie zduplikowanych elementów. Taka konstrukcja nazywana jest zapytaniem zagnieżdżonym. Wynik tego zapytania jest następujący:

Nomenklatura LiczbaPrikhod SumaPrikhod IlośćKoszt SumaWydatków
Papier A4 25 14 500
Naklejki 500l 8 4 880 1 610
Zestaw biurowy 5 4 100 1 1 105
Plik jest przezroczysty 8 8 840 1 820

W efekcie otrzymujemy zgrupowaną tabelę, w której dane z zagnieżdżonych podzapytań są zredukowane do przejrzystej postaci.
Liczba zagnieżdżonych zapytań nie powinna przekraczać 255. Użyliśmy tutaj czterech podzapytań.