Ugniježđeni upiti u konstruktoru. Konstruktori upita 1c uslovi konstruktora upita

Dakle, počnimo s nečim jednostavnim: kreirajte novu obradu u konfiguratoru, nazovite je Query Console ili Query Builder, kako želite.

Možemo odmah dodati tabelu u "Podaci" za buduće parametre koji su nam potrebni, tako da u našoj Konzoli ne pokrenemo najprimitivniji zahtjev, već sa parametrima i vezama, na primjer, za naš rad ćemo kreirati zahtjev za periodične registre , ali ovdje bez instrukcija parametra=&Datum nigdje.

Da kreiramo našu tabelu Parametara, na kartici „Podaci“ u njenom „Tabularnom delu“ dodaćemo novu tabelu, nazovimo je Parametri upita, ovde ćemo dodati kolone ove tabele: 1) Ime parametra, ukucajte string = 25 karaktera ; ParameterValue, ovdje je kompozitni tip podataka, pogledajte sliku:

Stoga, kao što je prikazano na slici, biramo kompozitni tip za kolonu Parameter Value: u izborniku tipa koji se otvori, označite polje za potvrdu “Composite type”, odaberite broj, string (navedite 20 znakova), datum, Boolean i potvrdite donji checkbox – AnyLink – znači ono što slijedi, kada specificiramo parametre našeg zahtjeva, možemo se pozvati na bilo koji objekt naše konfiguracije, na primjer, direktorije ili dokumente.

Sada treba da kreiramo formu naše buduće Query Console. U obradi idemo na karticu “Forms” i dodamo novu.Ulazimo u ovaj obrazac i već postoji neograničeno polje za kreativnost - možete složiti dva detalja koja ste upravo kreirali i ploču sa parametrima po želji! Da biste to učinili, možete koristiti standardne elemente obrasca kao što su Grupa ili Stranica sa stranicama (ako više volite okretanje stranica.

Glavna stvar ovdje je jedna stvar: nakon što prevučete atribut “TextValues” u lijevo polje za uređivanje obrasca, obavezno postavite “View”=Text Document Field u njegovim svojstvima. Vidi sliku:

U svojstvima atributa „Tabela upita“, opciono možete odrediti „Prikaži mrežu“ i „Prikaži zaglavlja“.

Zatim, u desnom prozoru za uređivanje obrasca, idite na karticu "Komande" i dodajte novo dugme, kada se klikne, naša Konzola će izvršiti određenu radnju. Kreirajmo dugme „Dizajner upita“, ako želite, možete dodati ikonicu dugmetu, glavna stvar je da samo dugme postavite u levi prozor za uređivanje obrasca - tako da ga vidimo. Zatim u desni obrazac prozor za uređivanje, kliknite desnim tasterom miša na naše dugme i izaberite svojstva – u svojstvima kliknite na stavku „Akcija“, pojaviće se modalni prozor sa pitanjem gde će se tačno izvršiti naš programski kod, koji ćemo dodeliti dugmetu – izaberite „ Na klijenta”.

Modul obrasca će se otvoriti sa gotovom praznom procedurom “Konstruktor upita procedure (komanda)”. Unutar ove procedure ćemo opisati poziv standardnom 1c8 Query Builderu. Vrlo je lako: Konstruktor = Novi konstruktor zahtjeva; Ali ovde postoje zamke - konstruktor upita ugrađen u platformu radi u korisničkom režimu SAMO pod debelim klijentom! Stoga ćemo umetnuti uslov instrukcije predprocesora #If, ali ovdje odlučite sami, na osnovu vaše platforme, ili imate obične forme, zatim odaberite “ FatClientRegularApp” ili imate platformu zasnovanu na upravljanim obrascima, zatim “ ThickClientManagedApplication“.vidi sl.

Sada ostaje da ovoj proceduri dodamo uslov za snimanje teksta zahteva, koji će Query Builder generisati za nas u detaljima obrasca „Tekst zahteva“:

Ako Constructor.OpenModal()=True onda Object.RequestText=Constructor.Text; endIf;

Ali možemo ručno promijeniti nešto u tekstu zahtjeva (u korisničkom modu - u prozoru atributa “Tekst zahtjeva”) tako da naše promjene dođu u konstruktor upita kada se ponovo pozove – ovdje ćemo dodati jednostavan uvjet:

Ako nije EmptyString(Object.QueryText) onda Constructor.Text = Object.QueryText; endIf;

To je to, povezali smo konstruktor upita ugrađen u 1c8 platformu, pogledajmo naš rad. Da biste to uradili, pokrenite 1C:Enterprise u režimu debelog klijenta na jedan od sledećih metoda: 1) glavni meni Konfiguratora – Otklanjanje grešaka – Pokreni otklanjanje grešaka – Debeli klijent; 2) ili ako imate ove tipke na kontrolnoj tabli u konfiguratoru - samo pritisnite dugme sa žutim krugom sa debelom tačkom, pogledajte sliku:

Pokreće se korisnički mod 1cEnterprise8, pronalazimo našu obradu, pokrećemo je, kliknemo na dugme „Dizajner upita“ i vidimo kako se otvara dizajner ugrađen u platformu. vidi sl.

Dakle, imamo pokrenut konstruktor upita, možemo početi sastavljati naš budući upit u njemu, ali nas zanima kako će upit koji smo kreirali funkcionirati! A da bismo to učinili, potrebno je da kreiramo još jedno dugme u konfiguratoru kada uređujemo formu naše konzole, nazovimo ga „Run Query“. U svojstvima dugmeta “Run Query” kliknite na “Action”, ponovo se pojavljuje meni u kojem se pita gde će se naš programski kod obraditi, u ovom slučaju biramo “I na klijentu i na serveru”, ponovo se nalazimo u modulu Forms.

U proceduri Execute Query(), koju imamo na klijentu, upisaćemo uslov ako korisnik nije uneo tekst upita, ali traži da ga izvrši:

If EmptyString(Object.QueryText) Then report("Unesite tekst upita!"); endIf;

Sistem je već automatski generirao vezu na proceduru Execute RequestOnServer(); – to je dobro, idemo na ovu proceduru koja se izvršava na serveru i ovdje upisujemo kod za izvršenje našeg unesenog zahtjeva.

Ovdje postoje opcije: Sve izraze vezane za izgradnju upita možete sami napisati, tj. ručno, ali postoji još jednostavnija opcija - unutar procedure, kliknite desnim tasterom miša i u padajućem meniju izaberite „Graditelj upita sa obradom rezultata, pogledajte sliku“:

Ako ste kliknuli na stavku “Kury builder s obradom rezultata”, pojavit će se modalni prozor “Tekst upita nije pronađen. Kreirati novi?”, kliknite da. Otvorit će se ugrađeni dizajner upita u kojem na prvoj kartici "Obrada rezultata" - odaberite prvu stavku " Zaobilaženje rezultata." To je to, ne treba nam ništa drugo od ovog konstruktora, kliknite na dugme "U redu" - pojavit će se modalni prozor "U zahtjevu nisu odabrana polja, kliknite "U redu".

Nakon ovoga, sljedeći gotovi predložak će se pojaviti unutar naše ExecuteRequestOnServer() procedure:

Pređimo na izraz koji je konstruirao konstruktor:

Request.Text = "";

Request.Text = Object.RequestText;

Eto kako je jednostavno, naše dugme „Izvrši zahtjev“ na obrascu za obradu već je praktično operativno, za sada može obraditi samo jednostavne zahtjeve bez parametara, ali glavno je da radi! Ostaje samo da vizuelno prikažemo rezultate našeg zahteva u atributu „Tabela vrednosti“ na obrascu za obradu. Da vas podsjetim da je naš atribut “Tabela vrijednosti” tipa “Tabularni dokument”, jer u suprotnom nećemo vidjeti naše rezultate u korisničkom modu. Prikaz tabelarnih podataka korisniku se uvek vrši ili tabelarnim dokumentom ili rasporedom. Zaista bih voleo da je moguće prikazati podatke kroz tabelu vrednosti - pošto je veoma laka za korišćenje i poznata, ali Nažalost, tabela vrijednosti je samo alatka koja je potrebna programeru, pomoću nje ne možete prikazati podatke na ekranu...

Hajde da pobliže pogledamo šta je tabelarni dokument - to je kao Excel list - možete doći do zapisa u određenoj ćeliji samo pomoću ćelija tabele, ovde ih zovemo oblast, ali mi sami možemo odabrati opseg ove oblasti u jednu određenu ćeliju:

Dakle, shvatili smo šta je tabelarni dokument i sami utvrdili da ćemo podatke iz našeg upita trebati definirati u određenoj ćeliji ovog dokumenta proračunske tablice. Ali razmislimo: šta je „Rezultat upita“ koji nam je dizajner tako brzo generirao? Otvorite pomoć - Rezultat upita je tabela koja ima odgovarajuća svojstva! vidi sl.

A ako sada pišemo iza izraza Query Result = Query.Execute(); (koji kreira konstruktor), evo tako jednostavnog ciklusa za kolekcije:

Za svaki ColumnName From Query Result.Columns Izvještaj o petlji (Ime kolone.Naziv); EndCycle;

Nakon ovog ciklusa, za sada zabilježite sve izraze koje je konstruktor automatski napravio. I pokrenite 1C:Enterprise8 pod debelim klijentom. Kreirajte bilo koji jednostavan upit (možete koristiti Query Builder - već radi za nas) i kliknite na dugme "Pokreni upit":

Na dnu prozora poruke ćete vidjeti da tabela rezultata upita pohranjuje imena polja koja smo upravo odabrali kreiranjem jednostavnog upita.

Sada prikažimo ove nazive polja naše patnje u dokumentu proračunske tablice:

Za svaki ColumnName From Query Result.Columns Petlja Cell=Object.QueryTable.Area(1,QueryResult.Columns.Index(Ime kolone)+1); Cell.Text=Ime kolone.Ime; EndCycle;

Da bismo prikazali detalje podataka o upitu, raščlanimo izraze koje je kreirao automatski dizajner i ubacimo u petlju sortiranja "SelectionDetailedRecords" samog upita potpuno istu petlju koju smo koristili za prikaz naziva kolona, ​​samo što sada moramo prenijeti ne podatke iz tabele "Rezultat upita" u tekst ćelije. i podatke samog odabira, pogledajmo u pomoći kako možete pristupiti polju za detaljan odabir zahtjeva:

SelectionDetailRecords = QueryResult.Select(); Dok SelectionDetailedRecords.Next() Loop //u prvom redu već imamo zapisana imena kolona tabele, tako da učitavamo podatke ispod prve linijeDocRowNumber=Object.QueryTable.TableHeight+1; Za svaki ColumnName Iz Query Result.Columns Cycle Cell=Object.QueryTable.Area(DocRowNumber,QueryResult.Columns.Index(ColumnName)+1); Cell.Text = SelectionDetailedRecords[Ime Column.Name]; EndCycle; EndCycle;

To je sve, možemo provjeriti, učitati poduzeće pod debelim klijentom, unijeti jednostavan zahtjev bez parametara, kliknuti na dugme "Pokreni upit", pogledajte sliku:

Ura, sve radi!!!

Vrlo je zgodno kada se prilikom otvaranja/zatvaranja naše Query Console tekst našeg upita, s kojim smo radili prije zatvaranja konzole, ponovo upisuje u polje „Tekst upita“. Da biste to učinili, potrebno je samo omogućiti svojstvo forme = Autosave, pogledajte sl.

To je to, naša konzola radi. Da bismo mogli pisati složenije upite sa parametrima navedenim u njima, potrebno je da kreiramo još jedno dugme „Pronađi parametre“, kao i kod za dugme „Pokreni upit“ - izvršiće se kod za dugme „Pronađi parametre“ na klijentu i na serveru. Zatim, u proceduri servera, pokrećemo zahtjev na isti način sa tekstom koji je u njega proslijeđen iz prozora “Tekst zahtjeva”, koristeći izraz “Request.FindParameters()” pronalazimo proslijeđene parametre i jednostavno ih unosimo u uđite u tabelarni dio obrasca “Parametri zahtjeva”. Ne zaboravite ih zatim prenijeti iz popunjene tablice parametara u proceduru „Pokreni upit“.

Također možete dodati nekoliko dugmadi na našu konzolu koja će obrisati prozor Parametri i prozor Tekst zahtjeva u korisničkom modu.

Naša Query Console je spremna za korištenje, želim vam uspješna kreativna rješenja koristeći tako jednostavan i moćan alat kao što je Query Console!

Ova obrada je napisana na platformi 1c8.3 (upravljani obrasci) i radi pod debelim klijentom. Može se pisati i na platformi 1c8.2, kako u regularnim formama tako iu upravljanim.

Preuzimanje sadrži uzorak Query Console koji smo upravo kreirali.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Nadogradnja Query Console:

1) Sada će naša domaća Query Console sa ugrađenim Query Builderom raditi pod bilo kojim klijentom: pod debelim klijentom redovnih i upravljanih obrazaca i pod tankim i web klijentom.

p.s. Forma i izgled ugrađenog Query Builder-a je različit - u zavisnosti od toga pod kojim klijentom smo pokrenuli našu konzolu. (Ja sam lično više upoznat i pogodniji sa formom Query Builder-a pod debelim klijentom)

&O konstruktoru upita (naredba) klijentske procedure //pozivanje standardnog konstruktora upita moguće je samo pod debelim klijentom #If ThickClientManagedApplication ili ThickClientNormalApplication Then Constructor=Novi konstruktor upita; Ako nije EmptyString(Object.QueryText) onda Constructor.Text = Object.QueryText; endIf; Ako Constructor.OpenModal()=True onda Object.RequestText=Constructor.Text; endIf; // #Else // Report("Pozivanje graditelja upita je moguće samo pod debelim klijentom"); // Povratak; //# EndIf #Else Report("Pokrećete Query Builder pod tankim klijentom - malo se razlikuje po svom obliku i brzini performansi!"); Konstruktor = Novi QueryConstructor(); Ako nije EmptyString(Object.QueryText) onda Constructor.Text = Object.QueryText; endIf; Upozorenje konstruktora = New AlertDescription("RunAfterClosingConstructor", ThisForm); Constructor.Show(Constructor Alert); # EndIf End of Procedure &Na klijentskoj proceduri ExecuteAfterClosingConstructor(Result, ConstructorParameters) Export //Result=text, ako je konstruktor zatvoren pomoću dugmeta ok Object.RequestText = AbbreviatedLP(Result); //works!!! Kraj procedure

2) Dodana je mogućnost u našu jednostavnu konzolu upita za unos složenih upita sa privremenom tablicom koja je proslijeđena parametrima!!! Mehanizam se pokazao vrlo jednostavnim i elegantnim - bez korištenja XML koda, kao što se radi na profesionalnim konzolama.

Sam kod i procedure za mehanizam transfera do parametara privremenih tabela možete vidjeti u drugom priloženom fajlu. Kako sam počeo da razvijam sopstvenu verziju privremenih tabela u parametrima možete pronaći na ovom linku https://forum.infostart.ru/forum9/topic183700/

Sada kako koristiti konzolu za složeni upit kada se privremena tablica prosljeđuje njenim parametrima. Na primjer, možete uzeti kod ovog zahtjeva;

SELECT ExternalData.Product, ExternalData.Quantity PLACE ExternalData FROM &ExternalData AS ExternalData; /////////////////////////////////////////////// // /////////////////////////// SELECT ExternalData.Product, ExternalData.Quantity, ISNULL(RemainingProductRemaining.QuantityRemaining, 0) AS Field1, ISNULL(Remaining ProductsRemainings.QuantityRemaining, 0) - ExternalData.Quantity AS Preostalo FROM ExternalData AS ExternalData LEFT JOIN Registar Akumulacije.Remaining Products.Remainings(&Date, Product IN (SELECT ExternalData.Product FROM ExternalData AS Remaining Products.ExternalData ASRemainReducts ExternalData.Products.Remag.Remax.Products.Remax.Remax.Products. ining Proizvod

Na osnovu primjera i sličnosti gornjeg koda upita, možete kreirati vlastiti složeni upit, uzimajući u obzir vaše objekte podataka.

Dakle, u dizajneru upita kreirali smo gornji upit, zatvarajući konstruktor - tekst upita će ići u polje naše konzole „Tekst upita“, kliknite na dugme „Pronađi parametre“, vidimo da se u tabeli parametara pojavila linija = “Spoljni podaci”, Tip vrednosti = “Tabela vrednosti” ,pogledajte sl.

U ovu tabelu parametara - unesite parametar Datum, na primjer, današnji datum, zatim kliknite da pokušate urediti naš privremeni parametar tablice "Spoljni podaci", kliknite na polje sa "Tabela vrijednosti" na tri tačke - izbor tipova će Kada se pojavi, kliknemo na Red, naš mehanizam nam okreće stranicu na obrascu, gde treba da ručno unesemo ovu veoma privremenu tabelu.

Imajte na umu da će se u ovom slučaju na stranici „Rasporedi“ pri dnu u polju „Ime privremene tabele u parametrima“ pojaviti ime naše privremene tabele (kopirano je iz tabele Parametri).

Do sada, na stranici “Tables” vidimo samo jednu praznu tabelu - ovo je tabela Tipova naše buduće privremene tabele. Pomoću dugmeta “Dodaj” ćemo dodati naziv detalja i tip buduće tabele . Budite oprezni - naziv i tip moraju odgovarati onome što smo naveli u zahtjevu za &ExternalData:

Sada pritisnemo dugme "Ažuriraj privremenu tabelu" - i imaćemo drugu tabelu ovde - direktno ćemo je napuniti privremenim podacima tabele preko dugmeta "Dodaj".

To je to, možemo se još jednom provjeriti da li smo primitivne podatke parametara upita unijeli u tablicu parametara na 1. stranici obrade i kliknuti na dugme “Run Query” - sve se izračunava i odabira u skladu s tim sa ograničenje podataka proslijeđenih u parametru naše privremene tablice

p.s. Ako ste pogriješili prilikom upisivanja naziva detalja i njihovih tipova (u prvoj tabeli) - samo zatvorite Konzolu i otvorite je ponovo - privremena tabela podataka će biti izbrisana - a tabela Tipovi se ponovo može uređivati ​​i nova tabela podataka može se ponovo kreirati.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

To je sve, možemo kreirati vrlo moćan radni alat vlastitim rukama, osim toga, naša konzola je još uvijek vrlo brza u odnosu na profesionalne - a to je vrlo veliki plus za programere! I, naravno, sada naša konzola radi pod bilo kojim klijentom! Sretno u kreativnom razvoju!!!

Pogledajmo kako možemo spojiti ove dvije tabele po polju Kod proizvoda koristeći
konstruktor upita (kod za kreiranje privremenih tabela dat je kao primjer
Neću. Možete ga preuzeti sa gornjeg linka).

Otvorite prozor dizajnera, idite na karticu "Tabele i polja", do odjeljka
"stolovi" izaberite obe naše tabele iu sekciji "Polja" -
ona polja iz obe tabele koja želimo da vidimo kao rezultat upita.

Idite na bookmark "Veze". Dodajte novu liniju. U polju Tabela 1
sa padajuće liste izaberite tabelu sa proizvodima i u polju Tabela 2 Table
sa zemljama.

Za Tabele1 označite polje Sve. Za
Tabele2 Ne označavamo ovu kućicu. To znači da od Tabele1
svi zapisi će biti odabrani i od Tabele2 samo one za koje se izvodi
stanje veze, odnosno sa takvom kombinacijom zastavica dobijamo
LIJEVA KONEKCIJA. Zatim morate popuniti Stanje komunikacije.
Ovdje biramo polja tabele sa padajućih lista i znak za poređenje takođe iz padajućeg menija
lista.

Kao rezultat ovog povezivanja, dobijamo sljedeći tekst zahtjeva:

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product LIJEVO PRIDRUŽITE VT_Country AS VT_Country BY VT_Product.Product.Product Code = VT_Country.Product Code

Sada pogledajmo bliže neke tačke.
Pokušajmo zamijeniti potvrdni okvir Sve.


Čini se da bi na kraju trebalo da prođe RIGHT JOIN, ali ako mi
Pogledajmo tekst upita koji je generisao konstruktor, videćemo da su tabele
zamijenili mjesta, ali veza je i dalje ostala lijeva:

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Country AS VT_Country LIJEVO PRIDRUŽITE VT_Product AS VT_Product BY VT_Product.Product.Product Code = VT_Country.Product Code

Hajde da vidimo šta će se desiti ako poništimo oba polja

Kao rezultat, dobijamo internu vezu.

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product INTERNAL JOIN VT_Country AS VT_Country BY VT_Product.Product.Product Code = VT_Country.Product Code

Konačno, ako su oba polja za potvrdu označena


dobijamo punu vezu

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product FULL CONNECTION VT_Country AS VT_Country BY VT_Product.Product Code = VT_Country.Product Code

Možete navesti više redova na obeleživaču Veze. U ovom slučaju nekoliko
redovi su povezani uslovom I. Štaviše, linije nisu potrebne
svaki put ponovo vozi. Mogu se kopirati pomoću ključa F9.
I u novom redu promijenite samo uvjet veze. Ovo značajno ubrzava razvoj.
Takođe, u uslovu veze nije potrebno koristiti samo unapred definisana polja iz
padajuće liste. Možete koristiti proizvoljan izraz koji zadovoljava
1C jezik upita. Da biste to učinili, morate označiti polje besplatno
i unesite uslov direktno u polje ili otvorite pomoćni prozor
gdje možete koristiti šablone sa funkcijama jezika upita.


Naravno, u praksi postoje mnogo složeniji upiti gdje
nekoliko stolova sa različitim međusobnim vezama. Ali u kreatoru upita
mogu se reproducirati veze bilo koje složenosti.

Dizajner upita sastoji se od sljedećih kartica:

1. “Tabele i polja” - na kartici se nalaze tri hijerarhijske liste:
a. “Baza podataka” - navodi sve dostupne objekte za koje se može postaviti upit. Takođe dugme "Prikaži tablice promjena", sa kojim možete pristupiti tabelama promjena objekata informacione sigurnosti ako su registrirani za bilo koji plan razmjene.
b. “Tabele” - lista odabranih tabela prema kojima će se izvršiti upit. Takođe u ovom prozoru možete obrisati tabelu, preimenovati ili zameniti tabelu i dodati interni upit.

Možete dodeliti parametre za virtuelne tabele klikom na dugme „Parametri virtuelnih tabela“:

Preporučuje se aktivno korištenje parametara virtualnih tabela za odabir po određenim dimenzijama, jer se time povećava brzina izvršavanja upita. Možete koristiti vanjske varijable u parametrima, čijim nazivima prethodi znak “&”.
c. “Polja” - lista polja koja se biraju iz tabela. Također možete dodati izračunata polja; da biste to učinili, klikom na dugme „Dodaj“ otvara se konstruktor prilagođenog izraza:

Na lijevoj strani je prozor sa poljima koja su dostupna u izrazu. Na desnoj strani je nagovještaj korištenih funkcija. Ispod je proizvoljan izraz koji se može konstruisati. Možete koristiti vanjske parametre u izrazima; oni su označeni znakom "&", na primjer: &Period, &Datum početka
Morate biti oprezni, ako se u prozor upiše dugačak i složen izraz, koji sadrži malu sintaksičku grešku, tada će nakon klika na dugme “OK” sistem izdati upozorenje i zatvoriti prozor. Sav upisani kod će biti izgubljen, pa preporučujem da, ako niste sigurni u ispravnost izraza, uvijek spremite sadržaj u međuspremnik (Ctrl-C) prije zatvaranja konstruktora.

2. “Relacije” - na kartici su naznačene veze između tabela.

Tabela pokazuje tablice koje treba povezati, odnos između tablica koje treba povezati i uvjet povezivanja. Ako je uvjet povezivanja složen, tada možete odrediti određeni izračunati izraz i otvorit će se konstruktor prilagođenog polja.

3. “Grupiranje” - kartica pokazuje koja polja su grupisana, a koja su agregirana (zbirno).

4. Kartica “Uslovi” - navodi uslove koji se nameću zahtevu.
U uslovima, takođe možete pisati složene izraze pomoću jednostavnog konstruktora izraza i korišćenjem eksternih varijabli:

5. "Napredni"
Dodatni parametri nametnuti zahtjevu

6. “Udruženja i pseudonimi”
Na ovoj kartici možete dodijeliti pseudonime za polja, kao i upravljati upitima koji su povezani preko konstrukcija “UNITE” ili “UNITE ALL”.

7. "Naruči"
Kojim redoslijedom će biti prikazani rezultati upita?

Pažnja! Na dnu oznake možete vidjeti kvačicu "Automatsko naručivanje"- u trenutnoj verziji 1C 8.1 u ACS-u je beskorisno; štaviše, kada je potvrdni okvir označen, prilikom snimanja ACS daje grešku, tako da ga ne biste trebali koristiti.

8. "Sastav podataka"
Kartica u kojoj su definirana servisna polja za sistem kontrole pristupa. Ona igra približno istu ulogu kao kartica „Izvođač izveštaja“ u običnom dizajneru izveštaja.

A. Na kartici “Tabele” - navedene su tabele koje se koriste u upitu; možete označiti da li tabela mora biti uključena u upit tako što ćete označiti polje za potvrdu “Obavezno”. One. ako nijedno polje nije uključeno u izbor, onda ova tabela uopšte ne učestvuje u upitu. Također možete odrediti parametre za tabele.

U procesu postavljanja sistema kontrole pristupa specificiramo sve odabire, a zatim će sve vrijednosti odabira biti zamijenjene parametrima virtualnih tablica, što će nam opet pomoći da optimiziramo i ubrzamo upit.
b. Na kartici „Polja“ navedena su polja i njihovi pseudonimi koji će biti dodati na listu ACS polja.
c. “Uvjeti” - ako su odabiri specificirani u postavkama ACS-a, sve vrijednosti odabira će se dodati kao dodatni uvjeti; složeni izrazi se također mogu dodati uvjetima.

9. "Karakteristike"
Oznaka koja nema analoga u uobičajenom konstruktoru izlazne forme.

Ova kartica vam omogućava da proširite rad upita sa karakteristikama. Tabela na kartici sastoji se od nekoliko polja:
a. „Tip vrijednosti“ - tip za koji će se karakteristike odabrati. Na primjer, ako navedete “Directory Link.Nomenclature”, tada će sve karakteristike za nomenklaturu biti odabrane u upitu.
b. “Izvor” - izvor za svojstva tipova karakteristika, može biti upit ili tabela. U ovo polje možemo napisati zahtjev za odabir samo onih svojstava koja su nam potrebna.
c. “Lista karakteristika” - polje u kojem je naznačen izvor za svojstva karakteristika. Najčešće je to plan karakterističnih tipova ili zahtjev. Također morate navesti polja koja su odgovorna za “Identifier”, “Name” i “Type” svojstva.
d. “Izvor” je sljedeće polje u kojem ukazujemo na izvor vrijednosti karakteristika, što može biti i tabela ili upit.
e. “Vrijednost karakteristike” je tabela ili upit koji prima karakteristične vrijednosti. Na primjer, registar informacija “ObjectPropertyValues” može poslužiti kao tabela vrijednosti karakteristika. Takođe moramo navesti ona polja iz tabele (ili upita) koja su odgovorna za „Objekat“, „Svojstvo“ i „Vrednost“ karakteristike.
Nakon uređivanja zahtjeva, tekst zahtjeva se može vidjeti u prozoru ispod liste polja. U nastavku, pomoću polja za potvrdu „Autofill“ možemo regulirati popunjavanje dodatnih parametara za polja navedena u zahtjevu. Napominjemo da se sastav polja određuje samo u samom zahtjevu.

Informacije preuzete sa stranice

Danas ćemo razgovarati o tome kako to učiniti ugniježđeni upiti koristeći query builder. Pređimo direktno na primjer.

Recimo da imamo ovaj jednostavan registar informacija, gdje cijene pohranjuju roba i dobavljači:

Želimo zatražiti da dobijemo sve proizvode koji imaju više od jednog dobavljača. Ovo se može implementirati korištenjem sljedećeg upita:

ODABIR Broj dobavljača.Proizvod KAO proizvod IZ (IZABIR Cijena.Proizvod KAO proizvod, KOLIČINA (RAZLIČITA cijena.Dobavljač) KAO dobavljači IZ RegistraInformacije.Cijena KAO cijena GRUPA PO Cijena.Proizvod) KAO Broj dobavljača GDJE Broj dobavljača.Dobavljača > 1

Formiranje ugniježđenog upita u konstruktoru

Kreirajmo gornji zahtjev koristeći konstruktor.

Da biste to učinili, u komandnoj tabli iznad polja Stolovi pritisnite dugme Kreirajte podupit:


Nakon toga će se otvoriti prozor sa drugom instancom konstruktora upita:


I u ovom novom prozoru konstruiramo ugniježđeni upit:




Klikom na dugme Zahtjev U donjem lijevom uglu možemo vidjeti tekst podupita:


Nakon klika na dugme OK u pomoćnom konstruktoru, u glavnom prozoru dobijamo sledeću sliku:


Od fraze NestedQuery nije baš zgodno za percepciju, hajde da upotrebimo desni taster miša da preimenujemo tabelu u Broj dobavljača, izaberite polje iz njega Proizvod i na obeleživaču Uslovi Zapišimo potreban uslov:




I nakon svih ovih manipulacija, dobijamo željeni zahtjev. Ako je potrebno, možete kreirati upite sa nekoliko nivoa ugniježđenja.

Kako napraviti ugniježđeni upit od običnog upita u konstruktoru

Vrlo često dolazi do situacije kada počnete da pravite zahtjev u konstruktoru i u nekom trenutku shvatite da on mora biti ugniježđen. Naravno, u našem primjeru nema problema - možete jednostavno sve izbrisati i ponovo izdati zahtjev. Ali u praksi postoje mnogo složeniji primjeri, na primjer, sa nekoliko nivoa ugniježđenja, kada je nekoliko sati utrošeno na izradu zahtjeva. I u ovom slučaju postoji prilično jednostavan izlaz. Možete koristiti uređivač teksta upita ugrađen u dizajner. Treba koristiti dugme Zahtjev dobijte tekst zahtjeva (pogledajte sliku iznad) i kopirajte ga u međuspremnik. Zatim kreirajte novi ugniježđeni upit i ponovo pritisnite dugme Zahtjev, zalijepite tekst iz bafera, kliknite na OK. Shodno tome, čistimo stari zahtjev na najvišem nivou. Na ovaj način, ako je potrebno, možemo lako kreirati ugniježđene upite na više nivoa u hodu.

Mogućnost pisanja teksta upita "ručno" nikada nije bila "suvišna", ali je zgodnije koristiti dizajner upita.

Komentar.

Nažalost, u upravljanoj aplikaciji, ne možete koristiti dizajner upita u obradi "Upoznajte se s upitom". Možete ga koristiti u ovoj obradi prelaskom na normalan način rada, ali mi to nećemo raditi.

Kreirajmo obradu “Konstruktora zahtjeva” i definirajmo je u podsistemu “Izvještaji i obrada”.

Napravimo obrazac za obradu i dodamo u njega atribut forme "TabDoc" tipa "Tabularni dokument", kao i naredbu "Pokreni upit" sa akcijom "Pokreni upit". Zatim ih prevucite na obrazac.

U modulu forme, da bi naredba radila, pišemo proceduru:

&OnClient

Procedura Izvrši upit (naredba)

ExecuteRequestServer();

Kraj procedure

&Na serveru

Kraj procedure

Postajemo unutar procedure koja se poziva na serveru i pozivamo „Konstruktor upita sa obradom rezultata“ iz kontekstnog menija (slika 2.65).

Slika 2.65 Konstruktor upita sa obradom rezultata

Podesite vrstu obrade na „Izlaz u tabelarni dokument“ i kliknite na dugme „Dalje“ ili karticu „Tabele i polja“.

Na kartici „Tabele i polja“ dizajnera možete pogledati trenutno postojeće tabele u sistemu (lijevi dio je naslovljen „Baza podataka“) (slika 2.66).

Slika 2.67 Konstruktor upita

Tabele iz kojih će upit dobiti podatke prenose se u oblast „Tabele“, a polja koja su potrebna za upit se prenose u oblast „Polja“. Uradimo to kao na slici 2.68.

Slika 2.68 Konstruktor upita

Ovdje smo uklonili kreirano zadano polje za prikaz - “PREZENTACIJA (Product ReceiptProducts.Nomenclature)”

U svakom trenutku dok radite s dizajnerom, možete vidjeti rezultujući tekst zahtjeva. Da biste izvršili ovaj zadatak, morate kliknuti na dugme “Zahtjev” koje se nalazi u donjem lijevom kutu dizajnerskog obrasca (slika 2.69).

Tekst zahtjeva možete ručno urediti klikom na dugme “Uredi”.

Vježbajte. Kliknite na dugme “OK” i provjerite našu obradu u korisničkom modu. Ako analizirate podatke primljene prilikom izvršavanja zahtjeva, možete naići na „ponavljanje“ stavki (ako vam to ne uspije, možete kopirati i postaviti bilo koji dokument „Primanje robe“).

Vraćamo se na ExecuteRequestServer() proceduru u obradi “Request Constructor” i iz kontekstnog menija ponovo pozivamo “Konstruktor upita sa obradom rezultata”.

Ako želite „sažmiti“ rezultat upita, tada u tu svrhu možete koristiti karticu „Grupiranje“ dizajnera upita.

Prilikom definiranja grupiranja morate se pridržavati sljedećeg pravila: sva polja za odabir upita podijeljena su na polja po kojima se vrši grupisanje (konvolucija), polja ugniježđenih tabela (polja koja se zbrajaju u odnosu na ona pomoću kojih se vrši grupisanje) i agregirana funkcije. Hajde da definišemo grupisanje (slika 2.70).

Slika 2.70 Query Builder

Ako podaci primljeni zahtjevom moraju biti odabrani prema nekom uvjetu, tada će u ovom slučaju možda biti potrebno koristiti karticu „Uvjeti“. Odaberimo Prijem robeGoods.Quantity=10 (Slika 2.71).

Slika 2.71 Stanje konstruktora upita.

Imajte na umu da ako je uvjet definiran na isti način kao na slici, zahtjev neće biti izvršen.

Postoje dva načina da ispravite situaciju:

    Redefiniranjem uslova provjeravanjem oznake “P...”;

    Iskoristivši priliku za promjenu samog teksta zahtjeva (koje se dobija klikom na dugme “Uredi zahtjev”).

Sama ručna promjena sastojat će se od toga da je potrebno ukloniti simbol “&” prije broja “10”. Ovaj simbol u tekstu zahtjeva definira parametre zahtjeva, u koje se neke vrijednosti moraju upisati kasnije (ali prije izvršavanja zahtjeva). Kliknite na dugme “Uredi upit” i uredite (slika 2.72).

Slika 2.73 Uređivanje upita

Na kartici „Napredno“ možete provjeriti brojne oznake (vezane za ključnu riječ „Select“ jezika upita) i odrediti sastav tabela namijenjenih za promjenu upita (slika 2.74).

Slika 2.74 Dodatne funkcije upita

Na kartici “Pridruživanje/pseudonim” možete promijeniti nazive polja postavljanjem “Aliases”, ali to nećemo učiniti.

Na kartici „Red“ možete odrediti redosled sortiranja zapisa kao rezultat upita (slika 2.75).

Slika 2.75 Redosled sortiranja zapisa

Obratite pažnju na oznaku "Auto-order", ona se može koristiti za naručivanje po poljima referentnog tipa.

Prilikom definiranja odjeljka „Ukupni podaci“, trebali biste biti spremni na činjenicu da će se kao rezultat upita pojaviti „dodatni“ ukupni zapisi. Zajedno sa ovim zapisima, rezultat upita postaje hijerarhijski (slika 2.76).

Slika 2.76. Rezultati konstruktora upita.

Moguće je navesti nekoliko tipova zbroja:

    Elementi (odabir rezultata upita sadrži zbrojeve grupiranja i detaljne zapise);

    Hijerarhija (u izboru rezultata upita, u opštem slučaju, postoje zbirni zapisi po hijerarhiji, zbirni zapisi po grupisanju i detaljni zapisi);

    Samo hijerarhija (u odabiru rezultata upita, općenito, postoje zbirni zapisi po hijerarhiji).

Nakon klika na dugme "Ok" konstruktora, "Layout" će biti generisan i kod za ExecuteRequestServer() proceduru će biti napisan u modulu obrasca:

&Na serveru

Procedura ExecuteRequestServer()

//((QUERY_CONSTRUCTOR_WITH_RESULT_PROCESSING

// Ovaj fragment gradi konstruktor.

// Prilikom ponovnog korištenja konstruktora, promjene napravljene ručno će biti izgubljene!!!

Layout = Processing.QueryConstructor.GetLayout("Layout");

Zahtjev = Novi zahtjev;

Request.Text =

| Prijem robe Nomenklatura AS Nomenklatura,

| SUM (Prijem robe. Količina) AS količina,

| SUM(Prijem robe.Iznos) AS iznos

| Dokument.Prijem robe.Robe

| KAKO DOBITI PROIZVODE

| Prijem robe Robe. Količina > 1

|GROUP BY

| Prijem robe.Nomenklatura

|ORDER BY

| količina,

| Iznos DECREASE

| SUM (količina),

| SUM(Zbroj)

| HIJERARHIJA Nomenklature";

Rezultat = Query.Run();

HeaderArea = Layout.GetArea("Header");

AreaFooter = Layout.GetArea("Footer");

TableHeadArea = Layout.GetArea("TableHeader");

TableFooterArea = Layout.GetArea("TableFooter");

AreaNomenclatureHierarchy = Layout.GetArea("NomenclatureHierarchy");

AreaNomenclature = Layout.GetArea("Nomenklatura");

TabDoc.Clear();

TabDoc.Output(AreaHeader);

TabDoc.Output(TableHeadArea);

TabDoc.StartAutoGroupingRows();

SelectionNomenclature = Result.Select(BypassQueryResult.ByGrouping);

Dok SelectionNomenclature.Next() Loop

Ako SelectionNomenclature.RecordType() = RequestRecordType.TotalByHierarchy onda

Area = AreaNomenclatureHierarchy;

Region = Nomenklatura regije;

endIf;

Area.Parameters.Fill(SelectionNomenclature);

TabDoc.Output(Oblast, Nomenklatura selekcije.Nivo());

EndCycle;

TabDoc.FinishAutoGroupingRows();

TabDoc.Output(TableFooterArea);

TabDoc.Output(AreaFooter);

//))CONSTRUCTOR_QUERY_WITH_RESULT_PROCESSING