1c ugniježđeni upit ili privremena tabela. Ugniježđeni upiti. Potpuni vanjski spoj

Dizajner upita u 1C 8.3 i 8.2 je moćan razvojni alat. Omogućava vam da sastavite tekst zahtjeva koristeći posebno vizualno okruženje. Dakle, da biste kreirali 1C zahtjev, nije potrebno poznavati ugrađeni jezik upita, dovoljno je navigirati jednostavnim i intuitivnim sučeljem dizajnera.

Kreator upita je skup kartica, od kojih je svaka odgovorna za svoj dio upita. Dakle, ispunite karticu Tabele i polja Odabiremo tablice iz kojih će 1C upit primiti podatke i polja ovih tablica potrebna za rješavanje određenog problema. Ispunjavanje u zidove Uslovi namećemo uslove na izabrane tabele kako bismo iz njih odabrali samo podatke koji su nam potrebni itd.

Opis dizajnera upita na službenoj web stranici 1C 8: v8.1c.ru

Tabele i polja; ; ; ; ; ; Ugniježđeni upiti (u razvoju).

Da biste pozvali dizajnera upita 1s 8 u programskom kodu potrebno je:

  • Kreirajte novi zahtjev
Zahtjev = Novi zahtjev;
  • Postavite prazan red za tekst zahtjeva
Request.Text = "";
  • Postavite kursor miša između navodnika i pritisnite desnu tipku miša. U kontekstnom meniju koji se otvori izaberite stavku Konstruktor upita i odgovori Da na pitanje o kreiranju novog zahtjeva. Ako je tekst zahtjeva već zapisan, tada morate kliknuti bilo gdje unutar njega i pozvati konstruktora ;

Pogledajmo sve glavne kartice graditelja upita koristeći male primjere sve veće složenosti. Ovaj pristup će omogućiti početniku 1C programeru da efikasnije prouči konstruktor i sve njegove mogućnosti. Za primjere ćemo koristiti konfiguraciju Računovodstvo 3.0.

Lekcija #1. Kreator upita je najjednostavniji slučaj upotrebe.

Zadatak: napisati zahtjev u imenik nomenklature, odabrati cijelu nomenklaturu imenika.

Nove kartice: Tabele i polja.

Novi mehanizmi: pregled i uređivanje teksta zahtjeva pomoću dugmeta “Zahtjev”.

Da započnemo kreiranje zahtjeva, napravimo novi zahtjev i pozovimo konstruktor (kao što je napisano nekoliko pasusa iznad). Nakon toga, na kartici će se otvoriti prozor dizajnera Tabele i polja.

Teorijski dio časa br

Tab Tabele i polja sastoji se od tri sekcije:

Baza podataka. Ovaj odjeljak predstavlja sve tablice baze podataka koje se mogu koristiti za pravljenje upita;

Stolovi. U ovom dijelu odabiru se tabele potrebne za ovaj upit. Da ih zatim premjestite iz odjeljka baza podataka treba:

  • Ili dvaput kliknite na tabelu;
  • Ili koristite dugmad “>” ili “>>”.

Iznad sekcije Stolovi Postoji nekoliko dugmadi. O većini njih će se detaljnije govoriti u narednim lekcijama. Za sada ću dati samo kratka objašnjenja.

  • Kreirajte podupit(Crvena linija). Dizajniran za kreiranje novog potupita;
  • Kreirajte privremeni opis tabele(žuta linija). Omogućava vam da navedete ime privremene tablice koja se nalazi izvan ovog upita; također se može koristiti za prosljeđivanje tablice vrijednosti upitu;
  • Promijenite trenutni element(zelena linija). Omogućava vam da skočite na odabrani potupit, privremenu tablicu ili opis privremene tablice;
  • Ukloni trenutnu stavku(plava linija). Uklanja odabranu tablicu iz odabranih tablica;
  • Zamijenite sto(plava linija). Otvara dijalog za zamjenu odabrane tablice. Korisno ako ste izabrali pogrešnu virtuelnu tabelu registra, jer se pozicioniranje dešava na trenutno izabranoj tabeli na listi.
  • Opcije virtuelne tabele(ljubičasta linija). Otvara parametre tabele virtuelnog registra.

Polja. Ovaj odeljak bira polja tabele iz prethodnog odeljka. Ova polja će biti kolone tabele ili selekcije dobijene kao rezultat upita. Potrebni su prvenstveno kako bi se iz odabranih tabela dobili samo informacije koje su potrebne u konkretnom slučaju. Kako bi ih premjestili iz odjeljka Potrebni stolovi:

  • Ili dvaput kliknite na polje;
  • Ili koristite dugmad “>” ili “>>”;
  • Također možete sami dodati novo polje, koristeći proizvoljan izraz iz polja odabranih tabela i funkcija jezika upita.

Iznad sekcije Polja Postoji nekoliko dugmadi. Kreiranje polja korištenjem proizvoljnih izraza bit će detaljnije razmotreno u sljedećim lekcijama. Za sada ću dati samo kratka objašnjenja.

  • Dodati(zelena linija). Dizajniran za dodavanje novog polja pomoću uređivača slobodnog izraza;
  • Promijenite trenutni element(Crvena linija). Omogućava vam da promijenite odabrano polje pomoću uređivača;
  • Izbriši trenutni(plava linija). Uklanja odabrano polje sa liste.

Praktični dio časa br

Bavili smo se teorijom potrebnom da završimo zadatak koji je dat u ovoj lekciji. Da vas podsjetim kako to zvuči: napišite zahtjev u imenik nomenklature, odaberite cijelu nomenklaturu imenika.

Počnimo kreirati zahtjev za artikle:

  • Kreirajmo novi zahtjev i otvorimo konstruktor koristeći metodu navedenu na početku lekcije;
  • U poglavlju Baza podataka, hajde da otvorimo temu Imenici i tamo ćemo naći vodiča Nomenklatura;
  • Odaberite ga i koristite dugme “>” da ga premjestite u odjeljak Stolovi;
  • U poglavlju Stolovi otvorite imenik nomenklature pomoću ikone “+”;
  • Na listi polja koja se otvori pronađite polje Veza i premjestite ga u odjeljak Polja pomoću dugmeta ">".
  • Zahtjev za artikl je spreman, kliknite na dugme “OK” na dnu prozora dizajnera.

Pogledajmo šta je to ugniježđeni upiti u i zašto su potrebni.
Često postoji situacija u kojoj morate obaviti nekoliko stvari za stolom. dosledne akcije. Prilično ilustrativan primjer je kada prvo trebate, a zatim nametnuti neki uvjet grupiranoj tablici ili je povezati s drugom tablicom. U takvim slučajevima oni priskaču u pomoć ugniježđeni upiti.

Ugniježđeni upit se praktično ne razlikuje od običnog upita. Zatvoren je u zagradama i u njemu su dostupne gotovo sve metode i funkcije 1C jezika upita. A za roditeljski upit, sva polja podupita su dostupna.
Struktura najprimitivnijeg ugniježđenog upita izgleda ovako

SELECT FROM (ODABIR IZ) KAO NestedQuery

Naravno, u ovom obliku, korištenje ugniježđenog upita nema smisla, jer Možete odmah odabrati potrebna polja bez upotrebe ugnježđivanja. Ovdje je sve krajnje pojednostavljeno radi lakšeg razumijevanja.

Pogledajmo sada sve gore navedeno koristeći primjer.
Dajte nam tabelu EmployeesDivisions:

I želimo da iz ove tabele izaberemo sve odjele u kojima radi više od jednog zaposlenika.

SELECT EmployeesDivisions.Division AS Division, NUMBER(EmployeesDivisions.Employee) AS Broj zaposlenika FROM EmployeesDivisions AS EmployeesDivisions GROUP BY EmployeesDivisions.Division

Ako pokrenemo ovaj upit, dobićemo sljedeću tabelu kao rezultat

Drugi korak je nametanje ograničenja broja zaposlenih na ovoj tabeli. Da bismo to učinili, učinit ćemo gornji upit ugniježđenim i upisati odgovarajući uvjet u viši upit

SELECT NestedQuery.Unit AS Units FROM (SELECT EmployeesUnits.Unit AS Unit, QUANTITY(EmployeesUnits.Employee) AS Broj zaposlenika FROM EmployeesUnits AS EmployeesUnits GROUP BY EmployeesUnits.Unit) AS WEEM NestedEn.Qunit.

Dakle, rezultat konačnog upita će biti sljedeći

Da budemo pošteni, vrijedi napomenuti da se isti rezultat može postići korištenjem funkcije HAVING 1C jezik upita, kao i korištenje privremenih tabela.
U praksi ćete, naravno, naići na složenije ugniježđene upite koji mogu koristiti i tablice i tabele. Takođe može postojati nekoliko nivoa gnežđenja.

Odlučio sam dati svoj doprinos i opisati one karakteristike jezika o kojima nije bilo riječi u gornjim člancima. Članak je namijenjen programerima početnicima.

1. “IZ” dizajn.

Za dobivanje podataka iz baze podataka uopće nije potrebno koristiti konstrukciju “FROM”.
Primjer: Moramo odabrati sve podatke o bankama iz imenika banaka.
Zahtjev:

SELECT Directory.Banks.*

Bira sva polja iz imenika Banke. I sličan je zahtjevu:

SELECT Banks.* IZ Imenika.Banke AS Banke

2. Naručivanje podataka po referentnom polju

Kada trebamo organizirati podatke upita po primitivnim tipovima: "String", "Broj", "Datum" itd., onda se sve rješava korištenjem "ORDER BY" konstrukcije ako trebate poredati podatke po referentnom polju? Referentno polje je veza, jedinstveni identifikator, tj. Grubo govoreći, neki proizvoljni skup znakova i uobičajeni poredak mogu proizvesti rezultat koji nije sasvim očekivan. Za naručivanje referentnih polja koristi se konstrukcija "AUTO ORDER". Da biste to učinili, prvo morate poredati podatke direktno po referentnom tipu koristeći konstrukciju "ORDER BY", a zatim konstrukciju "AUTO ORDER".

U ovom slučaju, za dokumente će se poredati po redosledu "Datum->Broj", za referentne knjige u "Glavnom prikazu". Ako se poredak ne odvija po referentnim poljima, onda se ne preporučuje upotreba konstrukcije "AUTO ORDER".

U nekim slučajevima, "AUTO ORDER" konstrukcija može usporiti proces odabira. Slično, možete prepisati bez automatskog naručivanja dokumenata:

3. Dobivanje tekstualne reprezentacije referentnog tipa. Dizajn "PREZENTACIJA".

Kada trebate prikazati polje referentnog tipa, na primjer, polje "Banka", koje je veza na element direktorija "Banke", morate razumjeti da se prilikom prikazivanja ovog polja postavlja podupit za " Banke" imenik će se automatski izvršiti kako bi se dobio pregled imenika. Ovo će usporiti izlaz podataka. Da biste to izbjegli, potrebno je u zahtjevu koristiti konstrukciju “PRESENTATION” kako biste odmah dobili reprezentaciju objekta i zatim ga prikazali za pregled.

U sistemu sastavljanja podataka ovaj mehanizam se koristi podrazumevano, ali kada kreirate rasporede u ćelijama, trebalo bi da navedete reprezentaciju referentnog polja i, na primer, postavite samu vezu u transkript.

4. Uslov za uzorkovanje podataka prema šablonu.

Na primjer, trebate dobiti Mobiteli zaposleni tipa (8 -123- 456-78-912). Da biste to učinili, potrebno je u zahtjevu postaviti sljedeći uslov:

SELECT Employee.Name, Employee.Phone AS Phone IZ Imenika.Employees AS Employees GDJE Telefon LIKE "_-___-___-__-__"

Znak "_" je službeni znak i zamjenjuje bilo koji znak.

5. Istovremena upotreba zbroja i grupiranja.


Zbroji se često koriste zajedno sa grupisanjima; u ovom slučaju, agregatne funkcije možda neće biti navedene u zbrojima.

SELECT Pružanje usluga.Organizacija AS Organizacija, Pružanje usluga.Nomenklatura AS Nomenklatura, SUM(Pružanje usluga.Iznos dokumenta) AS Zbir dokumenta IZ dokumenta.Pružanje usluga AS Pružanje usluga GRUPA PO Pružanje usluga.Organizacija, Pružanje usluga.Nomenklatura REZULTATI PO OPĆENIM, Organizacija, Nomen klatura

U ovom slučaju, upit će vratiti gotovo isto kao i sljedeći upit:

SELECT Pružanje usluga.Organizacija AS Organizacija, Pružanje usluga.Nomenklatura AS Nomenklatura, Pružanje usluga.Iznos dokumenta KAO Količina dokumenta IZ dokumenta.Pružanje usluga KAO Pružanje usluga REZULTATI IZNOS (Količina dokumenta) PO OPĆENIM, Organizacija, Nomenklatura

Samo prvi upit će sažimati zapise sa istom nomenklaturom.

6. Dereferenciranje polja.

Pozivanje na polja kroz tačku naziva se operacija dereferenciranja referentnog polja. Na primjer Plaćanje.Organizacija.Upravna jedinica. U ovom slučaju, u referentnom polju "Organizacija" dokumenta "Plaćanje" se odnosi na drugu tabelu "Organizacije", u kojoj će se dobiti vrijednost atributa "Upravna jedinica". Važno je shvatiti da kada se pristupi poljima kroz tačku, platforma implicitno kreira potupit i pridružuje ove tabele.

Zahtjev:

Može se predstaviti kao:

SELECT Payment.Link, Payment.Organization, Payment.Organization, Organizations. Administrativna jedinica IZ dokumenta.Plaćanje KAO Plaćanje LEFT JOIN Directory.Organizacije AS Softver Organizacije Plaćanje.Organizacija = Organizacije.Link

Kada dereferencira referentna polja kompozitnog tipa, okvir pokušava kreirati implicitne spojeve sa svim tablicama koje su dio tipa tog polja. U tom slučaju upit neće biti optimalan.Ako se jasno zna o kakvom se tipu polja radi, potrebno je takva polja ograničiti po tipu konstrukcijom EXPRESS().

Na primjer, postoji registar akumulacije “Neraspoređena plaćanja”, gdje nekoliko dokumenata može djelovati kao registrator. U ovom slučaju, pogrešno je dobiti vrijednosti podataka registratora na ovaj način:

SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

trebali biste ograničiti tip kompozitnog polja na logger:

SELECT EXPRESS(UnallocatedPayments.Register AS Document.Payment).Datum, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

7. Izgradnja "GDJE"

Sa lijevim spajanjem dvije tablice, kada na desnu tablicu nametnete uslov “WHERE”, dobićemo rezultat sličan rezultatu sa unutrašnjim spajanjem tabela.

Primjer. Potrebno je izabrati sve klijente iz Imenika klijenata i za one klijente koji imaju dokument o plaćanju sa vrijednošću atributa "Organizacija" = &Organizacija, prikazati dokument "Uplata", za one koji nemaju ne prikazivati ​​ga.

Rezultat upita će vratiti zapise samo za one klijente koji su imali plaćanje po organizaciji u parametru, a filtrirat će ostale klijente. Dakle, prvo morate primiti sve uplate za „tavu i takvu“ organizaciju u privremenu tabelu, a zatim je povezati sa direktorijumom „Klijenti“ koristeći lijevo spajanje.

SELECT Payment.Link AS Payment, Payment.Dioničar KAO Klijent MESTO za plaćanja IZ dokumenta.Plaćanje KAO plaćanje GDJE Plaćanje.Filijala = &Filijala; /////////////////////////////////////////////// // /////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") KAO Plaćanje IZ imenika .Clients AS Klijenti LIJEVA KONEKCIJA topayments KAO topayments SOFTVER Clients.Link = topayments.Client

Ovo stanje možete zaobići na drugi način. Neophodno je nametnuti uslov "WHERE" direktno na odnos između dve tabele. primjer:

SELECT Clients.Link, Payment.Link IZ Directory.US_Subscribers AS US_Subscribers LIJEVA VEZA Dokument.Plaćanje KAO softver za plaćanje (Clients.Link = Payment.Client AND Payment.Client.Name KAO "Paketić šećera") GRUPA PO Klijentima.Link. Veza

8. Spajanja sa ugniježđenim i virtualnim tablicama

Ugniježđeni upitičesto potrebno za dohvat podataka na osnovu nekog stanja. Ako ih zatim koristite u kombinaciji s drugim tabelama, to može kritično usporiti izvršenje upita.

Na primjer, za neke klijente moramo dobiti iznos stanja na tekući datum.

SELECT UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (ODABIR Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT JOIN LEFT JOIN Register NeBYPallocacumulted. quest.Link = UnallocatedPaymentsBalances. Kupac

Prilikom izvršavanja takvog upita, optimizator DBMS-a može napraviti greške pri odabiru plana, što će dovesti do neoptimalnog izvršenja upita. Prilikom spajanja dve tabele, DBMS optimizator bira algoritam za spajanje tabela na osnovu broja zapisa u obe tabele. Ako postoji ugniježđeni upit, izuzetno je teško odrediti broj zapisa koje će ugniježđeni upit vratiti. Stoga biste uvijek trebali koristiti privremene tablice umjesto ugniježđenih upita. Dakle, prepišimo zahtjev.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients GDJE
Clients.Link B (&Clients) ; /////////////////////////////////////////////// // ////////////////////////// SELECT tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances (, ClientPayments.Balances (, Clients) IN (ODABIR tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

U ovom slučaju, optimizator će moći odrediti koliko zapisa koristi privremena tablica tClients i moći će odabrati optimalni algoritam sto se spaja.

Virtuelni stolovi , omogućavaju vam da dobijete praktično gotove podatke za većinu primijenjenih zadataka (Slice of First, Slice of the Last, Ostaci, Promet, Ostaci i Obrtovi) Ključna riječ je virtuelna. Ove tabele nisu fizičke, već ih sistem sastavlja u hodu, tj. Prilikom primanja podataka iz virtuelnih tabela, sistem prikuplja podatke iz konačnih registarskih tabela, sastavlja, grupiše i izdaje ih korisniku.

One. Kada se povezujete na virtuelnu tabelu, uspostavlja se veza sa podupitom. U ovom slučaju, optimizator DBMS-a također može odabrati neoptimalan plan povezivanja. Ako upit nije generiran dovoljno brzo i upit koristi spojeve u virtualnim tablicama, tada se preporučuje premjestiti pristup virtualnim tablicama na privremenu tablicu, a zatim napraviti spajanje između dvije privremene tablice. Prepišimo prethodni zahtjev.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients INDEKS PO LINKU GDJE
Clients.Link B (&Clients) ; /////////////////////////////////////////////// // /////////////////////////// SELECT UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client MESTO stanja IZ RegisterAccumulations.UnallocatedPayments.Balances(, Klijent B ( SELECT tClients Link FROM tClients)) AS UnallocatedPaymentsBalances; /////////////////////////////////////////////// // /////////////////////////// SELECT tClients.Link, toRemainders.AmountRemaining KAO Preostali iznos od tClients KAO tClients LEFT JOIN toRemainders AS Remainders BY tClients.Link = tRemainings.Client

9.Provjera rezultata zahtjeva.

Rezultat upita može biti prazan; da biste provjerili ima li praznih vrijednosti, koristite sljedeću konstrukciju:

ResRequest = Request.Execute(); Ako resQuery.Empty() Onda Return; endIf;

Metoda Prazan() treba koristiti prije metoda Odaberi() ili istovar(), budući da je za preuzimanje zbirke potrebno vrijeme.

Nikome nije otkriće da je izuzetno nepoželjno koristiti upite u petlji. To može kritično utjecati na vrijeme rada određene funkcije. Vrlo je poželjno primiti sve podatke u zahtjevu, a zatim ih obraditi u petlji. Ali ponekad postoje slučajevi kada postane nemoguće premjestiti zahtjev izvan petlje. U tom slučaju, radi optimizacije, kreiranje upita možete premjestiti izvan petlje, au petlji zamijeniti potrebne parametre i izvršiti upit.

Zahtjev = Novi zahtjev; Query.Text = "SELECT | Clients.Link, | Clients.Birthdate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; Za svaki red FROM TableClients Loop Query.SetParameter("Klijent", Klijent); QueryResult = Query.Execute().Select(); EndCycle;

Ovo će spasiti sistem od provjere sintakse zahtjeva u petlji.

11. Konstrukcija "HAVING".

Dizajn koji je prilično rijedak u zahtjevima. Omogućava vam da nametnete uvjete na vrijednosti agregatnih funkcija (SUM, MINIMUM, PROSJEČAN, itd.). Na primjer, trebate odabrati samo one klijente čiji je iznos plaćanja u septembru bio veći od 13.000 rubalja. Ako koristite uslov “GDJE”, prvo ćete morati kreirati privremenu tabelu ili ugniježđeni upit, grupirati zapise tamo prema iznosu plaćanja, a zatim primijeniti uvjet. Konstrukcija “IMATI” će pomoći da se to izbjegne.

ODABIR Plaćanje.Kupac, IZNOS (Iznos.Iznos) KAO IZNOS IZ dokumenta.Plaćanje KAO Plaćanje GDJE MJESEC(Datum.Plaćanja) = 9 GRUPA PO Uplati.Kupac IMA IZNOS (Iznos.Uplata) > 13000

Da biste to uradili u konstruktoru, samo idite na karticu „Uslovi“, dodajte novi uslov i označite polje za potvrdu „Prilagođeno“. Onda samo napiši Iznos (Iznos plaćanja) > 13000


12. NULL vrijednost

Ovdje neću opisivati ​​principe trovrijedne logike u bazi podataka; postoji mnogo članaka na ovu temu. Samo ukratko o tome kako NULL može uticati na rezultat upita. Vrijednost NULL zapravo nije vrijednost, a činjenica da je vrijednost nedefinirana je nepoznata. Stoga, svaka operacija sa NULL vraća NULL, bilo da se radi o sabiranju, oduzimanju, dijeljenju ili poređenju. NULL vrijednost se ne može uporediti sa NULL vrijednošću jer ne znamo šta da uporedimo. One. oba ova poređenja su: NULL = NULL, NULL<>NULL nije Tačno ili Netačno, nepoznato je.

Pogledajmo primjer.

Za one klijente koji nemaju uplate, potrebno je da prikažemo polje “Potpis” sa vrijednošću “Nema plaćanja”. Štaviše, pouzdano znamo da imamo takve klijente. A da bismo odrazili suštinu onoga što sam gore napisao, uradimo to na ovaj način.

SELECT "Bez plaćanja" AS Atribut, NULL AS Dokument PLACE topayments; /////////////////////////////////////////////// // ////////////////////////// ODABIR Clients.Link AS Client, Payment.Link KAKO PLAĆANJE STAVITI tClientPayment IZ Directory.Clients AS Clients LEFT CONNECTION Dokument. Payment AS Payment Software Clients.Link = Payment.Shareholder; /////////////////////////////////////////////// // ////////////////////////// ODABIR tClientPayment.Client IZ tClientPayment KAO tClientPayment INTERNO PRIDRUŽENJE tPayment AS tTopay BY tClientPayment.Payment = tPayment.

Obratite pažnju na drugu privremenu tabelu tClientPayment. Lijevim spojem biram sve klijente i sva plaćanja za te klijente. Za one klijente koji nemaju uplate, polje “Plaćanje” će biti NULL. Slijedeći logiku, u prvoj privremenoj tabeli “tPayments” označio sam 2 polja, jedno od njih NULL, drugi red “Nema plaćanja”. U trećoj tabeli povezujem tabele “tClientPayment” i “tPayment” koristeći polja “Payment” i “Document” internim spajanjem. Znamo da je u prvoj tabeli polje „Dokument“ NULL, au drugoj tabeli su NULL i oni koji nemaju uplate u polju „Uplata“. Šta će nam takva veza vratiti? Ali to neće vratiti ništa. Zato što poređenje NULL = NULL ne daje vrijednost Tačno.

Da bi zahtjev vratio očekivani rezultat, prepišimo ga:

SELECT "Nema plaćanja" AS Atribut, VALUE(Document.Payment.EmptyLink) AS Document PLACE to Payments; /////////////////////////////////////////////// // /////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink)) KAKO Plaćanje PUT tClientPayment IZ Imenika.Klijenti KAO Klijenti LIJEVA VEZA Dokument.Plaćanje KAO Plaćanje OD Klijenta.Link = Plaćanje.Akcionar; /////////////////////////////////////////////// // ////////////////////////// ODABIR tClientPayment.Client IZ tClientPayment KAO tClientPayment INTERNO PRIDRUŽENJE tPayment AS tTopay BY tClientPayment.Payment = tPayment.

Sada, u drugoj privremenoj tabeli, naznačili smo da ako je polje “Plaćanje” NULL, onda je ovo polje = prazna veza do dokumenta plaćanja. U prvoj tabeli također smo zamijenili NULL praznom referencom. Sada veza uključuje polja koja nisu NULL i zahtjev će vratiti očekivani rezultat.

Svi zahtjevi sadržani u članku odražavaju situacije koje bih želio razmotriti i ništa više. O Možda nisu varljivi ili neoptimalni, glavna stvar je da odražavaju suštinu primjera.

13. Nedokumentovana karakteristika dizajna "IZBOR KADA... ONDA... KRAJ".

U slučaju kada je u zahtjevu potrebno opisati konstrukciju “Uvjeti”, koristimo standardnu ​​sintaksu:

ODABERITE IZBOR KADA Users.Name = "Vasya Pupkin" ONDA "Naš omiljeni zaposlenik" OSTALO "Ne znamo ovo" KRAJ KAO Polje 1 IZ Direktorija.Korisnici KAO Korisnici

Ali šta ako, na primjer, u zahtjevu trebamo dobiti naziv mjeseca? Pisanje ogromne konstrukcije u zahtjevu je ružno i dugotrajno, tako da nam ovaj oblik pisanja iznad može pomoći:

SELECT MESEC(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) KADA 1 ONDA "januar" KADA 2 ONDA "februar" KADA 3 ONDA "mart" KADA 4 ONDA "april" KADA 5 ONDA "6 maj" KADA "KADA" KADA 8 PA "Avgust" KADA 9 PA "septembar" KADA 10 PA "oktobar" KADA 11 PA "novembar" KADA 12 ONDA "decembar" ZAVRŠAVA SE KAO MESEC

Sada dizajn izgleda manje glomazan i lako ga je razumjeti.

14. Paketno izvršavanje upita.


Da ne biste umnožavali upite, možete kreirati jedan veliki zahtev, razbiti u pakete i raditi s njim.
Na primjer, moram dobiti sljedeća polja iz direktorija "Korisnici": "Datum rođenja" i dostupne uloge za svakog korisnika. učitajte ovo u različite tabelarne dijelove obrasca. Naravno, ovo možete učiniti u jednom zahtjevu, tada ćete morati iterirati kroz zapise ili ih sažimati, ili možete učiniti ovo:

SELECT Users.Link AS Puno ime, Korisnici.Datum rođenja, Korisnici.Uloga PUT vtUsers FROM Directory.Users AS Korisnici; /////////////////////////////////////////////// // /////////////////////////// SELECT tueUsers.Puno ime, utoUsers.Datum rođenja OD tueUsers KAO tueUsers GRUPA PO tueUsers.puno ime, tueUsers . Datum rođenja; /////////////////////////////////////////////// // ////////////////////////// SELECT wUsers.Puno ime, wUsers.Uloga OD wUsers KAO wUsers GRUPA PO wUsers.Puno ime, wUsers Datum od Rođenje

tPackage = Request.ExecutePackage();

TP_Datum rođenja = tPackage.Upload();
TP_Roles = tPackage.Unload();

Kao što vidimo, upit se može izvršiti u paketu, a rezultat se može obraditi kao niz. U nekim slučajevima je vrlo zgodno.

15. Uslovi u paketnom zahtjevu

Na primjer, imamo paketni zahtjev, gdje prvo dobijamo polja: “Ime, Datum rođenja, Šifra” iz direktorija “Korisnici” i želimo da dobijemo zapise sa uslovima za ova polja iz direktorija “Pojedinci”.

SELECT Users.Individual.Name AS Ime, Users.Individual.Date of Birth AS Datum rođenja, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Korisnici; /////////////////////////////////////////////// // /////////////////////////// SELECT Individuals Link AS Individual FROM Directory Pojedinci KAO Pojedinci

Možete postaviti uslove kao što su:

WHERE Individuals.Code IN (ODABIR vtUsers.Code FROM vtUsers) I Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) I Individuals.BirthDate IN (ODABIR vtUsers.DateBirth FROM tvUsers)

A možete to učiniti ovako:

WHERE (Pojedinci.Šifra, Pojedinci.Ime, Pojedinci.Datum rođenja) IN (ODABIR tueUsers.Code, utoUsers.Ime, utoUsers.Datum rođenja OD tueUsers)

Štaviše, potrebno je održavati red.

16. Pozivanje graditelja upita za “stanje” u paketnom zahtjevu

Kada je potrebno nametnuti uslov, kao u gornjem primjeru, možete zaboraviti kako se ovo ili ono polje poziva u virtualnoj tablici.
Na primjer, potrebno je nametnuti uslov u polje "Datum rođenja", au virtuelnoj tabeli ovo polje se zove "Datum rođenja dužnika", a ako zaboravite ime, moraćete da izađete iz uređivanja uslova bez sačuvajte i pogledajte naziv polja. Kako biste to izbjegli, možete koristiti sljedeću tehniku.

Potrebno je staviti zagrade iza konstrukcije “B” i ostaviti prazan prostor (razmak) između zagrada, odabrati ovaj prostor i pozvati konstruktor upita. Dizajner će imati pristup svim tabelama skupnog upita. Tehnika radi i na virtualnim registarskim tablicama i na kartici “Uvjeti”. U potonjem slučaju morate označiti polje "P (proizvoljno stanje)" i ući u mod za uređivanje "F4".

Pitanja su se često postavljala u hodu i jednostavno služe da ilustruju „tehnike“ koje sam razmatrao.

Hteo sam da pogledam upotrebu indeksa u upitima, ali ovo je veoma široka tema. Staviću ga u poseban članak ili ga kasnije dodati ovde.

upd1. Tačke 11,12
upd2. Tačke 13,14,15,16

rabljene knjige:
Jezik upita "1C:Enterprise 8" - E.Yu. Khrustaleva
Profesionalni razvoj u sistemu 1C:Enterprise 8."

U ovom članku želimo o svemu razgovarati s vama Funkcije 1C jezika upita, i konstrukcije jezika upita. Koja je razlika između funkcije i dizajna? Funkcija se poziva sa zagradama i mogućim parametrima u njima, a konstrukcija se piše bez zagrada. Bez sumnje sve strukture i funkcije 1C jezika upita učiniti proces prikupljanja podataka fleksibilnim i multifunkcionalnim. Ove funkcije i konstrukcije primjenjuju se na polja upita, a neke se primjenjuju i na uvjete.

1C funkcije jezika upita

Jer jasan opis Funkcije 1C jezika upita je mnogo rjeđi od opisa struktura, odlučili smo da počnemo gledati funkcije. Sada pogledajmo svaki posebno, opisujući njegovu svrhu, sintaksu i primjer upotrebe, dakle:

1. Funkcija DATUM VRIJEME- ova funkcija kreira konstantno polje tipa "Datum".

sintaksa: DATUM VRIJEME(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Primjer upotrebe:

2. DATUM DIFFERENCE funkcija- vraća razliku između dva datuma u jednoj od dimenzija (godina, mjesec, dan, sat, minuta, sekunda). Mjerenje se prenosi kao parametar.

sintaksa: DATUM RAZLIKA(<Дата1>, <Дата2>, <Тип>)

Primjer upotrebe:

Query.Text = "SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Broj dana";

3. Funkcija VALUE- postavlja konstantno polje sa unapred definisanim zapisom iz baze podataka; takođe možete dobiti prazan link bilo koje vrste.

Sintaksa: VALUE(<Имя>)

Primjer upotrebe:

Request.Text = "SELECT //predefinirani element | VALUE(Directory.Currencies.Dollar) AS Dollar, //prazna veza | VALUE(Document.Prijem robe i usluga.EmptyLink) AS Potvrda, //transfer vrijednost | VALUE(Transfer . Pravni pojedinac. Pojedinac) AS Pojedinac, //predefinisani račun | VRIJEDNOST(Kontni plan. Samonosivi materijali) AS Račun_10" ;

4. SELECT funkcija- pred nama je analog konstrukcije IF, koji se koristi u kodu, samo se ovaj koristi u 1C upitima.

sintaksa: IZBOR KADA<Выражение>ONDA<Выражение>U protivnom<Выражение>KRAJ

Primjer upotrebe:

Request.Text = //ako je iznos veći od 7500, tada bi trebao postojati popust od 300 rubalja, //pa ako se uvjet aktivira onda funkcija //vraća iznos - 300 //u suprotnom zahtjev će jednostavno vratiti iznos "IZABIR | ODABIR | KADA TCReceipts.Iznos > 7500 | ONDA TCReceipts.Iznos - 300 | ELSE TCReceipts.Iznos | KRAJ KAO Iznos Sa popustom |FROM | Dokument.Prijem robeUsluge.Roba AS TCReceipts";

5. EXPRESS funkcija- omogućava vam da izrazite konstantno polje sa određenim tipom.

sintaksa: EXPRESS(Ime polja AS Ime vrste)

Primjer upotrebe:

Query.Text = "IZABIR RAZNO | Sales.Registrar.Broj, | ODABIR | KADA Sales.Registrar LINK DOcument.Consumable | THEN EXPRESS(Sales.Registrar AS Document.Consumable) | ELSE SELECT | WHEN Sales.Registrar LINK Document.dokument | THEN EXPRESS(Sales.Registrar AS Dokument.Implementacija) | KRAJ | ... | KRAJ AS Broj | FROM | Registar Akumulacije.Kupovine AS Kupovine";

Druga opcija je korištenje funkcije EXPRESS u poljima mješoviti tipovi gdje se ovi nalaze? Najjednostavniji primjer je “Registar” za bilo koji registar. Pa zašto bismo mogli da kvalifikujemo tip u registratoru? Razmotrimo situaciju kada iz registratora odaberemo polje "Broj", iz koje tabele će se odabrati broj? Tačan odgovor svih! Stoga, da bi naš upit brzo funkcionirao, trebali bismo specificirati eksplicitni tip koristeći funkciju EXPRESS

Primjer upotrebe:

Query.Text = "SELECT | EXPRESS(Nomenklatura.Komentar AS Linija(300)) KAO Komentar, | EXPRESS(Nomenklatura.Zbroj AS Broj(15,2)) AS Zbroj |FROM | Imenik.Nomenklatura AS Nomenklatura";

6. ISNULL funkcija(alternativno pravopis ISNULL) - ako je polje tipa NULL, tada se zamjenjuje drugim parametrom funkcije.

sintaksa: ISNULL(<Поле>, <ПодставляемоеЗначение>)

Primjer upotrebe:

Također imajte na umu da je preporučljivo UVIJEK zamijeniti tip NULL nekom vrijednošću, jer poređenje s tipom NULL uvijek vraća FALSE čak i ako usporedite NULL sa NULL. Najčešće se NULL vrijednosti formiraju kao rezultat spajanja tablica (sve vrste spajanja osim internih).

Query.Text = //Odaberi cijelu stavku i njena stanja //ako nema stanja u nekoj stavci, tada će postojati polje //NULL koje će biti zamijenjeno vrijednošću 0 "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) AS Ostatak | FROM | Imenik.Nomenklatura AS Br. | LIJEVA VEZA Registrirajte Akumulacije. GoodsInWarehouses. Remainings AS GoodsInWarehousesRemains | ON (GoodsInWarehousesRemains. (GoodsInWarehousesRemains).

7. REPRESENTATION funkcija- omogućava vam da dobijete prikaz polja zahtjeva.

sintaksa: PERFORMANSE(<НаименованиеПоля>)

Primjer upotrebe:

Query.Text = "SELECT | REPRESENTATION(FreeRemainingRemains.Nomenclature) AS Nomenklatura, | REPRESENTATION(FreeRemainingRemaining.Warehouse) AS Warehouse, | FreeRemainingRemaining.InStockRemaining |FROM.AccumulationRemainRemain.Remaining.FROM.RemainingRemains.Remaining.FROM.RemainingRemainRemain.Register

Konstrukcije u 1C jeziku upita

Gore smo razgovarali s vama Funkcije 1C jezika upita, sada je vrijeme za razmatranje konstrukcije u 1C jeziku upita, nisu ništa manje važni i korisni, hajde da počnemo.

1. Građevinski LINK- je logički operator za provjeru referentnog tipa. Najčešće se susreće prilikom provjere polja složenog tipa u odnosu na određeni tip. sintaksa: VEZA<Имя таблицы>

Primjer upotrebe:

Request.Text = //ako je tip vrijednosti zapisivača dokument Prijem, //onda će upit vratiti "Prijem robe", u suprotnom "Prodaja robe" "SELECT | SELECT | WHEN Remaining.Registrar LINK Document.Receipt of GoodsServices | ONDA ""Prijem"" | OSTALO ""Potrošnja"" | KRAJ KAO Vrsta kretanja | IZ | Registar akumulacije. Preostali proizvodi u skladištima KAO ostaci" ;

2. Design BETWEEN- ovaj operator provjerava da li je vrijednost unutar navedenog raspona.

sintaksa: IZMEĐU<Выражение>I<Выражение>

Primjer upotrebe:

Request.Text = //dobijemo cijelu nomenklaturu čiji kod se nalazi u rasponu od 1 do 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code IZMEĐU 1 I 100" ;

3. HIJERARHIJA konstrukcije B i B- provjeriti da li je vrijednost u prenesenoj listi (nizovi, tablice vrijednosti itd. mogu se prenijeti kao lista). Operator IN HIERARCHY vam omogućava da vidite hijerarhiju (primjer korištenja kontnog plana).

sintaksa: IN(<СписокЗначений>), U HIJERARHIJI(<СписокЗначений>)

Primjer upotrebe:

Request.Text = //odaberite sve podračune računa "ODABIR | Samonosivi. Veza KAO račun | FROM | Kontni plan. Samonosivi AS Samonosivi | GDJE | Samonosivi. Veza U HIJERARHIJSKOJ VRIJEDNOSTI (Grafikon Računi. Samonosivi. Roba)";

4. Dizajn SLIČAN- Ova funkcija nam omogućava da uporedimo string sa uzorkom niza.

sintaksa: LIKE "<ТекстШаблона>"

Opcije uzorka redova:

% - niz koji sadrži bilo koji broj proizvoljnih znakova.

Jedan proizvoljan karakter.

[...] - bilo koji pojedinačni znak ili niz znakova naveden u uglastim zagradama. Nabrajanje može specificirati opsege, na primjer a-z, što znači proizvoljan znak uključen u raspon, uključujući krajeve raspona.

[^...] - bilo koji pojedinačni znak ili niz znakova naveden u uglastim zagradama osim onih navedenih iza znaka negacije.

Primjer upotrebe:

Query.Text = //pronađi cijelu nomenklaturu koja sadrži korijen TABUR i počinje //malim slovom ili sa velika slova t "ODABIR | Nomenklatura. Veza | IZ | Direktorij. Nomenklatura AS Nomenklatura | GDJE | Proizvodi. Naziv LIKE "" [Tt]abur%""" ;

5. Dizajn DOZVOLJEN- ovaj operater vam omogućava da izaberete samo one zapise iz baze podataka za koje pozivalac ima dozvolu čitanja. Ova prava su konfigurisana na nivou zapisa (RLS).

sintaksa: DOZVOLJENO je napisano nakon ključna riječ ODABIRATI

Primjer upotrebe:

Request.Text = "ODABIR DOZVOLJENO | Counterparts. Link | FROM | Directory. Counterparties AS Counterparts";

6. Dizajn VARIOUS- omogućava vam da odaberete zapise u kojima nema dupliranih zapisa.

sintaksa: VARIOUS se piše iza ključne riječi SELECT

Primjer upotrebe:

Request.Text = //odabire zapise na koje čitač ima prava "IZABIR RAZLIČITIH | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" ;

Također, konstrukcija VARIOUS se može koristiti sa operatorom ALLOWED i drugim operatorima.

Primjer upotrebe:

Request.Text = //odabire različite zapise na koje čitalac ima prava "ODABIR DOZVOLJENIH RAZLIČITIH | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties";

7. Dizajn FIRST- bira broj zapisa navedenih u parametru iz rezultata upita.

Sintaksa: FIRST<число>

Primjer upotrebe:

Request.Text = //odaberite prva 4 CCD broja iz direktorijuma "IZABIR PRVI 4 | CCD brojevi. Veza | IZ | Direktorijuma. CCD brojevi KAO CCD brojevi";

8. Dizajn ZA PROMJENU- omogućava zaključavanje tabele, radi samo u transakcijama (relevantno samo za automatska zaključavanja).

sintaksa: ZA PROMJENU<НаименованиеТаблицы>

Primjer upotrebe:

Query.Text = "SELECT | Slobodni ostaci ostataka. Nomenklatura, | besplatni ostaci ostataka. Skladište, | besplatni ostaci ostataka. Ostalo na zalihama | FROM | Registar akumulacija. Slobodni ostaci. Ostaci KAO slobodni ostaci ostataka. Registar akumulacija | Registar akumulacija | . Slobodni ostaci. Ostaci";

9. Dizajn ORDER BY- organizira podatke po određenom polju. Ako je polje veza, onda prilikom postavljanja zastavice AUTO ORDER Sortiranje će se odvijati prema predstavljanju veze; ako je zastavica isključena, veze se sortiraju prema senioritetu adrese veze u memoriji.

sintaksa: SORT BY<НаименованиеПоля>AUTO ORDER

Primjer upotrebe:

Query.Text = "SELECT | Besplatni ostaci ostataka. Nomenklatura AS nomenklatura, | besplatni ostaci ostataka. Skladište AS skladište, | besplatni ostaci ostataka. Na zalihi Preostalo | FROM | Registrirajte akumulacije. Slobodni ostaci. Preostali KAO slobodni preostali ORDER Preostaje | | Nomenklatura | AUTO ORDER VANIE";

10. Dizajn GROUP BY- koristi se za grupisanje nizova upita prema određenim poljima. Numerička polja moraju se koristiti sa bilo kojom agregatnom funkcijom.

sintaksa: GROUP BY<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Primjer upotrebe:

Query.Text = "SELECT | ItemsInWarehouses.Nomenklatura KAO Nomenklatura, | ItemsInWarehouses.Warehouse, | SUM(ItemsInWarehouses.InStock) KAO INSTOCK |FROM | RegisterAccumulations.ItemsInWarehouses AS ItemsInWarehouses.Warehouses |A ItemsInWarehouses.A.W.Warehouses | kuća ah.Skladište" ;

11. Dizajn HAVING- omogućava vam da primijenite agregatnu funkciju na uvjet odabira podataka, slično konstrukciji WHERE.

sintaksa: HAVING<агрегатная функция с условием>

Primjer upotrebe:

Query.Text = //odabira grupisane zapise u kojima je polje InStock veće od 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) KAO INSTOCK |FROM | RegisterAccumulations.ItemsSInSi | GROUP BY | ProductsInWarehouses.Nomenclature, | ProductsInWarehouses.Warehouse | |DOSTUPNO | IZNOS(ProductsInWarehouses.InStock) > 3" ;

12. Građevinski INDEX BY- koristi se za indeksiranje polja upita. Upit sa indeksiranjem traje duže da se završi, ali ubrzava pretragu kroz indeksirana polja. Može se koristiti samo u virtualnim tablicama.

sintaksa: INDEX BY<Поле1, ... , ПолеN>

Primjer upotrebe:

Query.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";

13. Dizajn WHERE- omogućava vam da nametnete uslov na bilo koja polja za odabir. Rezultat će uključivati ​​samo zapise koji zadovoljavaju uvjet.

sintaksa: GDJE<Условие1 ОператорЛогСоединения УсловиеN>

Primjer upotrebe:

Query.Text = //svi zapisi sa CompensationRemaining su odabrani<>0 i //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |FROM.RPORemains.CompensationRemains |FROM.Registar Compensation. Ostaci | WHERE |CompensationRPORemaining.CompensationRemaining<>0 | I CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. REZULTATI dizajna... OPŠTE- koristi se za izračunavanje ukupnih iznosa; dizajn specificira polja po kojima će se zbroji izračunavati i agregatne funkcije se primjenjuju na ukupna polja. Kada se koriste zbrojevi za svako polje nakon konstrukcije TOTAL, podaci se grupišu. Postoji opcioni GENERAL konstrukt; njegova upotreba takođe obezbeđuje dodatno grupisanje. U nastavku ćete vidjeti primjer rezultata zahtjeva.

sintaksa: REZULTATI<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>BY<ОБЩИЕ> <Поле1, ... , ПолеN>

Primjer upotrebe:

Request.Text = "IZABIR | Izračuni. Ugovor sa drugom stranom. Vrsta ugovora AS Vrsta ugovora, | Izračuni. Ugovor sa drugom stranom AS Ugovor, | Izračuni. Druga strana, | Izračuni. Iznos međusobne namirnice kao Stanje | IZ. Registar akumulacija. Poravnanje SA drugim ugovornim stranama. Stanja KAO kalkulacije | UKUPNO | IZNOS (Stanje) |Softver | OPĆE, | Vrsta ugovora";

Na slici su prikazane grupe koje su formirane tokom izvršenja zahteva, gornja se odnosi na OPŠTI deo, a druga na polje Vrsta ugovora sa drugom stranom.

Ugniježđeni upiti su upiti koje poziva drugi, vanjski upit. One su uvijek zatvorene u zagradama i moraju im se dati pseudonim. Neki smatraju da je potupit analogan privremenim tabelama, ali ova dva alata imaju niz razlika, koje ćemo pogledati u ovom članku.

Ugniježđeni upit vidi samo sebe, ne vidi vanjski upit. To znači da ne možete, na primjer, postaviti uvjet u ugniježđenom upitu na osnovu vrijednosti vanjskog polja upita.

Većina predstavljenih zahtjeva nemaju nikakvu vrijednost i mogu se jednostavnije ispuniti. Oni su dati samo da ilustruju mehanizam ugniježđenih upita.

Ugniježđeni upiti se mogu koristiti u IZ konstrukciji:

Zahtjev. Tekst= „IZABIR
NestedQuery.Field1,
NestedQuery.Field2
OD
(IZABIR
Tabela1.Polje1,
Tabela1.Polje2
FROM DataTable AS Table1) AS NestedQuery"
;

Uključujući veze:

Zahtjev. Tekst= „IZABIR
NestedQuery.Name,

OD
(IZABIR
Counterparts Link AS Link,
Counterparties.Naziv AS Naziv
OD
Imenik.Counterparties AS Counterparts) AS Ugniježđeni zahtjev
LEFT JOIN Information Register.BlackList.Last Slice AS BlackListLast Slice
Softver NestedRequest.Link = BlackListSliceLast.Counterparty"
;

A u uslovima upita sa poređenjem IN ili IN HIERARCHY:

Zahtjev. Tekst= „IZABIR
BlackListSliceLast.State
OD
Informacija Register.BlackList.Slice of the Last AS BlackListSlice of the Last
GDJE
BlackListSlice of the Latest.Counteragent B
(PRVI ODABIR 10
Counterparties.Link
OD
Imenik. Ugovorne strane AS Counterparties)"
;

U ovom slučaju, broj izabranih polja ugniježđenog upita mora odgovarati broju operanada na lijevoj strani izraza B ili B HIJERARHIJA.

Postoji mišljenje da su upiti ugniježđeni složene strukture se izvršavaju od strane 1C platforme iracionalno i zahtijevaju više resursa i vremena nego isti upiti koji se izvršavaju drugačije, bez korištenja ugniježđenih upita. Međutim, u nekim slučajevima nemoguće je bez ugniježđenih upita.

Istovremeno, jedan veliki upit sa ugniježđenim obično radi efikasnije od niza upita iz modula.

Gotovo uvijek, alternativa ugniježđenom upitu je korištenje privremenih tabela. Ovaj alat ima niz prednosti:

  1. Zahtjev postaje strukturiraniji i lakši za čitanje.
  2. Rezultat učitan u privremenu tabelu može se koristiti nekoliko puta i nema potrebe za ponovnim izvršavanjem upita da biste dobili ovaj rezultat. A ugniježđeni upit će se svaki put iznova izvršavati, nepotrebno učitavajući sistemske resurse.

Da rezimiramo: ugniježđene upite je najbolje koristiti kada jednostavni dizajni, i treba ih koristiti samo kada se problem ne može riješiti drugačije; U složenim upitima bolje je koristiti privremene tabele.