Spoji rezultate upita. Kombinirajte rezultate upita Kako kombinirati upite u jedan 1s

Jezik upita jedan je od temeljnih mehanizama 1C 8.3 za programere. Uz pomoć upita možete brzo dobiti sve podatke pohranjene u bazi podataka. Sintaksa mu je vrlo slična SQL-u, ali postoje neke razlike.

Glavne prednosti upitnog jezika 1C 8.3 (8.2) u odnosu na SQL:

  • dereferenciranje referentnih polja (pretvaranje jedne ili više točaka u atribute objekta);
  • rad s rezultatima je vrlo zgodan;
  • mogućnost stvaranja virtualnih tablica;
  • zahtjev se može napisati i na engleskom i na ruskom;
  • mogućnost blokiranja podataka kako bi se izbjegli zastoji.

Nedostaci jezika upita u 1C:

  • za razliku od SQL-a, u 1C upiti ne dopuštaju promjenu podataka;
  • nedostatak pohranjenih procedura;
  • nemogućnost pretvaranja niza u broj.

Razmotrite naš mini vodič o osnovnim konstrukcijama 1C upitnog jezika.

Zbog činjenice da zahtjevi u 1C omogućuju samo primanje podataka, svaki zahtjev mora započeti riječju "SELECT". Nakon ove naredbe naznačena su polja iz kojih želite dobiti podatke. Ako navedete "*", bit će odabrana sva dostupna polja. Mjesto odakle će se birati podaci (isprave, upisnici, imenici i sl.) navodi se iza riječi "OD".

U donjem primjeru nazivi cijele nomenklature odabrani su iz priručnika "Nomenklatura". Nakon riječi “KAKO” navedeni su aliasi (nazivi) za tablice i polja.

BIRAJTE
Nomenklatura.Naziv KAO NazivNomenklatura
IZ
Imenik Nomenklatura AS Nomenklatura

Uz naredbu "SELECT" možete odrediti ključne riječi:

  • RAZNO. Upit će odabrati samo retke koji se razlikuju u barem jednom polju (bez duplikata).
  • PRVI n, Gdje n– broj redaka od početka rezultata koji treba odabrati. Najčešće se ova konstrukcija koristi zajedno s sortiranjem (ORDER BY). Na primjer, kada trebate odabrati određeni broj najnovijih dokumenata po datumu.
  • DOZVOLJENO. Ovaj dizajn omogućuje odabir iz baze podataka samo onih zapisa koji su dostupni trenutnom korisniku. Ako se koristi ova ključna riječ, korisnik će primiti poruku o pogrešci ako pokuša postaviti upit o zapisima kojima nema pristup.

Ove se ključne riječi mogu koristiti zajedno ili zasebno.

ZA PROMJENU

Ova klauzula zaključava podatke kako bi se izbjegli sukobi. Zaključani podaci neće se čitati s druge veze do kraja transakcije. U ovoj klauzuli možete navesti određene tablice koje želite zaključati. U protivnom će svi biti blokirani. Dizajn je relevantan samo za način automatskog blokiranja.

Najčešće se koristi klauzula "FOR CHANGE" kod primanja stanja. Doista, kada nekoliko korisnika istovremeno radi u programu, dok jedan prima stanja, drugi ih može mijenjati. U tom slučaju rezultirajuća ravnoteža više neće biti točna. Ako blokirate podatke ovim prijedlogom, dok prvi zaposlenik ne dobije točnu ravnotežu i ne izvrši sve potrebne manipulacije s njim, drugi zaposlenik će morati pričekati.

BIRAJTE
Međusobni obračuni Zaposlenik,
Međusobni obračuni Iznos Međusobni obračuni Stanje
IZ
Registar akumulacija. Međusobni obračuni SA Zaposlenicima. Stanja KAO Međusobni obračuni
ZA PROMJENU

GDJE

Konstrukcija je neophodna za nametanje bilo kakvog odabira neučitanim podacima. U nekim slučajevima dobivanja podataka iz registara, razumnije je propisati uvjete odabira u parametrima virtualnih tablica. Kod korištenja "WHERE" prvo se dobivaju svi zapisi, a tek onda se primjenjuje odabir, što značajno usporava upit.

Slijedi primjer zahtjeva za dobivanje kontakt osoba s određenim položajem. Parametar odabira ima sljedeći format: &NazivParametra (naziv parametra je proizvoljan).

ODABIR (SLUČAJ)

Konstrukcija vam omogućuje da navedete uvjete izravno u tijelu zahtjeva.

U donjem primjeru, "AdditionalField" će sadržavati tekst ovisno o tome je li dokument objavljen ili ne:

BIRAJTE
Prijem T&U.Link,
IZBOR
KADA
ONDA "Dokument objavljen!"
ELSE "Dokument nije objavljen..."
END AS AdditionalField
IZ
Document.Primka RobeServices KAO PotvrdaT&C

PRIDRUŽITI

Spajanja povezuju dvije tablice određenim uvjetom veze.

LIJEVO/DESNO SPOJ

Bit LIJEVOG spajanja je da se prva navedena tablica u cijelosti uzme, a druga joj se pripoji prema uvjetu veze. Ako nema zapisa koji odgovaraju prvoj tablici u drugoj, tada se kao njihove vrijednosti zamjenjuje NULL. Jednostavno rečeno, glavna tablica je prva navedena tablica, a podaci druge tablice (ako postoje) već su zamijenjeni njezinim podacima.

Na primjer, potrebno je dobiti artiklne stavke iz dokumenata “Primka roba i usluga” i cijene iz informacijskog očevidnika “Cijene artikala”. U ovom slučaju, ako cijena bilo koje pozicije nije pronađena, umjesto toga zamijenite NULL. Sve stavke iz dokumenta bit će odabrane bez obzira imaju li cijenu ili ne.

BIRAJTE
Prijem nomenklature T&U,
Cijene.Cijena
IZ
Dokument. Potvrda o primitku robe. Usluge. Roba KAO potvrda o primitku T&C
UNUTARNJI SPOJ
ON Primanje pitanja i odgovora. Nomenklatura = Cijene. Nomenklatura

U DESNU je sve upravo suprotno.

POTPUNA POVEZANOST

Ova vrsta spajanja razlikuje se od prethodnih po tome što će svi zapisi i prve i druge tablice biti vraćeni kao rezultat. Ako u prvoj ili drugoj tablici nisu pronađeni zapisi za navedeni uvjet veze, umjesto toga će se vratiti NULL.

Pri korištenju potpunog spajanja u prethodnom primjeru bit će odabrane sve stavke stavki iz dokumenta Prijem robe i usluga i sve najnovije cijene iz registra cijena stavki. Vrijednosti zapisa koji nisu pronađeni, kako u prvoj tako iu drugoj tablici, bit će NULL.

UNUTARNJI SPOJ

Razlika između UNUTRAŠNJEG pridruživanja i POTPUNOG pridruživanja je u tome što ako zapis nije pronađen u barem jednoj od tablica, tada ga upit uopće neće prikazati. Kao rezultat toga, iz dokumenta Potvrda o primitku robe i usluga bit će odabrane samo one stavke stavki za koje postoje unosi u informacijskom registru Cijene stavki, ako u prethodnom primjeru FULL zamijenimo INTERNIM.

GRUPIRAJ PO

Grupiranje u 1C upitima omogućuje vam sažimanje redaka tablice (polja za grupiranje) prema određenoj zajedničkoj značajci (polja za grupiranje). Polja grupiranja mogu se prikazati samo pomoću agregatnih funkcija.

Rezultat sljedećeg upita bit će popis vrsta artikala s njihovim maksimalnim cijenama.

BIRAJTE
,
MAX(Cijena.Cijena) AS Cijena
IZ

GRUPIRAJ PO
Cijene.Nomenklatura.VrstaNomenklatura

REZULTATI

Za razliku od grupiranja, kada se koriste zbrojevi, prikazuju se svi zapisi i već su im dodani reci s ukupnim zbrojem. Grupiranje prikazuje samo generalizirane zapise.

Rezultate je moguće sažeti za cijelu tablicu (ključnom riječi "OPĆENITO"), za više polja, za polja s hijerarhijskom strukturom (ključne riječi "HIJERARHIJA", "SAMO HIJERARHIJA"). Kod zbrajanja nije potrebno koristiti agregatne funkcije.

Razmotrite primjer sličan gornjem primjeru koristeći grupiranje. U tom će slučaju rezultat upita vratiti ne samo grupirana polja, već i detaljne zapise.

BIRAJTE
Cijene.Nomenklatura. Vrsta nomenklature AS Vrsta nomenklature,
Cijene.Cijena KAO Cijena
IZ
RegisterInformation.PricesNomenclature.SliceLast AS Cijene
REZULTATI
MAKSIMALNO (cijena)
PO
Tipska nomenklatura

IMAJUĆI

Ovaj je operator sličan operatoru WHERE, ali se koristi samo za agregatne funkcije. Ostala polja osim onih koje koristi ovaj operator moraju biti grupirana. Operator "WHERE" nije primjenjiv za agregatne funkcije.

U donjem primjeru odabrane su maksimalne cijene artikala ako prelaze 1000, grupirane prema vrsti artikla.

BIRAJTE

MAX(Cijena.Cijena) AS Cijena
IZ
RegisterInformation.PricesNomenclature.SliceLast AS Cijene
GRUPIRAJ PO
Cijene.Nomenklatura.VrstaNomenklatura
IMAJUĆI
MAX(Cijene.Cijena) > 1000

SORTIRAJ PO

Operator "ORDER BY" sortira rezultat upita. Kako bi se osiguralo da se zapisi izlaze dosljednim redoslijedom, koristi se AUTO-ORDER. Primitivni tipovi sortirani su prema uobičajenim pravilima. Vrste referenci sortirane su prema GUID-u.

Primjer dobivanja popisa zaposlenika sortiranih po imenu:

BIRAJTE
Zaposlenici. Ime KAO Ime
IZ
Imenik Zaposlenici KAO Zaposlenici
SORTIRAJ PO
Ime
AUTO NARUDŽBA

Ostale konstrukcije 1C upitnog jezika

  • UJEDINITI- rezultati dvaju upita u jednom.
  • UJEDINITE SVE– slično JOIN-u, ali bez grupiranja identičnih redaka.
  • PRAZAN STOL- ponekad se koristi kada se spajaju upiti za navođenje prazne ugniježđene tablice.
  • STAVITI- stvara privremenu tablicu za optimizaciju složenih 1C upita. Takvi zahtjevi nazivaju se skupni zahtjevi.

Značajke jezika upita

  • PODNIZ skraćuje niz s određenog položaja za navedeni broj znakova.
  • GODINA...DRUGA omogućuju vam da dobijete odabranu vrijednost numeričkog tipa. Ulazni parametar je datum.
  • POČETAK RAZDOBLJA I KRAJ RAZDOBLJA koriste se pri radu s datumima. Vrsta razdoblja (DAN, MJESEC, GODINA itd.) navedena je kao dodatni parametar.
  • DODAJTE omogućuje vam dodavanje ili oduzimanje od datuma određenog vremena određene vrste (SEKUNDA, MINUTA, DAN itd.).
  • DATUMSKA RAZLIKA određuje razliku između dva datuma, navodeći vrstu izlazne vrijednosti (DAN, GODINA, MJESEC itd.).
  • NIJE NULL zamjenjuje vrijednost koja nedostaje navedenim izrazom.
  • PREZENTACIJA i PREZENTACIJALINKOVI dobiti string reprezentaciju navedenog polja. Koriste se za bilo koje vrijednosti i samo za referentne vrijednosti.
  • VRSTA, VRIJEDNOST VRSTA koriste se za određivanje tipa ulaznog parametra.
  • VEZA je logički operator usporedbe za tip vrijednosti atributa.
  • IZRAZITI koristi se za pretvaranje vrijednosti u željeni tip.
  • DATUM VRIJEME dobiva vrijednost tipa "Datum" iz numeričkih vrijednosti (godina, mjesec, dan, sat, minuta, sekunda).
  • ZNAČENJE u 1C zahtjevu koristi se za određivanje unaprijed definiranih vrijednosti - direktorija, popisivanja, planova za vrste karakteristika. Primjer upotrebe: " Gdje je LegalIndividual = Value(Enumeration.LegalIndividual.Individual)«.

Query Builder

Za izradu upita s 1C postoji vrlo zgodan ugrađeni mehanizam - dizajner upita. Sadrži sljedeće glavne kartice:

  • "Tablice i polja" - sadrži polja koja treba odabrati i njihove izvore.
  • "Veze" - opisuje uvjete za konstrukciju CONNECTION.
  • "Grupiranje" - sadrži opis konstrukcija grupiranja i njima sažetih polja.
  • "Uvjeti" - odgovoran je za odabir podataka u zahtjevu.
  • "Napredno" - dodatni parametri upita, kao što su ključne riječi naredbe "SELECT", itd.
  • “Joins / Aliases” - naznačene su mogućnosti spajanja tablica i postavljeni aliasi (konstrukt “KAKO”).
  • "Red" - odgovoran je za sortiranje rezultata upita.
  • "Ukupno" - slično kartici "Grupiranje", ali se koristi za konstrukciju "UKUPNO".

Tekst samog zahtjeva možete pogledati klikom na gumb "Zahtjev" u donjem lijevom kutu. U ovom obliku može se ispraviti ručno ili kopirati.


Konzola upita

Za brzi pregled rezultata upita u načinu rada "Enterprise" ili za otklanjanje pogrešaka složenih upita koristite . U njemu se upisuje tekst upita, postavljaju se parametri i prikazuje njegov rezultat.

Konzolu upita možete preuzeti na ITS disku ili putem .

Ako radite s jednom tablicom, tada ne morate koristiti spajanje. Sasvim je druga stvar kada radite s više tablica i npr. trebate dobiti podatke o kupnji i prodaji robe.

Rečenica se koristi za spajanje UJEDINITI. Naime, rezultati upita se kombiniraju, odnosno svaki upit prikuplja podatke neovisno jedan o drugom, a zatim se ti rezultati spajaju u jedan. I tek na zadnjem upitu izvode se druge operacije, na primjer, naručivanje i izračun ukupnih iznosa.

Kod kombiniranja upita rezultati su "okomito zalijepljeni", odnosno prvi idu redovi rezultata prvog upita, a zatim drugog.

Prijeđimo na praksu:
Kod 1C v 8.x SELECT
Nomenklatura,
Količina,
Iznos
IZ
Dokument.Potvrda.Roba

UJEDINITI

BIRAJTE
Nomenklatura,
Količina,
Iznos
IZ
Dokument.Potvrda.Roba

Rezultat ovog upita je sljedeći:
Nomenklatura Količina Iznos
Papir A4 25 14 500
Naljepnice 500 l 8 4 880
Turpija prozirna 5 4 100
Uredski set 8 8 840

Kao rezultat toga, dobit ćemo dvije tablice koje će biti povezane jedna s drugom. Teško je vidjeti gdje završava dolazni, a počinje odlazni dokument. Ali učinit ćemo nešto da to razumijemo:
Kod 1C v 8.x
BIRAJTE
Nomenklatura,
Količina KAO QtyIncoming,
Iznos KAO SumIncome,
0 KAKO Količina Potrošnja,
0 KAO SUM Trošak
IZ
Dokument.Potvrda.Roba

UJEDINITI

BIRAJTE
Nomenklatura,
0 AS Broj Dolazni,
0 AS SumIncome,
Količina KAO Trošak količine,
Iznos KAO SumExpense
IZ
Dokument.Potrošni materijal.Roba

Kao što možete vidjeti iz teksta zahtjeva, postavili smo različite pseudonime za svaki dokument za količinu i iznos. Također, umjesto onih polja u kojima ćemo primiti vrijednosti iznosa i količine, stavit ćemo nule. Ovo je neophodno kako bi se prazne vrijednosti iznosa i iznosa zamijenile nulama.

Papir A4 25 14 500
Naljepnice 500 l 8 4 880
Turpija prozirna 5 4 100
Uredski set 8 8 840
Uredski set 1 1 105
Prozirna datoteka 1 820
Naljepnice 500 l 1 610

Sada moramo ukloniti duple elemente iz rezultata upita. Imamo dva upita i ako sažmemo svaki zasebno kako bismo isključili duple elemente, nećemo uspjeti. Stoga ćemo upit dovesti u sljedeći obrazac:
Kod 1C v 8.x
BIRAJTE
Nomenklatura,
SUM (Broj prihoda) AS Broj prihoda,
SUM(SumIncome) KAO SumIncome,
SUM(broj troškova) KAO iznos troškova,
SUM(SumExpense) KAO SumExpense
IZ

(ODABERITE
Nomenklatura,
Količina KAO QtyIncoming,
Iznos KAO SumIncome,
0 KAKO Količina Potrošnja,
0 KAO SUM Trošak
IZ
Dokument.Potvrda.Roba

UJEDINITI

BIRAJTE
Nomenklatura,
0 AS Broj Dolazni,
0 AS SumIncome,
Količina KAO Trošak količine,
Iznos KAO SumExpense
IZ
Document.Consumable.Products) AS NestedRequest

GRUPIRAJ PO Nomenklaturi

Dakle, vidimo da je cijeli naš upit zatvoren u zagrade i nazvan NestedQuery. To je učinjeno kako bismo mogli grupirati zapise iz oba podupita i eliminirati duple elemente. Takva se konstrukcija naziva ugniježđeni upit. Rezultat ovog upita je sljedeći:
Nomenklatura QtyIncoming SumIncoming QtyExpense SumExpense
Papir A4 25 14 500
Naljepnice 500 l 8 4 880 1 610
Uredski set 5 4 100 1 1 105
Turpija prozirna 8 8 840 1 820

Kao rezultat toga dobivamo grupiranu tablicu u kojoj su podaci iz ugniježđenih podupita svedeni na jasan oblik. Broj ugniježđenih upita ne smije premašiti 255. Ovdje smo upotrijebili četiri podupita.

Ako želimo ostaviti samo jedinstvene vrijednosti zapisa u upitu, bez korištenja grupiranja. Potrebno je napisati rečenicu JOIN bez ključne riječi SVE.

Informacije preuzete sa stranice

; Podupiti (u razvoju).

Prijem robe i usluga I Povrat robe dobavljaču za navedeno razdoblje.

Nove kartice: Unije/pseudonimi.

Teorijski dio lekcije broj 4

Query Builder 1c omogućuje stvaranje agregacija upita. Uz njihovu pomoć možete uzastopno ispisati podatke dobivene iz nekoliko upita u rezultat bez korištenja odnosa. Jedini uvjet za pridruživanje je isti skup polja u svakom pojedinom upitu.

U konstruktoru idite na karticu Unije/pseudonimi. Namijenjen je stvaranju spojeva upita i postavljanju aliasa za polja upita. Aliasi polja su potrebni ako vam standardni nazivi polja baze podataka ne odgovaraju. Ako se polje upita sastoji samo od polja tablice baze podataka, tada za njega nije potreban alias. Ako ste prilikom stvaranja polja koristili funkcije jezika upita, tada je potreban pseudonim za takvo polje. Za takva polja alat za sastavljanje upita stvara standardne aliase Polje1…PoljeN, ovi aliasi se mogu zamijeniti s onim što vama odgovara.

Razmotrite dijelove kartice Unije / aliasi:

  • Zahtjevi(crveni okvir). Ovaj odjeljak sadrži tablicu koja prikazuje sve kombinirane upite, koristeći izbornik koji se nalazi iznad ovog odjeljka, možete dodati nove, kopirati postojeće i izbrisati odabrane, kao i zamijeniti ih. Prilikom dodavanja ili kopiranja upita, dizajner ide na karticu Tablice i polja, gdje možete postaviti tablice baze podataka i potrebna polja za novi upit. Možete se prebacivati ​​između zahtjeva pomoću kartica koje će se pojaviti na desnoj strani konstruktora kada se dodaju novi 1s zahtjevi;

  • Stol Zahtjevi dva stupca:
    • Ime. Postavite automatski u formatu Zahtjev 1 … Zahtjev N;
    • Nema duplikata. Postavite ako je potrebno izuzeti duple retke prilikom povezivanja s prethodnim upitom. Vrijedno je napomenuti da će ova oznaka utjecati samo na uniju zahtjeva u kojem je postavljena s prethodnim zahtjevom.

  • Aliasi(plavi okvir). U ovom odjeljku možete postaviti pseudonime za polja upita, kao i podudarati polja za kombinirane upite tako da u rezultatu upita budu u istom stupcu i prikazana pod istim pseudonima. Ako su polja u kombiniranim upitima nazvana isto, tada se podudarnost između njih automatski prilagođava. Da biste podesili korespondenciju polja, morate pronaći redak sa traženim aliasom u tablici, pronaći traženi upit u stupcima i odabrati polje na padajućem popisu.

Praktični dio lekcije broj 4

Analizirajmo rješenje zadatka zadanog na početku lekcije. Da vas podsjetim na uvjete:

Zadatak: odabrati sve knjižene dokumente po upitu Prijem robe i usluga I Povrat robe dobavljaču za navedeno razdoblje.

  1. Kreirajmo novi zahtjev;
  2. Pokrenimo alat za sastavljanje upita;
  3. Izaberimo stol Usluge dolazne robe iz grane Dokumentacija;
  4. Sa stola Usluge dolazne robe izabrati polje Veza;
  5. Idemo na karticu Uvjeti;
  6. U poglavlju polja, otvori poslovnicu Usluge dolazne robe pomoću gumba "+";
  7. Pronađimo rekvizite datum i povucite ga u odjeljak s uvjetima, odaberite operator usporedbe Između i odredite parametre za početak i kraj razdoblja, na primjer Početak razdoblja I Završno razdoblje;
  8. Idemo na karticu Unije / aliasi.
  9. Dodajte novi zahtjev, označite Nema duplikata nema potrebe za podizanjem, jer koristimo različite vrste dokumenata;

  10. Query Builder 1s automatski će otići na karticu Tablice i polja. U desnom dijelu prozora vidjet ćete da je drugi zahtjev za pridruživanje aktivan;


  11. Ponovimo korake 1 - 7, za tablicu Povrat robe dobavljaču;
  12. Vratimo se kartici. Unije / aliasi. U tablici pseudonima možete vidjeti da polja Veza obje tablice su u istoj liniji, što znači da će veze na oba dokumenta biti u istom stupcu kao rezultat upita;
  13. Promijenite naziv stupca iz Veza na Dokument(postavite pseudonim polja). Da biste to učinili, dvaput kliknite na naziv polja lijevom tipkom miša. Zatim možete postaviti svoje ime, unijeti ga Dokument;

  14. Zahtjev je spreman, kliknite gumb "U redu" na dnu prozora dizajnera.

Kao rezultat, dobit ćemo zahtjev sa sljedećim tekstom.

Postoje situacije kada je potrebno kombinirati više upita u jednom upitu, a spajanje tablica nikako ne može pomoći. Najlakše je pokazati na primjeru.

Pretpostavimo da su u našem sustavu činjenice kupnje i prodaje robe registrirane dokumentima Prihodi odnosno Rashodi. Protustrana strana može biti i kupac i dobavljač. Prijeboj duga može se izvršiti isporukom robe:

Za izračun ukupnog duga druge ugovorne strane potrebno je zbrojiti zbroj svih troškova te druge ugovorne strane i oduzeti zbroj svih primitaka od iste druge ugovorne strane, a to ćete najlakše učiniti pomoću operatora UNITE ALL:

Zahtjev.Tekst =
"
//izračunajte koliko smo otpremili drugim ugovornim stranama
|ODABIRAJTE
| Potrošnja. Suprotna strana,
| OD
| Dokument.Troškovi KAO Troškovi
|GRUPIRAJ PO
| Potrošnja.Druga strana
| PRIDRUŽITE SE SVIMA
//izračunajte iznos protustranaka
//isporučio nam robu
|ODABIRAJTE
| Dolazak. Izvođač,
//uzmite iznos s negativnim predznakom,
//da je, kada se kombinira, odbijen od iznosa rashoda
| SUM(-Dolazni.Iznos)
| OD
| Document.Incoming AS Incoming
|GRUPIRAJ PO
| Dolazak.Izvođač radova";

U prvom zahtjevu izračunavamo iznos troškova za svaku drugu ugovornu stranu, u drugom - iznos za koji nam je svaka od ugovornih strana isporučila robu. Iznos u drugom upitu uzima se s predznakom minus, tako da bi se, kada se rezultirajuća tablica sažme, oduzeo od iznosa otpreme ovoj drugoj strani. Kao rezultat toga dobivamo tablicu oblika:

Nije baš ono što smo htjeli, ali je blizu. Da bi se postigao željeni rezultat, ostaje grupirati prema drugoj strani. Da biste to učinili, upit se mora smjestiti u privremenu tablicu (o radu s privremenim tablicama govori se u zatvoreni dio tečaja ) i odaberite i grupirajte polja iz njega:

Zahtjev = Novi zahtjev;
Zahtjev.Tekst =
„IZABIRAJ
| Potrošnja. Suprotna strana,
| AMOUNT(Iznos.Iznos) KAO Dug
|PUT TU_PrihodiRaškovi
| OD
| Dokument.Troškovi KAO Troškovi
|GRUPIRAJ PO
| Potrošnja.Druga strana
| PRIDRUŽITE SE SVIMA
|ODABIRAJTE
| Dolazak. Izvođač,
| SUM(-Dolazni.Iznos)
| OD
| Document.Incoming AS Incoming
|GRUPIRAJ PO
| Dolazak.Izvođač
|;
|////////////////////////////////////////////////////////////////////////////////
|ODABIRAJTE
| Tue_IncomingExpense.Counterparty,
| SUM(BT_PrihodRaškovi.Dug) AS Dug
| OD
| Uto_PrihodiExpense KAO Uto_IncomeExpense
|GRUPIRAJ PO
| Tue_IncomingExpense.Counterparty";

Zahtjevi za spajanje upita

Kada se kombiniraju dva upita, broj polja u njima mora biti isti, ako nekom od upita nedostaju polja, tada se moraju dodati kao konstante. Pogledajmo gornji primjer, recimo da i rashodna isprava ima polje za popust, čime se umanjuje zaduženje druge ugovorne strane, ali u rashodnoj listi nema popusta. Kako biti u ovom slučaju? Tako:

Zahtjev = Novi zahtjev;
Zahtjev.Tekst =
„IZABIRAJ
| Potrošnja. Suprotna strana,

| OD
| Dokument.Troškovi KAO Troškovi
|GRUPIRAJ PO
| Potrošnja.Druga strana
| PRIDRUŽITE SE SVIMA
|ODABIRAJTE
| Dolazak. Izvođač,
| SUM(-Dolazni.Iznos),
// dodaj popust za nulto polje
| 0
| OD
| Document.Incoming AS Incoming
|GRUPIRAJ PO
| Dolazak.Izvođač radova";

Ostalo je oduzeti popust i grupa.

Redoslijed je također važan. Polja će se kombinirati točno redoslijedom kojim su navedena u odjeljcima SELECT oba upita. S obzirom na prethodni primjer, zamijenimo polja popust i iznos u odabiru računa:

Zahtjev = Novi zahtjev;
Zahtjev.Tekst =
„IZABIRAJ
| Potrošnja. Suprotna strana,
| AMOUNT(Troškovi.Iznos) KAO Dug,
| SUM(Troškovi.Popust) AS Popust
| OD
| Dokument.Troškovi KAO Troškovi
|GRUPIRAJ PO
| Potrošnja.Druga strana
| PRIDRUŽITE SE SVIMA
|ODABIRAJTE
| Dolazak. Izvođač,
//zamjena
| 0,
| SUM(-Dolazni.Iznos)
| OD
| Document.Incoming AS Incoming
|GRUPIRAJ PO
| Dolazak.Izvođač radova";

Dobar dan, dragi čitatelji bloga. Danas ćemo detaljno razgovarati kombiniranje zahtjeva u 1C. Također možete preuzeti tipičnu konfiguraciju Business Management za Kazahstan, izdanje 1.0.

Ako radite s jednom tablicom, tada ne morate koristiti spajanje. Sasvim je druga stvar kada radite s više tablica i npr. trebate dobiti podatke o kupnji i prodaji robe.

Rečenica se koristi za spajanje UNIJA / UNIJA. Što se zapravo događa kombiniranje rezultata upita, odnosno svaki upit prikuplja podatke neovisno jedan o drugom, a zatim se ti rezultati spajaju u jedan. I tek na zadnjem upitu izvode se druge operacije, na primjer, naručivanje i izračun ukupnih iznosa.

Za razliku od kombiniranja upita, rezultati su “okomito zalijepljeni”, odnosno prvi idu redovi rezultata prvog upita, a zatim drugog.

Prijeđimo na praksu:

SELECT Nomenklatura, količina, iznos UJEDINITI ODABERITE Nomenklaturu, količinu, iznos iz dokumenta.Potrošni materijal.Roba

Rezultat ovog upita je sljedeći:

Kao rezultat toga, dobit ćemo dvije tablice koje će biti povezane jedna s drugom. Teško je vidjeti gdje završava dolazni, a počinje odlazni dokument. Ali učinit ćemo nešto da to shvatimo:

SELECT Nomenklatura, količina AS BrojPrihod, Zbroj AS SumPrikhod, 0 AS QtyExpense, 0 AS SumExpense FROM Document.Incoming.Goods UJEDINITI BrojPrihod, 0 AS SumPrikhod, Broj AS QtyExpense, Zbroj AS SumExpense FROM Dokument.Potrošni materijal.Roba

Kao što možete vidjeti iz teksta zahtjeva, postavili smo različite pseudonime za svaki dokument za količinu i iznos. Također, umjesto onih polja u kojima ćemo primiti vrijednosti iznosa i količine, stavit ćemo nule. Ovo je neophodno kako bi se prazne vrijednosti iznosa i iznosa zamijenile nulama.

Nomenklatura BrojPrihod SumPrikhod QtyExpense SumExpense
A4 papir 25 14 500
Naljepnice 500l 8 4 880
Datoteka je prozirna 5 4 100
Uredski set 8 8 840
Uredski set 1 1 105
Datoteka je prozirna 1 820
Naljepnice 500l 1 610

Sada moramo ukloniti duple elemente iz rezultata upita. Imamo dva upita i ako sažmemo svaki zasebno kako bismo isključili duple elemente, nećemo uspjeti. Stoga ćemo upit dovesti u sljedeći obrazac:

BIRAJTE
Nomenklatura,
SUM (Broj prihoda) AS Broj prihoda,
SUM(SumIncome) KAO SumIncome,
SUM(broj troškova) KAO iznos troškova,
SUM(SumExpense) KAO SumExpense
IZ
(
SELECT Nomenklatura, količina AS BrojPrihod, Zbroj AS SumPrikhod, 0 AS QtyExpense, 0 AS SumExpense FROM Document.Incoming.Goods UJEDINITI SELECT Nomenklatura, 0 AS BrojPrihod, 0 AS SumPrikhod, Broj AS QtyExpense, Zbroj AS SumExpense FROM Dokument.Potrošni materijal.Roba ) AS NestedQuery
GRUPIRAJ PO Nomenklaturi

Dakle, vidimo da je cijeli naš upit zatvoren u zagrade i nazvan NestedQuery. To je učinjeno kako bismo mogli grupirati zapise iz oba podupita i eliminirati duple elemente. Takva se konstrukcija naziva ugniježđeni upit. Rezultat ovog upita je sljedeći:

Nomenklatura BrojPrihod SumPrikhod QtyExpense SumExpense
A4 papir 25 14 500
Naljepnice 500l 8 4 880 1 610
Uredski set 5 4 100 1 1 105
Datoteka je prozirna 8 8 840 1 820

Kao rezultat toga dobivamo grupiranu tablicu u kojoj su podaci iz ugniježđenih podupita svedeni na jasan oblik.
Broj ugniježđenih upita ne smije premašiti 255. Ovdje smo upotrijebili četiri podupita.