Pyetjet e mbivendosura në konstruktor. Konstruktorët e pyetjeve 1c kushtet e konstruktorit të pyetjeve

Pra, le të fillojmë me diçka të thjeshtë: krijoni një Përpunim të Ri në konfigurues, emërtojeni Query Console ose Query Builder, sipas dëshirës tuaj.

Mund të shtojmë menjëherë një tabelë në "Të dhënat" për Parametrat e ardhshëm që na duhen, në mënyrë që në Konsolën tonë të mos ekzekutojmë kërkesën më primitive, por me parametra dhe lidhje, për shembull, për punën tonë do të krijojmë një kërkesë për regjistrat periodikë. , por këtu pa udhëzime për parametrat=&Data askund.

Për të krijuar tabelën tonë të Parametrave, në skedën “Data” në “pjesën Tabelare” të saj do të shtojmë një tabelë të re, e quajmë Parametrat e pyetjes, këtu do të shtojmë kolonat e kësaj tabele: 1) Emri i parametrit, shkruani string = 25 karaktere; ParameterValue, këtu është një lloj i përbërë i të dhënave, shih Fig:

Prandaj, siç tregohet në foto, ne zgjedhim një lloj të përbërë për kolonën Vlera e parametrit: në menynë tip që hapet, kontrolloni kutinë "Lloji i përbërë", zgjidhni numrin, vargun (specifikoni 20 karaktere), datën, Boolean dhe kontrolloni kutia e poshtme e kontrollit – AnyLink – do të thotë çfarë vijon, kur specifikojmë Parametrat e kërkesës sonë, mund t'i referohemi çdo objekti të konfigurimit tonë, për shembull, drejtorive ose dokumenteve.

Tani duhet të krijojmë formën e Konsolës sonë të ardhshme të Query. Në përpunim, le të shkojmë te skeda "Format" dhe të shtojmë një të re. Fusim këtë formular dhe këtu tashmë ka një fushë të pakufizuar për kreativitet - mund t'i rregulloni dy detajet që sapo keni krijuar dhe një pjatë me parametra sipas dëshirës tuaj! Për ta bërë këtë, mund të përdorni elemente standarde të formës si një grup ose një faqe me faqe (nëse preferoni faqet e rrëshqitjes.

Gjëja kryesore këtu është një gjë: pasi të keni tërhequr atributin "TextValues" në fushën e majtë për modifikimin e formularit, sigurohuni që të vendosni "View"=Fusha e dokumentit të tekstit në vetitë e tij. Shih Fig.

Në vetitë e atributit "Tabela e pyetjeve", mund të specifikoni opsionalisht "Rrjeti i ekranit" dhe "Titujt e ekranit".

Më pas, në dritaren e djathtë për modifikimin e formularit, shkoni te skedari "Komanda" dhe shtoni një buton të ri, kur të klikoni, tastiera jonë do të kryejë një veprim të caktuar. Le të krijojmë një buton "Query Designer", nëse dëshironi, mund të shtoni një ikonë në butonin, gjëja kryesore është të vendosni vetë butonin në dritaren e modifikimit të formës së majtë - në mënyrë që ta shohim. Më pas në formën e duhur dritarja e redaktimit, klikoni me të djathtën në butonin tonë dhe zgjidhni pronat - në pronat, klikoni në artikullin "Veprim", do të shfaqet një dritare modale që pyet se ku do të ekzekutohet saktësisht kodi ynë i programit, të cilin do ta caktojmë në butonin - zgjidhni " Mbi klientin”.

Moduli i Formularit do të hapet me një procedurë të gatshme të zbrazët “Procedure Query Constructor (Command)”. Brenda kësaj procedure ne do të përshkruajmë thirrjen për Ndërtuesin standard të Query 1c8. Është shumë e lehtë: Konstruktor = Konstruktor i Kërkesës së Re; Por këtu ka gracka - Query Constructor i integruar në platformë funksionon në modalitetin e përdoruesit VETËM nën një klient të trashë! Prandaj, ne do të fusim kushtin e instruksionit të paraprocesorit #If, por këtu ju vendosni vetë, bazuar në platformën tuaj, ose keni forma të zakonshme, atëherë zgjidhni " Aplikacioni FatClientRegular" ose keni një platformë të bazuar në format e menaxhuara, atëherë " Aplikacioni ThickClientManaged“.shih fig.

Tani mbetet për t'i shtuar kësaj procedure një kusht për regjistrimin e tekstit të kërkesës, të cilin Ndërtuesi i pyetjeve do të krijojë për ne në detajet e formularit tonë "Teksti i kërkesës":

If Constructor.OpenModal()=True Pastaj Object.RequestText=Ndërtues.Text; fundNëse;

Por ne mund të ndryshojmë manualisht diçka në tekstin e kërkesës (në modalitetin e përdoruesit - në dritaren e atributit "Kërko tekst") në mënyrë që ndryshimet tona të futen në Konstruktorin e Query kur të thirret përsëri - ne do të shtojmë një kusht të thjeshtë këtu:

Nëse jo EmptyString(Object.QueryText) Atëherë Constructor.Text = Object.QueryText; fundNëse;

Kjo është e gjitha, ne kemi lidhur Query Constructor të integruar në platformën 1c8, le të shohim punën tonë. Për ta bërë këtë, hapni 1C: Enterprise në modalitetin e klientit të trashë duke përdorur një nga metodat e mëposhtme: 1) menyja kryesore e Konfiguratorit - Korrigjimi - Fillimi i korrigjimit - Klienti i trashë; 2) ose nëse i keni këto çelësa në panelin e kontrollit në konfigurues - thjesht shtypni butonin me një rreth të verdhë me një pikë të trashë, shihni figurën:

Modaliteti i përdoruesit të 1cEnterprise8 fillon, ne gjejmë përpunimin tonë, e nisim atë, klikojmë në butonin tonë "Query Designer" dhe shohim se si hapet projektuesi i integruar në platformë. shih fig.

Pra, ne kemi Konstruktorin e Query në funksion, mund të fillojmë të bashkojmë pyetjen tonë të ardhshme në të, por ne jemi të interesuar të shohim se si do të funksionojë pyetja që krijuam! Dhe për ta bërë këtë, duhet të krijojmë një buton tjetër në konfigurues kur redaktoni formën e tastierës sonë, le ta quajmë "Run Query". Në vetitë e butonit "Run Query", klikoni në "Veprim", shfaqet përsëri një menu në të cilën pyetemi se ku do të përpunohet kodi ynë i programit, në këtë rast zgjedhim "Si në klient dhe në server", përsëri e gjejmë veten në Modulin e Formave.

Në procedurën Execute Query(), të cilën e kemi te klienti, do të shkruajmë një kusht nëse përdoruesi nuk e ka futur tekstin e pyetjes, por kërkon ta ekzekutojë atë:

Nëse EmptyString(Object.QueryText) Pastaj raportoni("Futni tekstin e pyetjes!"); fundNëse;

Sistemi tashmë ka krijuar automatikisht një lidhje me procedurën Execute RequestOnServer(); – kjo është mirë, le të shkojmë te kjo procedurë, e cila ekzekutohet në server dhe të shkruajmë këtu kodin për ekzekutimin e kërkesës sonë të futur.

Këtu ka opsione: Ju mund t'i shkruani vetë të gjitha shprehjet që lidhen me ndërtimin e pyetjeve, d.m.th. me dorë, por ekziston një mundësi edhe më e thjeshtë - brenda procedurës, kliko me të djathtën dhe në menunë rënëse zgjidhni "Krijuesi i pyetjeve me përpunimin e rezultateve, shikoni figurën":

Nëse keni klikuar në artikullin "Krijuesi i pyetjeve me përpunimin e rezultateve", do të shfaqet një dritare modale "Teksti i pyetjes nuk u gjet. Krijo një të ri?", klikoni po. Do të hapet projektuesi i integruar i pyetjeve, në të cilin në skedën e tij të parë "Përpunimi i rezultatit" - zgjidhni artikullin e parë " Duke anashkaluar rezultatin". Kjo është e gjitha, ne nuk kemi nevojë për asgjë tjetër nga ky konstruktor, klikoni në butonin "Ok" - do të shfaqet një dritare modale "Nuk janë zgjedhur fusha në kërkesë, klikoni "Ok".

Pas kësaj, shablloni i gatshëm i mëposhtëm do të shfaqet brenda procedurës sonë ExecuteRequestOnServer():

Le të kalojmë te shprehja e ndërtuar nga konstruktori:

Kërkesë.Text = "";

Kërkesë.Text = Objekt.KërkesëText;

Kjo është sa e thjeshtë është, butoni ynë "Ekzekutoni kërkesën" në formularin e përpunimit është tashmë praktikisht funksional, deri më tani ai mund të përpunojë vetëm kërkesa të thjeshta pa parametra, por gjëja kryesore është se funksionon! E tëra që mbetet është të shfaqim vizualisht rezultatet e kërkesës sonë në atributin "Tabela e vlerës" në formularin e përpunimit. Më lejoni t'ju kujtoj se atributi ynë "Tabela e vlerave" është i llojit "Dokument tabelor", sepse përndryshe nuk do t'i shohim rezultatet tona në modalitetin e përdoruesit. Shfaqja e të dhënave tabelare te përdoruesi bëhet gjithmonë ose nga një Dokument Tabular ose një Layout. Unë do të doja shumë që të ishte e mundur të shfaqeshin të dhënat përmes një tabele vlerash - pasi është shumë e lehtë për t'u përdorur dhe e njohur, por , për fat të keq, një tabelë vlerash është vetëm një mjet që i nevojitet një zhvilluesi, nuk mund të shfaqësh të dhëna në ekran duke e përdorur atë ...

Le të hedhim një vështrim më të afërt se çfarë është një Dokument Spreadsheet - është si një fletë Excel - ju mund të arrini në një rekord në një qelizë specifike vetëm duke përdorur qelizat e tabelës, këtu ne i quajmë ato një zonë, por ne vetë mund të zgjedhim gamën e kësaj zone në një qelizë specifike:

Pra, ne kuptuam se çfarë është një dokument i fletëllogaritës dhe përcaktuam për veten tonë se do të na duhet të përcaktojmë të dhënat nga pyetja jonë në një qelizë specifike të këtij dokumenti të fletëllogaritës. Por le të mendojmë: cili është "Rezultati i pyetjes" që projektuesi gjeneroi kaq shpejt për ne? Hapni ndihmën - Rezultati i pyetjes është një tabelë që ka vetitë e duhura! shih fig.

Dhe nëse tani shkruajmë pas shprehjes Query Result = Query.Execute(); (krijuar nga konstruktori), këtu është një cikël kaq i thjeshtë për Koleksionet:

Për çdo Emri i Kolonës Nga Rezultati i Pyetjes.Raporti i ciklit të kolonave(Emri i kolonës.Emri); Cikli i Fundit;

Pas këtij cikli, shënoni tani për tani të gjitha shprehjet e ndërtuara automatikisht nga konstruktori. Dhe ekzekutoni 1C:Enterprise8 nën klientin e trashë. Krijoni çdo pyetje të thjeshtë (Ju mund të përdorni Query Builder - tashmë funksionon për ne) dhe klikoni në butonin "Run Query":

Do të shihni në fund të dritares së mesazhit që tabela e rezultatit të pyetjes ruan emrat e fushave që sapo kemi zgjedhur duke krijuar një pyetje të thjeshtë.

Tani le të shfaqim këta emra të fushave të vuajtjeve tona në një dokument Spreadsheet:

Për çdo Emri i Kolonës Nga Rezultati i Kërkesës.Columns Loop Cell=Object.QueryTable.Area(1,QueryResult.Columns.Index(ColumnName)+1); Cell.Text=Emri i kolonës.Emri; Cikli i Fundit;

Për të shfaqur detajet e të dhënave të pyetjes, le të analizojmë shprehjet e krijuara automatikisht nga projektuesi dhe të fusim në ciklin e renditjes "SelectionDetailedRecords" të vetë pyetjes saktësisht të njëjtin lak që kemi përdorur për të shfaqur emrat e kolonave, vetëm tani duhet të transferojmë jo të dhënat nga tabela "Rezultati i pyetjes" në tekstin e qelizës. dhe të dhënat e vetë Përzgjedhjes, le të shohim në ndihmë se si mund të hyni në fushën e Zgjedhjes së Detajuar të kërkesës:

SelectionDetailRecords = QueryResult.Select(); Ndërsa SelectionDetailedRecords.Next() Loop //në rreshtin e parë tashmë kemi të shkruar emrat e kolonave të tabelës, kështu që ngarkojmë të dhënat poshtë vijës së parëDocRowNumber=Object.QueryTable.TableHeight+1; Për çdo Emri i Kolonës Nga Rezultati i Kërkesës.Cikli i Kolonave Cell=Object.QueryTable.Area(Numri i Dokumentit,Rezultati Query.Columns.Index(Emri i kolonës)+1); Cell.Text = SelectionDetailedRecords[Emri i kolonës.Name]; Cikli i Fundit; Cikli i Fundit;

Kjo është e gjitha, ne mund të kontrollojmë, të ngarkojmë ndërmarrjen nën një klient të trashë, të futim një kërkesë të thjeshtë pa parametra, të klikojmë në butonin "Run Query", shiko figurën:

Urra, gjithçka funksionon!!!

Është shumë i përshtatshëm kur, kur hapni/mbyllni Konsolën e pyetjeve, teksti ynë i pyetjes, me të cilin kemi punuar përpara mbylljes së konsolës, shkruhet përsëri në fushën "Teksti i pyetjes". Për ta bërë këtë, ju vetëm duhet të aktivizoni vetinë e formës = AutoSave, shikoni fig:

Kjo është e gjitha, konsola jonë po funksionon. Në mënyrë që të mund të shkruajmë pyetje më komplekse me parametrat e specifikuar në to, duhet të krijojmë një buton tjetër "Gjej parametrat", si dhe kodin për butonin "Run Query" - kodi për butonin "Gjej parametrat" ​​do të ekzekutohet. në klient dhe në server. Më pas, në procedurën e serverit, ne e nisim kërkesën në të njëjtën mënyrë me tekstin e kaluar në të nga dritarja "Kërkesë Teksti", duke përdorur shprehjen "Request.FindParameters()" gjejmë parametrat e kaluar dhe thjesht i futim në një futeni në pjesën tabelare të formularit "Parametrat e kërkesës". Mos harroni t'i transferoni ato nga tabela e plotësuar e parametrave në procedurën "Run Query".

Ju gjithashtu mund të shtoni disa butona në konsolën tonë që do të pastrojnë dritaren e Parametrave dhe dritaren "Kërkoni tekstin" në modalitetin e përdoruesit.

Konsola jonë e pyetjeve është gati për t'u përdorur, ju uroj zgjidhje të suksesshme krijuese duke përdorur një mjet kaq të thjeshtë dhe të fuqishëm siç është Konsola e Query!

Ky përpunim është shkruar në platformën 1c8.3 (forma të menaxhuara) dhe funksionon nën një klient të trashë. Mund të shkruhet gjithashtu në platformën 1c8.2, si në forma të rregullta ashtu edhe nën ato të menaxhuara.

Shkarkimi përmban një mostër të Konsolës së Query që sapo krijuam.

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

Përmirësimi i "Kuery Console":

1) Tani Konsola jonë e bërë në shtëpi me Query Builder do të funksionojë nën çdo klient: nën një klient të trashë të formave të rregullta dhe të menaxhuara dhe nën një klient të hollë dhe në internet.

p.s. Forma dhe pamja e Query Builder-it të integruar është e ndryshme - në varësi të cilit klient e kemi lançuar Konsolën tonë. (Unë personalisht jam më i njohur dhe më i përshtatshëm me formën e Query Builder nën një klient të trashë)

&Në Konstruktorin e pyetjeve të procedurës së klientit (Komanda) //Thirrja e Konstruktorit standard të Query është e mundur vetëm nën një klient të trashë #If ThickClientManagedApplication ose ThickClientNormalApplication then Constructor=New Query Constructor; Nëse jo EmptyString(Object.QueryText) Atëherë Constructor.Text = Object.QueryText; fundNëse; If Constructor.OpenModal()=True Pastaj Object.RequestText=Ndërtues.Text; fundNëse; // #Else // Report ("Thirrja e Query Builder është e mundur vetëm nën një klient të trashë"); // Kthimi; //# EndIf #Else Report("Ju po ekzekutoni Query Builder nën një klient të hollë - ai ndryshon pak në formën dhe shpejtësinë e performancës!"); Konstruktor = New QueryConstructor(); Nëse jo EmptyString(Object.QueryText) Atëherë Constructor.Text = Object.QueryText; fundNëse; Sinjalizim i konstruktorit = Përshkrim i ri i alarmit ("RunAfterClosingConstructor", ThisForm); Constructor.Show(Constructor Alert); # EndIf Fundi i Procedurës &Në Procedurën e Klientit ExecuteAfterClosingConstructor(Rezultati, ConstructorParameters) Eksporto //Rezultat=tekst, nëse Konstruktori u mbyll duke përdorur butonin ok Object.RequestText = ShkurtuarLP(Rezultat); //punon!!! Fundi i procedurës

2) Shtoi aftësinë në Konsolën tonë të thjeshtë të Query për të futur pyetje komplekse me një tabelë të përkohshme të kaluar te parametrat!!! Mekanizmi doli të ishte shumë i thjeshtë dhe elegant - pa përdorur kodin XML, siç bëhet në tastierat profesionale.

Ju mund të shihni vetë kodin dhe procedurat për mekanizmin e transferimit në parametrat e tabelave të përkohshme në skedarin e dytë të bashkangjitur. Si fillova të zhvilloj versionin tim të tabelave të përkohshme në parametra mund ta gjeni në këtë lidhje https://forum.infostart.ru/forum9/topic183700/

Tani si të përdorim Konsolën për një pyetje komplekse kur një tabelë e përkohshme kalon në parametrat e saj. Për shembull, mund të merrni kodin e kësaj kërkese;

SELECT ExternalData.Product, ExternalData.Sasia PLACE Eternal Data FROM &ExternalData AS External Data; ///////////////////////////////////////////////////////////////// ////////////////////////// ZGJIDHni të dhëna të jashtme.Produkt, të dhëna të jashtme.Sasi, ISNULL(RemainingProductRemaining.QuantityRemaining, 0) AS Field1, ISNULL(E mbetur Produktet e mbetura.Sasia e mbetur, 0) - Të dhënat e jashtme. Sasia SI e mbetur NGA Të dhënat e jashtme AS të dhëna të jashtme LEFT JOIN Regjistro akumulimet. Produktet e mbetura. kanal = RemainingProductRemaining . Produkt

Bazuar në shembullin dhe ngjashmërinë e kodit të mësipërm të pyetjes, ju mund të krijoni pyetjen tuaj komplekse, duke marrë parasysh objektet tuaja të të dhënave.

Pra, në projektuesin e pyetjes krijuam pyetjen e mësipërme, duke mbyllur Konstruktorin - teksti i pyetjes do të shkojë në fushën tonë të konsolës "Teksti i pyetjes", klikoni në butonin "Gjej parametrat", shohim që në tabelën e Parametrave është shfaqur një rresht. = “Të dhënat e jashtme”, Lloji i vlerës = “Tabela e vlerave” ,shih fig.

Në këtë tabelë të Parametrave - shkruani parametrin Data, për shembull, datën e sotme, pastaj klikoni për të provuar të redaktoni parametrin tonë të përkohshëm të tabelës "Të dhënat e jashtme", klikoni në fushën me "Tabela e vlerave" në tre pika - një përzgjedhje llojesh do të shfaqet, klikoni Rreshti, mekanizmi ynë na kthen faqen në formular, ku duhet të fusim manualisht këtë tabelë shumë të përkohshme.

Vini re këtu se në këtë rast, në faqen "Tabelat kohore" në fund në fushën "Emri i tabelës së përkohshme në parametrat", do të shfaqet emri i tabelës sonë të përkohshme (ajo është kopjuar nga tabela e Parametrave).

Deri më tani, në faqen "Tabelat e kohës" shohim vetëm një tabelë bosh - kjo është tabela e Llojeve të tabelës sonë të përkohshme të ardhshme. Duke përdorur butonin "Shto", do të shtojmë emrin e detajeve dhe llojin e tabelës së ardhshme. . Kini kujdes - emri dhe lloji duhet të përputhen me atë që kemi specifikuar në kërkesën për &ExternalData:

Tani shtypim butonin "Përditëso tabelën e përkohshme" - dhe këtu do të kemi një tabelë të dytë - do ta mbushim drejtpërdrejt me të dhënat e përkohshme të tabelës përmes butonit "Shto".

Kjo është e gjitha, ne mund ta kontrollojmë veten edhe një herë nëse kemi futur të dhënat primitive të parametrave të pyetjes në tabelën e parametrave në faqen e parë të përpunimit dhe klikojmë butonin "Run Query" - gjithçka llogaritet dhe zgjidhet në përputhje me rrethanat me kufizimi i të dhënave të kaluara në parametrin e tabelës sonë të përkohshme

p.s. Nëse keni bërë një gabim kur shkruani emrin e detajeve dhe llojet e tyre (në tabelën e parë) - thjesht mbyllni Konsolën dhe hapeni përsëri - tabela e përkohshme e të dhënave do të fshihet - dhe tabela Llojet mund të modifikohet përsëri dhe një Tabela e re e të dhënave mund të krijohet përsëri.

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

Kjo është e gjitha, ne mund të krijojmë një mjet pune shumë të fuqishëm me duart tona, përveç kësaj, tastiera jonë është ende shumë e shpejtë në krahasim me ato profesionale - dhe ky është një plus shumë i madh për zhvilluesit! Dhe, sigurisht, tani tastiera jonë funksionon nën çdo klient! Suksese ne zhvillimet tuaja krijuese!!!

Le të shohim se si mund t'i bashkojmë këto dy tabela sipas fushës Kodi i produktit duke përdorur
konstruktori i pyetjes (kodi për krijimin e tabelave të përkohshme jepet si shembull
Unë nuk do. Mund ta merrni nga lidhja e mësipërme).

Hapni dritaren e projektuesit, shkoni te skeda "Tabelat dhe fushat", në seksion
"Tavolina" zgjidhni të dyja tabelat tona dhe në seksionin "Fushat" -
ato fusha nga të dyja tabelat që duam t'i shohim si rezultat i pyetjes.

Shkoni te faqeshënuesi "Lidhjet". Shto një linjë të re. Në fushë Tabela 1
nga lista rënëse zgjidhni tabelën me produktet dhe në fushë Tabela 2 Tabela
me vendet.

Për Tabelat 1 kontrolloni kutinë Të gjitha. Për
Tabelat 2 Ne nuk e kontrollojmë këtë kuti. Kjo do të thotë se nga Tabelat 1
të gjitha të dhënat do të zgjidhen, dhe nga Tabelat 2 vetëm ato për të cilat kryhet
kushti i lidhjes, domethënë, me një kombinim të tillë flamujsh marrim
LIDHJA E MIRË. Tjetra ju duhet të plotësoni Gjendja e komunikimit.
Këtu ne zgjedhim fushat e tabelës nga listat rënëse dhe shenjën e krahasimit gjithashtu nga drop-down
listë.

Si rezultat i kësaj lidhjeje, marrim tekstin e mëposhtëm të kërkesës:

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product LEFT JOIN VT_Country AS VT_Country BY VT_Product.Kodi i produktit = VT_Country.Product

Tani le të hedhim një vështrim më të afërt në disa pika.
Le të përpiqemi të ndërrojmë kutinë e zgjedhjes Të gjitha.


Duket se në fund duhet të funksionojë BASHKOHUNI DREJTË, por nëse ne
Le të shohim tekstin e pyetjes të krijuar nga konstruktori, do të shohim se tabelat
këmbyen vendet, por lidhja mbeti ende e majtë:

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Country AS VT_Country LEFT BASHKOHU VT_Product AS VT_Product BY VT_Product.Kodi i produktit = VT_Country.Product

Le të shohim se çfarë ndodh nëse zgjidhim të dyja kutitë

Si rezultat, ne kemi një lidhje të brendshme.

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.Kodi i produktit = VT_Country.Product.

Së fundi, nëse të dyja kutitë e kontrollit janë të kontrolluara


kemi një lidhje të plotë

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product LIDHJA E PLOTË VT_Country AS VT_Country BY VT_Product.Kodi i produktit = VT_Country.Product

Mund të specifikoni disa rreshta në një faqeshënues Lidhjet. Në këtë rast, disa
rreshtat janë të lidhur sipas gjendjes DHE. Për më tepër, linjat nuk janë të nevojshme
futeni përsëri çdo herë. Ato mund të kopjohen duke përdorur çelësin F9.
Dhe në linjën e re, ndryshoni vetëm gjendjen e lidhjes. Kjo përshpejton ndjeshëm zhvillimin.
Gjithashtu, në gjendjen e lidhjes nuk është e nevojshme të përdoren vetëm fushat e paracaktuara nga
listat rënëse. Ju mund të përdorni një shprehje arbitrare që kënaq
Gjuha e pyetjes 1C. Për ta bërë këtë, duhet të kontrolloni kutinë falas
dhe futeni gjendjen direkt në fushë, ose hapni një dritare ndihmëse
ku mund të përdorni shabllone me funksione të gjuhës së pyetjes.


Sigurisht, në praktikë ka pyetje shumë më komplekse ku
disa tabela me lidhje të ndryshme ndërmjet njëra-tjetrës. Por në ndërtuesin e pyetjeve
lidhjet e çdo kompleksiteti mund të riprodhohen.

Projektuesi i pyetjeve përbëhet nga skedat e mëposhtme:

1. "Tabelat dhe fushat" - ka tre lista hierarkike në skedën:
a. "Baza e të dhënave" - ​​liston të gjitha objektet e disponueshme për të cilat mund të bëhet një pyetje. Gjithashtu butoni "Shfaq tabelat e ndryshimit", me të cilat mund të aksesoni tabelat e ndryshimeve të objekteve të sigurisë së informacionit nëse ato janë të regjistruara për ndonjë plan shkëmbimi.
b. "Tabelat" - një listë e tabelave të zgjedhura në të cilat do të ekzekutohet pyetja. Gjithashtu në këtë dritare mund të fshini një tabelë, të riemërtoni ose zëvendësoni një tabelë dhe të shtoni një pyetje të brendshme.

Ju mund të caktoni parametra për tabelat virtuale duke klikuar në butonin "Parametrat e tabelave virtuale":

Rekomandohet të përdorni në mënyrë aktive parametrat e tabelave virtuale për zgjedhje sipas dimensioneve të caktuara, pasi kjo rrit shpejtësinë e ekzekutimit të pyetjes. Ju mund të përdorni variabla të jashtëm në parametra, emrat e të cilëve paraprihen nga shenja "&".
c. "Fushat" - një listë e fushave që zgjidhen nga tabelat. Ju gjithashtu mund të shtoni fusha të llogaritura; për ta bërë këtë, duke klikuar butonin "Shto" hap konstruktorin e shprehjes me porosi:

Në të majtë është një dritare me fushat e disponueshme në shprehje. Në të djathtë është një aluzion i funksioneve të përdorura. Më poshtë është një shprehje arbitrare e ndërtueshme. Ju mund të përdorni parametra të jashtëm në shprehje; ato shënohen me shenjën "&", për shembull: &Periudha, &Data e fillimit
Duhet të keni kujdes, nëse në dritare shtypet një shprehje e gjatë dhe komplekse, e cila përmban një gabim të vogël sintaksor, atëherë pasi të klikoni butonin "OK", sistemi do të lëshojë një paralajmërim dhe do të mbyllë dritaren. I gjithë kodi i shtypur do të humbet, kështu që ju rekomandoj që nëse nuk jeni të sigurt për saktësinë e shprehjes, atëherë gjithmonë ruani përmbajtjen në kujtesën e fragmenteve (Ctrl-C) përpara se të mbyllni konstruktorin.

2. "Marrëdhëniet" - në skedën, tregohen lidhjet midis tabelave.

Tabela tregon tabelat që do të lidhen, marrëdhënien midis tabelave që do të lidhen dhe gjendjen e lidhjes. Nëse gjendja e lidhjes është komplekse, atëherë mund të specifikoni një shprehje të caktuar të llogaritur dhe do të hapet konstruktori i fushës me porosi.

3. "Grupimi" - skeda tregon se cilat fusha janë të grupuara dhe cilat janë grumbulluar (përmbledhur).

4. Skeda “Kushtet” - liston kushtet që i vendosen kërkesës.
Në kushte, ju gjithashtu mund të shkruani shprehje komplekse duke përdorur konstruktorin e shprehjes së thjeshtë dhe duke përdorur ndryshore të jashtme:

5. "E avancuar"
Parametra shtesë të vendosura në kërkesë

6. “Shoqatat dhe pseudonimet”
Në këtë skedë mund të caktoni pseudonime për fushat, si dhe të menaxhoni pyetjet që janë të lidhura përmes konstruksioneve "UNITE" ose "UNITE ALL".

7. "Urdhëroj"
Në çfarë rendi do të shfaqen rezultatet e pyetjes?

Kujdes! Në fund të faqerojtësit mund të shihni një shenjë kontrolli "porosi automatike"- në versionin aktual të 1C 8.1 në ACS, është i padobishëm; për më tepër, kur kontrollohet kutia e kontrollit, gjatë regjistrimit, ACS jep një gabim, kështu që nuk duhet ta përdorni.

8. "Përbërja e të dhënave"
Skeda në të cilën janë përcaktuar fushat e shërbimit për sistemin e kontrollit të aksesit. Ai luan përafërsisht të njëjtin rol si skeda "Raport Builder" në një projektues të rregullt raportesh.

A. Në skedën "Tabelat" - renditen tabelat e përdorura në pyetje; ju mund të tregoni nëse tabela duhet të përfshihet në pyetje duke kontrolluar kutinë e kontrollit "Kërkohet". Ato. nëse asnjë fushë nuk përfshihet në përzgjedhje, atëherë kjo tabelë nuk merr pjesë fare në pyetje. Ju gjithashtu mund të specifikoni parametrat për tabelat.

Në procesin e konfigurimit të sistemit të kontrollit të hyrjes, ne specifikojmë çdo përzgjedhje, atëherë të gjitha vlerat e përzgjedhjes do të zëvendësohen në parametrat e tabelave virtuale, të cilat përsëri do të na ndihmojnë të optimizojmë dhe përshpejtojmë pyetjen.
b. Në skedën "Fushat", renditen fushat dhe pseudonimet e tyre që do të shtohen në listën e fushave ACS.
c. "Kushtet" - nëse zgjedhjet janë të specifikuara në cilësimet ACS, të gjitha vlerat e përzgjedhjes do të shtohen si kushte shtesë; shprehjet komplekse gjithashtu mund të shtohen në kushte.

9. "Karakteristikat"
Një faqeshënues që nuk ka analog në konstruktorin e zakonshëm të formës së daljes.

Kjo skedë ju lejon të zgjeroni punën e pyetjeve me karakteristika. Tabela në skedë përbëhet nga disa fusha:
a. "Lloji i vlerës" - lloji për të cilin do të zgjidhen karakteristikat. Për shembull, nëse specifikoni "Directory Link.Nomenklature", atëherë të gjitha karakteristikat për nomenklaturën do të zgjidhen në pyetje.
b. "Burimi" - burimi për vetitë e llojeve karakteristike, mund të jetë një pyetje ose një tabelë. Në këtë fushë mund të shkruajmë një kërkesë për të zgjedhur vetëm ato prona që na duhen.
c. "Lista e karakteristikave" - ​​një fushë në të cilën tregohet burimi për vetitë e karakteristikave. Më shpesh ky është një plan i llojeve karakteristike ose një kërkesë. Ju gjithashtu duhet të specifikoni fushat që janë përgjegjëse për "Identifikuesin", "Emrin" dhe "Llojin" e pronës.
d. “Burimi” është fusha tjetër në të cilën tregojmë burimin e vlerave karakteristike, të cilat gjithashtu mund të jenë një tabelë ose një pyetje.
e. "Vlera karakteristike" është një tabelë ose pyetje që merr vlera karakteristike. Për shembull, regjistri i informacionit "ObjectPropertyValues" mund të shërbejë si një tabelë e vlerave të karakteristikave. Ne gjithashtu duhet të tregojmë ato fusha nga tabela (ose pyetja) që janë përgjegjëse për "Objektin", "Pronën" dhe "Vlerën" e karakteristikës.
Pas redaktimit të kërkesës, teksti i kërkesës mund të shihet në dritaren nën listën e fushave. Më poshtë, me kutinë e kontrollit "Autofill", ne mund të rregullojmë plotësimin e parametrave shtesë për fushat e specifikuara në kërkesë. Ju lutemi vini re se përbërja e fushave përcaktohet vetëm në vetë kërkesën.

Informacioni i marrë nga faqja

Sot do të flasim se si të bëjmë pyetjet e mbivendosura duke përdorur ndërtues pyetjesh. Le të kalojmë drejtpërdrejt në një shembull.

Le të themi se kemi këtë regjistër të thjeshtë informacioni, ku çmimet ruhen nga mallrat dhe furnitorët:

Ne duam të kërkojmë të marrim të gjitha produktet që kanë më shumë se një furnizues. Kjo mund të zbatohet duke përdorur pyetjen e mëposhtme:

SELECT Numri i Furnizuesve.Produkti AS Produkt NGA (ZGJIDHni Çmimin.Produkti AS Produkt, SASI (Çmim NDRYSHEM. Furnizues) AS Furnizues NGA RegjistriInformacion.Çmimi SI Çmim GRUPI SIPAS Çmimi.Produkti) AS Numri i Furnizuesve WHERE Numri i Furnizuesve1.

Formimi i një pyetjeje të mbivendosur në konstruktor

Le të krijojmë kërkesën e mësipërme duke përdorur konstruktorin.

Për ta bërë këtë, në panelin e komandës mbi fushë Tabelat Shtyp butonin Krijo një nënpyetje:


Pas së cilës do të hapet një dritare me një shembull tjetër të konstruktorit të pyetjes:


Dhe në këtë dritare të re ne ndërtojmë një pyetje të mbivendosur:




Duke klikuar butonin Kërkesë Në këndin e poshtëm të majtë mund të shohim tekstin e nënpyetjes:


Pasi të klikojmë butonin OK në konstruktorin ndihmës, marrim foton e mëposhtme në dritaren kryesore:


Që nga fraza NestedQuery jo shumë i përshtatshëm për perceptim, le të përdorim butonin e djathtë të miut për të riemërtuar tabelën në Numri i Furnizuesve, zgjidhni një fushë prej saj Produkt dhe në faqerojtësin Kushtet Le të shkruajmë kushtin e nevojshëm:




Dhe pas gjithë këtyre manipulimeve, ne marrim kërkesën e dëshiruar. Nëse është e nevojshme, mund të krijoni pyetje me disa nivele foleje.

Si të bëni një pyetje të mbivendosur nga një pyetje e rregullt në konstruktor

Shumë shpesh lind një situatë kur filloni të bëni një kërkesë në konstruktor dhe në një moment e kuptoni se ajo duhet të jetë e futur. Sigurisht, në shembullin tonë nuk ka asnjë problem - thjesht mund të fshini gjithçka dhe të ri-lëshoni kërkesën. Por në praktikë, ka shembuj shumë më kompleksë, për shembull, me disa nivele foleje, kur u shpenzuan disa orë për të bërë kërkesën. Dhe në këtë rast ka një rrugëdalje mjaft të thjeshtë. Ju mund të përdorni redaktuesin e tekstit të pyetjes të integruar në projektues. Duhet të përdorni një buton Kërkesë merrni tekstin e kërkesës (shih foton më lart) dhe kopjojeni atë në kujtesën e fragmenteve. Më pas, krijoni një pyetje të re të mbivendosur dhe shtypni përsëri butonin Kërkesë, ngjisni tekstin nga buffer, klikoni OK. Prandaj, ne pastrojmë kërkesën e vjetër në nivelin më të lartë. Në këtë mënyrë, nëse është e nevojshme, ne mund të krijojmë lehtësisht pyetje të ndërthurura me shumë nivele.

Aftësia për të shkruar tekstin e pyetjes "me dorë" nuk ka qenë kurrë "e tepërt", por është më e përshtatshme të përdoret një projektues pyetjesh.

Komentoni.

Fatkeqësisht, në një aplikacion të menaxhuar, nuk mund të përdorni projektuesin e pyetjeve në përpunimin "Njohuni me pyetjen". Mund ta përdorni në këtë përpunim duke kaluar në modalitetin normal, por ne nuk do ta bëjmë këtë.

Le të krijojmë përpunimin “Request Constructor” dhe ta përcaktojmë atë në nënsistemin “Raportet dhe Përpunimi”.

Le të krijojmë një formular përpunimi dhe të shtojmë në të atributin e formës "TabDoc" të llojit "Dokument tabelor", si dhe komandën "Run Query" me veprimin "Run Query". Më pas, tërhiqni ato në formë.

Në modulin e formës, që komanda të funksionojë, ne shkruajmë një procedurë:

&OnClient

Procedura Ekzekutimi i pyetjes (Komanda)

ExecuteRequestServer();

Fundi i procedurës

&Në server

Fundi i procedurës

Ne futemi brenda procedurës së thirrur në server dhe thërrasim “Konstruktorin e pyetjeve me përpunim të rezultateve” nga menyja e kontekstit (Figura 2.65).

Figura 2.65 Konstruktori i pyetjeve me përpunim të rezultateve

Cakto llojin e përpunimit në "Dalje në një dokument spreadsheet" dhe kliko ose butonin "Tjetër" ose skedën "Tabelat dhe Fushat".

Në skedën "Tabelat dhe Fushat" të projektuesit, mund të shikoni tabelat ekzistuese aktualisht në sistem (pjesa e majtë titullohet "Baza e të dhënave") (Figura 2.66).

Figura 2.67 Konstruktori i pyetjeve

Tabelat nga të cilat pyetja do të marrë të dhëna transferohen në zonën "Tabelat"; fushat e kërkuara nga pyetja transferohen në zonën "Fushat". Le ta bëjmë si në figurën 2.68.

Fig 2.68 Konstruktori i pyetjeve

Këtu kemi hequr fushën e paracaktuar të pamjes së krijuar - "PARAQITJA (Product ReceiptProducts.Nomenklature)"

Në çdo kohë gjatë punës me projektuesin, mund të shikoni tekstin e kërkesës që rezulton. Për të kryer këtë detyrë, duhet të klikoni butonin "Kërkesë" që ndodhet në këndin e poshtëm të majtë të formularit të projektuesit (Figura 2.69).

Mund ta modifikoni manualisht tekstin e kërkesës duke klikuar në butonin "Ndrysho".

Praktikoni. Klikoni butonin "OK" dhe kontrolloni përpunimin tonë në modalitetin e përdoruesit. Nëse analizoni të dhënat e marra gjatë ekzekutimit të kërkesës, mund të hasni në "përsëritje" të artikujve (nëse kjo nuk ju funksionon, atëherë mund të kopjoni dhe postoni çdo dokument "Pranimi i Mallrave").

Ne i kthehemi procedurës ExecuteRequestServer() në përpunimin “Request Constructor” dhe nga menyja e kontekstit përsëri thërrasim “Query Constructor with result processing”.

Nëse dëshironi të "kolapsoni" rezultatin e një pyetjeje, atëherë për këtë qëllim mund të përdorni skedën "Grupimi" të projektuesit të pyetjes.

Kur përcaktoni grupimet, duhet t'i përmbaheni rregullit të mëposhtëm: të gjitha fushat e përzgjedhjes së pyetjeve ndahen në fusha me të cilat kryhet grupimi (konvolucioni), fushat e tabelave të ndërlidhura (fushat që përmblidhen në lidhje me ato me të cilat kryhet grupimi) dhe agregate. funksione. Le të përcaktojmë grupimet (Figura 2.70).

Figura 2.70 Ndërtuesi i pyetjeve

Nëse të dhënat e marra nga kërkesa duhet të zgjidhen sipas ndonjë kushti, atëherë në këtë rast mund të jetë e nevojshme të përdorni skedën "Kushtet". Le të zgjedhim Goods ReceiptGoods.Sasia=10 (Figura 2.71).

Figura 2.71 Kushti i konstruktorit të pyetjeve.

Ju lutemi vini re se nëse kushti përcaktohet në të njëjtën mënyrë si në figurë, kërkesa nuk do të ekzekutohet.

Ka dy mënyra për të korrigjuar situatën:

    Duke ripërcaktuar kushtin duke kontrolluar flamurin “P...”;

    Duke përfituar nga mundësia për të ndryshuar vetë tekstin e kërkesës (i marrë duke klikuar në butonin "Kërkesë redaktimi").

Vetë ndryshimi manual do të konsistojë në faktin se është e nevojshme të hiqni simbolin "&" para numrit "10". Ky simbol në tekstin e kërkesës përcakton parametrat e kërkesës, në të cilat disa vlera duhet të shkruhen më vonë (por përpara ekzekutimit të kërkesës). Klikoni në butonin "Edit Query" dhe modifikoni (Figura 2.72).

Figura 2.73 Redaktimi i një pyetjeje

Në skedën "Advanced", mund të kontrolloni një numër flamujsh (në lidhje me fjalën kyçe "Zgjidh" të gjuhës së pyetjes) dhe të përcaktoni përbërjen e tabelave të destinuara për ndryshimin e pyetjes (Figura 2.74).

Figura 2.74 Funksionet shtesë të pyetjes

Në skedën "Bashkohet/Aliases", ju mund të ndryshoni emrat e fushave duke vendosur "Aliases", por ne nuk do ta bëjmë këtë.

Në skedën "Order", mund të përcaktoni rendin e renditjes së të dhënave si rezultat i pyetjes (Figura 2.75).

Figura 2.75 Renditja e renditjes së regjistrimeve

Kushtojini vëmendje flamurit "Auto-order", ai mund të përdoret për të porositur sipas fushave të një lloji referimi.

Kur përcaktoni seksionin "Totalet", duhet të jeni të përgatitur për faktin që të dhënat totale "shtesë" do të shfaqen si rezultat i pyetjes. Së bashku me këto regjistrime, rezultati i pyetjes bëhet hierarkik (Figura 2.76).

Figura 2.76.Rezultatet e konstruktorit të pyetësorit.

Është e mundur të specifikohen disa lloje totalesh:

    Elementet (përzgjedhja e rezultatit të pyetjes përmban totale të grupimit dhe regjistrime të detajuara);

    Hierarkia (në përzgjedhjen e rezultateve të pyetjes, në rastin e përgjithshëm, ka regjistrime përmbledhëse sipas hierarkisë, regjistrime përmbledhëse sipas grupimit dhe regjistrime të detajuara);

    Vetëm hierarkia (në përzgjedhjen e rezultatit të pyetjes, në përgjithësi, ka regjistrime përmbledhëse sipas hierarkisë).

Pasi të klikoni në butonin "Ok" të konstruktorit, do të gjenerohet një "Layout" dhe kodi për procedurën ExecuteRequestServer() do të shkruhet në modulin e formës:

&Në server

Procedura ExecuteRequestServer()

//((QUERY_CONSTRUCTOR_WITH_RESULT_PROCESSING

// Ky fragment është ndërtuar nga konstruktori.

// Kur ripërdorni konstruktorin, ndryshimet e bëra me dorë do të humbasin!!!

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

Kërkesë = Kërkesë e re;

Kërkesa.Teksti =

| Pranimi i Mallrave Mallrat Nomenklatura AS Nomenklatura,

| SUM (Marrja e Mallrave të Mallrave. Sasia) SI Sasia,

| SUM (Pranimi i MallraveMallrave.Shuma) AS Shuma

| Dokumenti.Pranimi i Mallrave.Mallrat

| SI TË MARRNI PRODUKTET

| Pranimi i Mallrave Mallrat Sasia > 1

|GRUPI NGA

| Pranimi i MallraveMallrat.Nomenklatura

| POROSIT NGA

| Sasi,

| Shuma ULJE

| SUM (sasia),

| SHUMË (shuma)

| HIERARKIA e nomenklaturës”;

Rezultati = Query.Run();

HeaderArea = Layout.GetArea("Header");

AreaFooter = Layout.GetArea("Footer");

TableHeadArea = Layout.GetArea("TableHeader");

TableFooterArea = Layout.GetArea ("TableFooter");

AreaNomenclatureHierarchy = Layout.GetArea("NomenklatureHierarchy");

AreaNomenklature = Layout.GetArea("Nomenklatura");

TabDoc.Clear();

TabDoc.Output(AreaHeader);

TabDoc.Output (TableHead Area);

TabDoc.StartAutoGroupingRows();

SelectionNomenklature = Result.Select(BypassQueryResult.ByGrouping);

Ndërsa SelectionNomenclature.Next() Loop

Nëse SelectionNomenclature.RecordType() = RequestRecordType.TotalByHierarchy Pastaj

Zona = Hierarkia e Nomenklaturës së Zonës;

Rajoni =Nomenklatura e Rajonit;

fundNëse;

Zona.Parametrat.Fill(Nomenklatura e Zgjedhjes);

TabDoc.Output(Area, SelectionNomenklature.Level());

Cikli i Fundit;

TabDoc.FinishAutoGroupingRows();

TabDoc.Output(TableFooterArea);

TabDoc.Output(AreaFooter);

//)) CONSTRUCTOR_QUERY_WITH_RESULT_PROCESSING