Vnořené dotazy v konstruktoru. Konstruktory dotazů 1c podmínky konstruktoru dotazů

Začněme tedy něčím jednoduchým: vytvořte v konfigurátoru Nové zpracování, pojmenujte jej Query Console nebo Query Builder, jak chcete.

Okamžitě můžeme přidat tabulku v „Data“ pro budoucí parametry, které potřebujeme, takže v naší Console nespustíme ten nejprimitivnější požadavek, ale s parametry a odkazy, například pro naši práci vytvoříme požadavek na periodické registry , ale zde bez instrukce Parametr=&Datum nikde.

Abychom vytvořili naši tabulku Parametry, na záložce „Data“ v její „Tabulární části“ přidáme novou tabulku, nazvěme ji Parametry dotazu, zde přidáme sloupce této tabulky: 1) Název parametru, napište řetězec = 25 znaků ; ParametrValue, zde je složený datový typ, viz obr.

Proto, jak je znázorněno na obrázku, vybereme pro sloupec Hodnota parametru složený typ: v nabídce typu, která se otevře, zaškrtněte políčko „Složený typ“, vyberte číslo, řetězec (určete 20 znaků), datum, logickou hodnotu a zaškrtněte spodní zaškrtávací políčko – AnyLink – znamená to, co následuje, při zadávání Parametrů našeho požadavku se můžeme odkazovat na jakýkoli objekt naší konfigurace, například adresáře nebo dokumenty.

Nyní musíme vytvořit formu naší budoucí Query Console. Při zpracování přejdeme na záložku „Formuláře“ a přidáme nový. Zadáme tento formulář a zde je již neomezené pole pro kreativitu - můžete si uspořádat dva detaily, které jste právě vytvořili, a talíř s parametry, jak chcete! K tomu můžete použít standardní prvky formuláře, jako je Skupina nebo Stránka se stránkami (pokud dáváte přednost překlápění stránek.

Hlavní je zde jedna věc: po přetažení atributu “TextValues” do levého pole úpravy formuláře nezapomeňte v jeho vlastnostech nastavit “View”=Textové pole dokumentu. Viz obr.

Ve vlastnostech atributu „Tabulka dotazů“ můžete volitelně zadat „Zobrazovací mřížku“ a „Zobrazit záhlaví“.

Dále v pravém okně pro úpravu formuláře přejděte na kartu „Příkazy“ a přidejte nové tlačítko, po kliknutí provede naše konzole určitou akci. Vytvořme tlačítko „Query Designer“, pokud si přejete, můžete k tlačítku přidat ikonu, hlavní je umístit samotné tlačítko do levého editačního okna formuláře - tak, abychom ho viděli. editačním okně klikneme pravým tlačítkem na naše tlačítko a vybereme vlastnosti – ve vlastnostech klikneme na položku „Akce“, objeví se modální okno s dotazem, kde přesně se provede náš programový kód, který tlačítku přiřadíme – vybereme „ Na klientovi“.

Modul formuláře se otevře s připravenou prázdnou procedurou „Procedure Query Constructor (Command)“. Uvnitř tohoto postupu popíšeme volání standardního 1c8 Query Builderu. Je to velmi lehké: Konstruktor = Konstruktor nového požadavku; Ale jsou zde úskalí - Query Constructor zabudovaný do platformy funguje v uživatelském režimu POUZE pod tlustým klientem! Proto vložíme podmínku preprocesorové instrukce #Pokud, ale zde se rozhodnete sami, na základě vaší platformy, nebo máte běžné formuláře, pak vyberte “ FatClientRegularApp“ nebo máte platformu založenou na spravovaných formulářích, pak „ ThickClientManagedApplication“.viz obr.

Nyní zbývá k tomuto postupu přidat podmínku pro záznam textu požadavku, který nám Query Builder vygeneruje v detailech našeho formuláře „Text požadavku“:

If Constructor.OpenModal()=True Then Object.RequestText=Constructor.Text; endIf;

Můžeme ale ručně něco změnit v textu požadavku (v uživatelském režimu - v okně atributu „Text požadavku“), aby se naše změny dostaly do Query Constructoru při jeho opětovném vyvolání – zde přidáme jednoduchou podmínku:

Pokud ne EmptyString(Object.QueryText) Then Constructor.Text = Object.QueryText; endIf;

To je vše, připojili jsme Query Constructor zabudovaný do platformy 1c8, pojďme se podívat na naši práci. Chcete-li to provést, spusťte 1C:Enterprise v režimu tlustého klienta jedním z následujících způsobů: 1) hlavní nabídka Konfigurátoru – Ladění – Start Debugging – Thick Client; 2) nebo pokud máte tyto klávesy na ovládacím panelu v konfigurátoru - stačí stisknout tlačítko se žlutým kroužkem s tlustou tečkou, viz obrázek:

Spustí se uživatelský režim 1cEnterprise8, najdeme naše zpracování, spustíme jej, klikneme na naše tlačítko „Query Designer“ a uvidíme, jak se otevře návrhář zabudovaný do platformy. viz obr.

Takže máme spuštěný Query Constructor, můžeme v něm začít skládat náš budoucí dotaz, ale zajímá nás, jak bude fungovat dotaz, který jsme vytvořili! A k tomu musíme při úpravě formuláře naší konzole v konfigurátoru vytvořit další tlačítko, nazvěme ho „Spustit dotaz“. Ve vlastnostech tlačítka „Spustit dotaz“ klikněte na „Akce“, znovu se objeví nabídka, ve které jsme dotázáni, kde bude zpracován náš programový kód, v tomto případě vybereme „Jak na klientovi, tak na serveru“, opět se ocitneme v modulu Formuláře.

V proceduře Execute Query(), kterou máme na klientovi, napíšeme podmínku, pokud uživatel nezadal text dotazu, ale žádá o jeho provedení:

If EmptyString(Object.QueryText) Then report("Zadejte text dotazu!"); endIf;

Systém již automaticky vygeneroval odkaz na proceduru Execute RequestOnServer(); – to je dobře, pojďme na tuto proceduru, která se provádí na serveru a napíšeme sem kód pro provedení našeho zadaného požadavku.

Zde jsou možnosti: Všechny výrazy týkající se stavebních dotazů si můžete napsat sami, tzn. ručně, ale existuje ještě jednodušší možnost - uvnitř postupu klikněte pravým tlačítkem myši a v rozbalovací nabídce vyberte „Tvůrce dotazů se zpracováním výsledků, viz obrázek“:

Pokud jste klikli na položku „Tvůrce dotazů se zpracováním výsledků“, zobrazí se modální okno „Text dotazu nenalezen. Vytvořit nový?“, klikněte na ano. Otevře se vestavěný návrhář dotazů, ve kterém na své první záložce „Zpracování výsledku“ - vyberte první položku „ Vynechání výsledku. To je vše, od tohoto konstruktoru nepotřebujeme nic jiného, ​​klikněte na tlačítko „OK“ - objeví se modální okno „V požadavku nejsou vybrána žádná pole, klikněte na „OK“.

Poté se v naší proceduře ExecuteRequestOnServer() objeví následující hotová šablona:

Přejděme k výrazu vytvořenému konstruktorem:

Request.Text = "";

Request.Text = Object.RequestText;

Tak jednoduché to je, naše tlačítko „Execute Request“ na zpracovatelském formuláři je již prakticky funkční, zatím umí zpracovat pouze jednoduché požadavky bez parametrů, ale hlavní je, že to funguje! Zbývá pouze vizuálně zobrazit výsledky našeho požadavku v atributu „Value Table“ na formuláři zpracování. Dovolte mi připomenout, že náš atribut „Value Table“ je typu „Tabular Document“, protože jinak neuvidíme naše výsledky v uživatelském režimu. Zobrazení tabulkových dat uživateli se vždy provádí buď pomocí Tabulkového dokumentu nebo Layoutu. Opravdu bych si přál, aby bylo možné zobrazovat data prostřednictvím tabulky hodnot - protože je to velmi snadné a známé, ale , bohužel tabulka hodnot je pouze nástroj, který vývojář potřebuje, nelze pomocí ní zobrazit data na obrazovce...

Podívejme se blíže na to, co je tabulkový dokument - je to jako list Excelu - k záznamu v konkrétní buňce se dostanete pouze pomocí Buňky tabulky, zde je nazýváme oblast, ale sami si můžeme vybrat rozsah této oblasti do jedné konkrétní buňky:

Přišli jsme tedy na to, co je tabulkový dokument, a sami jsme si určili, že budeme muset definovat data z našeho dotazu v konkrétní buňce tohoto tabulkového dokumentu. Ale pojďme se zamyslet: co je to „výsledek dotazu“, který pro nás návrhář tak rychle vygeneroval? Otevřít nápovědu - Výsledkem dotazu je tabulka, která má příslušné vlastnosti! viz obr.

A pokud nyní napíšeme za výraz Query Result = Query.Execute(); (vytvořený konstruktorem), zde je takový jednoduchý cyklus pro Collections:

Pro každý ColumnName From Query Result.Columns Loop report(ColumnName.Name); EndCycle;

Po tomto cyklu si prozatím poznamenejte všechny výrazy vytvořené automaticky konstruktorem. A spusťte 1C:Enterprise8 pod tlustým klientem. Vytvořte libovolný jednoduchý dotaz (můžete použít Query Builder - už nám funguje) a klikněte na tlačítko „Spustit dotaz“:

V dolní části okna zprávy uvidíte, že tabulka Výsledky dotazu ukládá názvy polí, která jsme právě vybrali vytvořením jednoduchého dotazu.

Nyní zobrazme tato jména polí našeho utrpení v tabulkovém dokumentu:

Pro každý název sloupce Z dotazu Result.Columns smyčka Cell=Object.QueryTable.Area(1,QueryResult.Columns.Index(Název sloupce)+1); Cell.Text=Název sloupce.Název; EndCycle;

Chcete-li zobrazit podrobnosti dat dotazu, analyzujme výrazy vytvořené automaticky návrhářem a vložíme do třídicí smyčky „SelectionDetailedRecords“ samotného dotazu přesně stejnou smyčku, kterou jsme použili k zobrazení názvů sloupců, pouze nyní musíme přenést nikoli data z tabulky „Výsledek dotazu“ do textu buňky. a data samotného výběru, podívejme se v nápovědě, jak se dostanete do pole Podrobný výběr požadavku:

SelectionDetailRecords = QueryResult.Select(); Zatímco SelectionDetailedRecords.Next() Loop //v prvním řádku již máme zapsané názvy sloupců tabulky, načteme tedy data pod prvním řádkemDocRowNumber=Object.QueryTable.TableHeight+1; Pro každý ColumnName From Query Result.Columns Cycle Cell=Object.QueryTable.Area(DocRowNumber,QueryResult.Columns.Index(ColumnName)+1); Cell.Text = SelectionDetailedRecords[Název_sloupce.Název]; EndCycle; EndCycle;

To je vše, můžeme zkontrolovat, načíst podnik pod tlustého klienta, zadat jednoduchý požadavek bez parametrů, kliknout na tlačítko „Spustit dotaz“, viz obrázek:

Hurá, vše funguje!!!

Je velmi výhodné, když se při otevírání/zavírání naší Query Console opět do pole “Query Text” zapíše náš text dotazu, se kterým jsme pracovali před zavřením konzole. Chcete-li to provést, stačí povolit vlastnost formuláře = Autosave, viz obr:

To je vše, naše konzole funguje. Abychom mohli psát složitější dotazy s parametry v nich specifikovanými, musíme vytvořit další tlačítko „Najít parametry“ a také kód pro tlačítko „Spustit dotaz“ - bude spuštěn kód pro tlačítko „Najít parametry“ na klientovi i na serveru. Dále v proceduře serveru spustíme požadavek stejným způsobem s textem, který do něj předáme z okna „Text požadavku“, pomocí výrazu „Request.FindParameters()“ najdeme předané parametry a jednoduše je zadáme do smyčky do tabulkové části formuláře „Parametry požadavku“. Nezapomeňte je poté přenést z vyplněné tabulky parametrů do procedury „Spustit dotaz“.

Do naší konzoly můžete také přidat několik tlačítek, která v uživatelském režimu vyčistí okna Parametry a Text požadavku.

Naše Query Console je připravena k použití, přeji vám úspěšná kreativní řešení pomocí tak jednoduchého a výkonného nástroje, jako je Query Console!

Toto zpracování je napsáno na platformě 1c8.3 (spravované formuláře) a běží pod tlustým klientem. Lze jej také psát na platformě 1c8.2, a to jak pod běžnými formuláři, tak pod spravovanými.

Soubor ke stažení obsahuje ukázku konzole Query Console, kterou jsme právě vytvořili.

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

Upgrade Query Console:

1) Nyní naše domácí Query Console s vestavěným Query Builderem poběží pod jakýmkoli klientem: pod tlustým klientem běžných a spravovaných formulářů a pod tenkým a webovým klientem.

p.s. Forma a vzhled vestavěného Query Builderu se liší - podle toho, pod kterým klientem jsme naši konzoli spustili. (Osobně známější a pohodlnější formu Query Builderu pod tlustým klientem)

&Na Konstruktoru dotazů klientské procedury (Command) //volání standardního konstruktoru dotazů je možné pouze pod tlustým klientem #If ThickClientManagedApplication nebo ThickClientNormalApplication Then Constructor=Nový konstruktor dotazu; Pokud ne EmptyString(Object.QueryText) Then Constructor.Text = Object.QueryText; endIf; If Constructor.OpenModal()=True Then Object.RequestText=Constructor.Text; endIf; // #Else // Report("Volání Tvůrce dotazů je možné pouze s tlustým klientem"); // Vrátit se; //# EndIf #Else Report("Spouštíte Query Builder pod tenkým klientem - mírně se liší ve formě a rychlosti výkonu!"); Konstruktor = New QueryConstructor(); Pokud ne EmptyString(Object.QueryText) Then Constructor.Text = Object.QueryText; endIf; Výstraha konstruktoru = New AlertDescription("RunAfterClosingConstructor", ThisForm); Constructor.Show(Výstraha konstruktoru); # EndIf Konec procedury &Na klientské procedurě ExecuteAfterClosingConstructor(Result, ConstructorParameters) Export //Result=text, pokud byl konstruktor uzavřen pomocí tlačítka ok Object.RequestText = AbbreviatedLP(Result); //funguje!!! Konec procedury

2) Do naší jednoduché Query Console přidána možnost zadávat složité dotazy pomocí dočasné tabulky předané parametrům!!! Mechanismus se ukázal jako velmi jednoduchý a elegantní – bez použití XML kódu, jak se to dělá v profesionálních konzolích.

Samotný kód a postupy pro přenosový mechanismus do parametrů Temporary tables můžete vidět v druhém přiloženém souboru. Jak jsem začal vyvíjet vlastní verzi dočasných tabulek v parametrech najdete na tomto odkazu https://forum.infostart.ru/forum9/topic183700/

Nyní, jak používat konzolu pro komplexní dotaz, když je dočasná tabulka předána jejím parametrům. Můžete si například vzít kód tohoto požadavku;

SELECT ExternalData.Product, ExternalData.Quantity PLACE ExternalData FROM &ExternalData AS ExternalData; ///////////////////////////////////////////////// /////////////////////////// SELECT ExternalData.Product, ExternalData.Quantity, ISNULL(RemainingProductRemaining.QuantityRemaining, 0) AS Pole1, ISNULL(Zbývající ProductsRemainings.QuantityRemaining, 0) - ExternalData.Quantity AS Remaining FROM ExternalData AS ExternalData LEFT JOIN Registrovat Accumulations.Remaining Products.Remainings(&Date, Product IN (SELECT ExternalData.Product FROM ExternalData AS ExternalData)) AS RemainingProductRemaining Software RemainData Produkt

Na základě příkladu a podobnosti výše uvedeného kódu dotazu můžete vytvořit svůj vlastní komplexní dotaz s ohledem na vaše datové objekty.

Takže v návrháři dotazů jsme vytvořili výše uvedený dotaz, zavřeme konstruktor - text dotazu přejde do pole naší konzoly „Text dotazu“, klikněte na tlačítko „Najít parametry“, vidíme, že v tabulce Parametry se objevil řádek = „Externí data“, Typ hodnoty = „Tabulka hodnot“, viz obr.

V této tabulce parametrů – zadejte parametr Datum, například dnešní datum, poté kliknutím zkuste upravit náš parametr dočasné tabulky „Externí data“, klikněte do pole s „Tabulkou hodnot“ na tři tečky – výběr typů se zobrazí klikněte na Řádek, náš mechanismus nás otočí na stránku formuláře, kde musíme ručně zadat tuto velmi dočasnou tabulku.

Zde si všimněte, že v tomto případě se na stránce „Rozvrhy“ dole v poli „Dočasný název tabulky v parametrech“ objeví název naší dočasné tabulky (je zkopírován z tabulky Parametry).

Na stránce „Jízdní řády“ zatím vidíme pouze jednu prázdnou tabulku – jedná se o tabulku Typů naší budoucí dočasné tabulky.Tlačítkem „Přidat“ doplníme název detailu a typ budoucí tabulky . Buďte opatrní – název a typ se musí shodovat s tím, co jsme zadali v požadavku na &ExternalData:

Nyní stiskneme tlačítko "Aktualizovat dočasnou tabulku" - a budeme zde mít druhou tabulku - přímo ji naplníme daty dočasné tabulky pomocí tlačítka "Přidat".

To je vše, můžeme si ještě jednou zkontrolovat, zda jsme zadali primitivní data parametrů dotazu do tabulky parametrů na 1. stránce zpracování a kliknout na tlačítko „Spustit dotaz“ - vše se vypočítá a vybere podle toho omezení dat předávaných v parametru naší dočasné tabulky

p.s. Pokud jste udělali chybu při psaní názvu detailů a jejich typů (v první tabulce) - stačí zavřít konzoli a znovu ji otevřít - dočasná datová tabulka bude vymazána - a tabulku Typy lze znovu upravit a lze znovu vytvořit novou datovou tabulku.

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

To je vše, vlastníma rukama si dokážeme vytvořit velmi výkonný pracovní nástroj, navíc naše konzole je oproti profesionálním stále velmi rychlá – a to je pro vývojáře velmi velké plus! A samozřejmě nyní naše konzole funguje pod jakýmkoli klientem! Hodně štěstí ve vašem kreativním vývoji!!!

Podívejme se, jak můžeme tyto dvě tabulky spojit podle polí Kód produktu použitím
konstruktor dotazu (jako příklad je uveden kód pro vytváření dočasných tabulek
Nebudu. Můžete si to vzít z výše uvedeného odkazu).

Otevřete okno návrháře, přejděte na kartu "Tabulky a pole", do sekce
"stoly" vyberte obě naše tabulky a v sekci "pole" -
ta pole z obou tabulek, která chceme vidět jako výsledek dotazu.

Přejděte na záložku "Spojení". Přidat nový řádek. V terénu stůl 1
z rozevíracího seznamu vyberte tabulku s produkty a v poli Tabulka 2 Stůl
se zeměmi.

Pro Tabulky1 zaškrtněte políčko Všechno. Pro
Tabulky2 Toto políčko nezaškrtáváme. To znamená, že od Tabulky1
budou vybrány všechny záznamy az Tabulky2 pouze ty, pro které se provádí
podmínku připojení, tedy při takové kombinaci příznaků dostaneme
LEVÉ PŘIPOJENÍ. Dále je třeba vyplnit Podmínka komunikace.
Zde vybíráme pole tabulky z rozevíracích seznamů a znak porovnání také z rozevíracího seznamu
seznam.

V důsledku tohoto připojení obdržíme následující text požadavku:

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product LEVÉ PŘIPOJIT SE VT_Country AS VT_Country BY VT_Product.Product Code = VT_Country.Product Code

Nyní se na některé body podíváme blíže.
Zkusme prohodit zaškrtávací políčko Všechno.


Zdálo by se, že by to nakonec mělo vyjít SPRÁVNÉ PŘIPOJENÍ SE, ale pokud my
Podívejme se na text dotazu vygenerovaný konstruktorem, uvidíme, že tabulky
vyměnili místa, ale spojení stále zůstalo vlevo:

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

Podívejme se, co se stane, když zrušíme zaškrtnutí obou políček

V důsledku toho získáme vnitřní spojení.

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 Code = VT_Country.Product Code

Nakonec, pokud jsou zaškrtnuta obě zaškrtávací políčka


získáme úplné spojení

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

Na záložce můžete zadat více řádků Spojení. V tomto případě několik
řádky jsou spojeny podmínkou A. Navíc linky nejsou nutné
pokaždé znovu zajet. Lze je zkopírovat pomocí klíče F9.
A v novém řádku změňte pouze podmínku připojení. To výrazně urychluje vývoj.
Také v podmínce odkazu není nutné používat pouze předdefinovaná pole z
rozevírací seznamy. Můžete použít libovolný výraz, který vyhovuje
1C dotazovací jazyk. Chcete-li to provést, musíte zaškrtnout políčko volný, uvolnit
a zadejte podmínku přímo do pole nebo otevřete pomocné okno
kde můžete použít šablony s funkcemi dotazovacího jazyka.


Samozřejmě v praxi existují mnohem složitější dotazy kde
několik tabulek s různými vazbami mezi sebou. Ale v nástroji pro tvorbu dotazů
lze reprodukovat spojení jakékoli složitosti.

Návrhář dotazů se skládá z následujících záložek:

1. „Tabulky a pole“ – na kartě jsou tři hierarchické seznamy:
A. „Databáze“ – seznam všech dostupných objektů, na které lze provést dotaz. Také tlačítko "Zobrazit tabulky změn", pomocí kterého můžete přistupovat k tabulkám změn objektů zabezpečení informací, pokud jsou registrovány pro jakýkoli plán výměny.
b. „Tabulky“ - seznam vybraných tabulek, na které bude dotaz proveden. V tomto okně také můžete odstranit tabulku, přejmenovat nebo nahradit tabulku a přidat interní dotaz.

Parametry virtuálních tabulek můžete přiřadit kliknutím na tlačítko „Parametry virtuálních tabulek“:

Doporučuje se aktivně používat parametry virtuálních tabulek pro výběr podle určitých dimenzí, protože to zvyšuje rychlost provádění dotazu. V parametrech můžete použít externí proměnné, před jejichž názvy je znak „&“.
C. „Pole“ - seznam polí, která jsou vybrána z tabulek. Můžete také přidat vypočítaná pole; kliknutím na tlačítko „Přidat“ se otevře konstruktor vlastního výrazu:

Vlevo je okno s poli dostupnými ve výrazu. Vpravo je náznak použitých funkcí. Níže je konstruovatelný libovolný výraz. Ve výrazech můžete použít externí parametry; jsou označeny znakem „&“, například: &Period, &StartDate
Musíte být opatrní, pokud je v okně napsán dlouhý a složitý výraz, který obsahuje malou syntaktickou chybu, po kliknutí na tlačítko „OK“ systém vydá varování a okno zavře. Veškerý napsaný kód bude ztracen, proto doporučuji, pokud si nejste jisti správností výrazu, pak vždy před zavřením konstruktoru uložte obsah do schránky (Ctrl-C).

2. „Vztahy“ - na záložce jsou vyznačeny vazby mezi tabulkami.

Tabulka uvádí tabulky, které mají být propojeny, vztah mezi tabulkami, které mají být propojeny, a podmínku připojení. Pokud je podmínka připojení složitá, můžete zadat určitý vypočítaný výraz a otevře se konstruktor vlastního pole.

3. „Seskupení“ – záložka ukazuje, která pole jsou seskupena a která jsou agregovaná (součet).

4. Záložka „Podmínky“ - uvádí podmínky, které jsou kladeny na požadavek.
V podmínkách můžete také psát složité výrazy pomocí konstruktoru jednoduchého výrazu a pomocí externích proměnných:

5. "Pokročilé"
Další parametry kladené na požadavek

6. „Asociace a pseudonymy“
Na této záložce můžete přiřadit aliasy polím a také spravovat dotazy, které jsou propojeny pomocí konstrukcí „UNITE“ nebo „UNITE ALL“.

7. "Objednávka"
V jakém pořadí se zobrazí výsledky dotazu?

Pozornost! V dolní části záložky můžete vidět zaškrtnutí "Automatická objednávka"- v aktuální verzi 1C 8.1 v ACS je to k ničemu, navíc, když je zaškrtnuto políčko, při nahrávání ACS dává chybu, takže byste jej neměli používat.

8. "Složení dat"
Záložka, na které jsou definována servisní pole pro systém řízení přístupu. Hraje přibližně stejnou roli jako karta „Tvůrce sestav“ v běžném návrháři sestav.

A. Na záložce "Tabulky" - jsou uvedeny tabulky použité v dotazu, zaškrtnutím políčka "Povinné" můžete určit, zda musí být tabulka zahrnuta do dotazu. Tito. pokud nejsou ve výběru zahrnuta žádná pole, pak se tato tabulka vůbec neúčastní dotazu. Můžete také zadat parametry pro tabulky.

V procesu nastavování systému řízení přístupu specifikujeme libovolné výběry, následně se všechny hodnoty výběru dosadí do parametrů virtuálních tabulek, což nám opět pomůže optimalizovat a urychlit dotaz.
b. Na záložce „Pole“ jsou uvedena pole a jejich aliasy, které budou přidány do seznamu polí ACS.
C. "Podmínky" - pokud jsou v nastavení ACS specifikovány výběry, budou všechny hodnoty výběru přidány jako další podmínky; k podmínkám lze také přidat složité výrazy.

9. "Charakteristika"
Záložka, která nemá obdobu v obvyklém konstruktoru výstupního formuláře.

Tato karta umožňuje rozšířit práci s dotazy o charakteristiky. Tabulka na kartě se skládá z několika polí:
A. „Typ hodnoty“ – typ, pro který budou charakteristiky vybrány. Pokud například zadáte „Directory Link.Nomenclature“, pak budou v dotazu vybrány všechny charakteristiky pro nomenklaturu.
b. „Zdroj“ - zdroj vlastností typů charakteristik, může být dotaz nebo tabulka. Do tohoto pole můžeme napsat požadavek na výběr pouze těch vlastností, které potřebujeme.
C. „Seznam charakteristik“ - pole, ve kterém je uveden zdroj vlastností charakteristik. Nejčastěji se jedná o plán charakteristických typů nebo požadavek. Musíte také zadat pole, která jsou zodpovědná za „Identifikátor“, „Název“ a „Typ“ vlastnosti.
d. „Zdroj“ je další pole, ve kterém uvádíme zdroj charakteristických hodnot, což může být také tabulka nebo dotaz.
E. „Charakteristická hodnota“ je tabulka nebo dotaz, který přijímá charakteristické hodnoty. Například informační registr „ObjectPropertyValues“ může sloužit jako tabulka hodnot charakteristik. Musíme také označit ta pole z tabulky (nebo dotazu), která jsou zodpovědná za „Objekt“, „Vlastnost“ a „Hodnotu“ charakteristiky.
Po úpravě požadavku je text požadavku vidět v okně pod seznamem polí. Níže pomocí zaškrtávacího políčka „Automatické vyplňování“ můžeme regulovat vyplnění dalších parametrů pro pole uvedená v požadavku. Upozorňujeme, že složení polí se určuje až v samotné žádosti.

Informace převzaté z webu

Dnes si povíme, jak na to vnořené dotazy použitím tvůrce dotazů. Přejděme rovnou k příkladu.

Řekněme, že máme tento jednoduchý registr informací, kde jsou ukládány ceny zboží a dodavatelů:

Chceme požádat o příjem všech produktů, které mají více než jednoho dodavatele. To lze implementovat pomocí následujícího dotazu:

SELECT Počet dodavatelů.Produkt JAKO Produkt OD (SELECT Cena.Produkt JAKO Výrobek, MNOŽSTVÍ (ROZLIŠNÁ CENA.Dodavatel) AS Dodavatelé OD RegistrovatInformace.Cena JAKO Cena SKUPINA PODLE ceny.Produkt) AS Počet dodavatelů KDE Počet dodavatelů.Dodavatelů > 1

Vytvoření vnořeného dotazu v konstruktoru

Vytvořme výše uvedený požadavek pomocí konstruktoru.

Chcete-li to provést, v příkazovém panelu nad polem Tabulky zmáčknout tlačítko Vytvořte poddotaz:


Poté se otevře okno s další instancí konstruktoru dotazu:


A v tomto novém okně vytvoříme vnořený dotaz:




Klepnutím na tlačítko Žádost V levém dolním rohu vidíme text poddotazu:


Po kliknutí na tlačítko OK v pomocném konstruktoru získáme v hlavním okně následující obrázek:


Od fráze NestedQuery nepříliš vhodné pro vnímání, přejmenujme tabulku na pravé tlačítko myši Počet Dodavatelů, vyberte z něj pole Produkt a na záložce Podmínky Zapišme si nutnou podmínku:




A po všech těchto manipulacích obdržíme požadovaný požadavek. V případě potřeby můžete vytvořit dotazy s několika úrovněmi vnoření.

Jak vytvořit vnořený dotaz z běžného dotazu v konstruktoru

Velmi často nastává situace, kdy v konstruktoru začnete zadávat požadavek a v určité chvíli si uvědomíte, že musí být vnořen. V našem příkladu to samozřejmě není žádný problém – můžete jednoduše vše smazat a žádost vystavit znovu. V praxi však existují mnohem složitější příklady, například s několika úrovněmi vnořování, kdy se žádostí strávilo několik hodin. A v tomto případě existuje poměrně jednoduchá cesta ven. Můžete použít textový editor dotazů vestavěný do návrháře. Je potřeba použít tlačítko Žádost získejte text požadavku (viz obrázek výše) a zkopírujte jej do schránky. Dále vytvořte nový vnořený dotaz a znovu stiskněte tlačítko Žádost, vložte text z vyrovnávací paměti, klepněte na OK. V souladu s tím vymažeme starý požadavek na nejvyšší úrovni. Takto můžeme v případě potřeby snadno za běhu vytvářet víceúrovňové vnořené dotazy.

Schopnost psát text dotazu „ručně“ nebyla nikdy „zbytečná“, ale je pohodlnější použít návrhář dotazů.

Komentář.

Bohužel ve spravované aplikaci nemůžete použít návrháře dotazů při zpracování "Seznámení s dotazem". Můžete jej použít v tomto zpracování přepnutím do normálního režimu, ale my to neuděláme.

Vytvořme zpracování “Request Constructor” a nadefinujeme jej v subsystému “Reports and Processing”.

Vytvoříme formulář pro zpracování a přidáme do něj atribut formuláře "TabDoc" typu "Tabulární dokument" a také příkaz "Spustit dotaz" s akcí "Spustit dotaz". Dále je přetáhněte do formuláře.

V modulu formuláře, aby příkaz fungoval, napíšeme proceduru:

&OnClient

Postup Provést dotaz (příkaz)

ExecuteRequestServer();

Konec procedury

&Na serveru

Konec procedury

Vstoupíme do procedury volané na serveru a z kontextového menu zavoláme „Konstruktor dotazu se zpracováním výsledků“ (obrázek 2.65).

Obrázek 2.65 Konstruktor dotazu se zpracováním výsledků

Nastavte typ zpracování na „Výstup do tabulkového dokumentu“ a klikněte buď na tlačítko „Další“ nebo na kartu „Tabulky a pole“.

Na záložce „Tabulky a pole“ v návrháři si můžete prohlédnout aktuálně existující tabulky v systému (levá část má název „Databáze“) (obrázek 2.66).

Obrázek 2.67 Konstruktor dotazu

Tabulky, ze kterých bude dotaz získávat data, se přenesou do oblasti „Tabulky“, pole požadovaná dotazem se přenesou do oblasti „Pole“. Udělejme to jako na obrázku 2.68.

Obr 2.68 Konstruktor dotazu

Zde jsme odstranili vytvořené výchozí pole zobrazení – „PREPRESENTATION (Product ReceiptProducts.Nomenclature)“

Kdykoli při práci s projektantem si můžete prohlédnout výsledný text požadavku. Chcete-li provést tento úkol, musíte kliknout na tlačítko „Požádat“ umístěné v levém dolním rohu formuláře návrháře (obrázek 2.69).

Text požadavku můžete ručně upravit kliknutím na tlačítko „Upravit“.

Praxe. Klikněte na tlačítko „OK“ a zkontrolujte naše zpracování v uživatelském režimu. Pokud analyzujete data přijatá při provádění požadavku, můžete narazit na „opakování“ položek položky (pokud vám to nefunguje, můžete zkopírovat a zaúčtovat jakýkoli dokument „Příjem zboží“).

Vrátíme se k proceduře ExecuteRequestServer() ve zpracování “Request Constructor” az kontextové nabídky znovu vyvoláme “Query Constructor se zpracováním výsledků”.

Pokud chcete „sbalit“ výsledek dotazu, můžete pro tento účel použít kartu „Seskupení“ návrháře dotazu.

Při definování seskupení se musíte řídit následujícím pravidlem: všechna pole výběru dotazu jsou rozdělena na pole, podle kterých se provádí seskupování (konvoluce), pole vnořených tabulek (pole, která se sčítají vzhledem k těm, podle kterých se seskupování provádí) a agregační funkcí. Definujme seskupení (obrázek 2.70).

Obrázek 2.70 Tvůrce dotazů

Pokud musí být data přijatá žádostí vybrána podle nějaké podmínky, pak v tomto případě může být nutné použít záložku „Podmínky“. Vyberme Příjem zbožíZboží.Množství=10 (obrázek 2.71).

Obrázek 2.71 Podmínka konstruktoru dotazu.

Upozorňujeme, že pokud je podmínka definována stejným způsobem jako na obrázku, požadavek nebude proveden.

Existují dva způsoby, jak situaci napravit:

    Předefinováním podmínky zaškrtnutím příznaku „P...“;

    Využitím možnosti změnit samotný text požadavku (získáte kliknutím na tlačítko „Upravit požadavek“).

Samotná ruční změna bude spočívat v tom, že je nutné odstranit symbol „&“ před číslem „10“. Tento symbol v textu požadavku definuje parametry požadavku, do kterých je třeba později (ale před provedením požadavku) zapsat některé hodnoty. Klikněte na tlačítko „Upravit dotaz“ a upravte (obrázek 2.72).

Obrázek 2.73 Úprava dotazu

Na záložce „Advanced“ můžete zaškrtnout řadu příznaků (souvisejících s klíčovým slovem „Select“ dotazovacího jazyka) a určit složení tabulek určených pro změnu dotazu (obrázek 2.74).

Obrázek 2.74 Další funkce dotazu

Na záložce „Joins/Aliases“ můžete změnit názvy polí nastavením „Aliases“, ale my to neuděláme.

Na záložce „Pořadí“ můžete určit pořadí řazení záznamů jako výsledek dotazu (obrázek 2.75).

Obrázek 2.75 Zaznamenejte pořadí řazení

Věnujte pozornost příznaku "Automatické řazení", lze jej použít k řazení podle polí referenčního typu.

Při definování sekce „Totals“ byste měli být připraveni na to, že se jako výsledek dotazu objeví „další“ celkové záznamy. Spolu s těmito záznamy se výsledek dotazu stává hierarchickým (obrázek 2.76).

Obrázek 2.76. Výsledky konstruktoru dotazu.

Je možné zadat několik typů součtů:

    Prvky (výběr výsledků dotazu obsahuje seskupení součtů a podrobné záznamy);

    Hierarchie (ve výběru výsledku dotazu jsou v obecném případě souhrnné záznamy podle hierarchie, souhrnné záznamy podle seskupení a podrobné záznamy);

    Pouze hierarchie (ve výběru výsledků dotazu obecně existují souhrnné záznamy podle hierarchie).

Po kliknutí na tlačítko „Ok“ konstruktoru se vygeneruje „Layout“ a do modulu formuláře se zapíše kód procedury ExecuteRequestServer():

&Na serveru

Postup ExecuteRequestServer()

//((QUERY_CONSTRUCTOR_WITH_RESULT_PROCESSING

// Tento fragment je vytvořen konstruktorem.

// Při opětovném použití konstruktoru budou změny provedené ručně ztraceny!!!

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

Žádost = Nová žádost;

Žádost.Text =

| Příjem zboží Zboží Nomenklatura AS Nomenklatura,

| SUM (Příjem zboží Zboží. Množství) AS Množství,

| SUM(Příjem zbožíZboží.Částka) JAKO Částka

| Doklad.Příjem zboží.Zboží

| JAK ZÍSKAT PRODUKTY

| Příjem zboží Zboží. Množství > 1

| GROUP BY

| Příjem zbožíZboží.Nomenklatura

| OBJEDNAT PODLE

| Množství,

| Částka SNÍŽENÍ

| SUM(množství),

| SOUČET (Součet)

| Nomenklatura HIERARCHIE";

Výsledek = Query.Run();

HeaderArea = Layout.GetArea("Header");

AreaFooter = Layout.GetArea("Footer");

TableHeadArea = Layout.GetArea("TabulkaHeader");

TableFooterArea = Layout.GetArea("TableFooter");

AreaNomenclatureHierarchy = Layout.GetArea("NomenclatureHierarchy");

Nomenklatura oblasti = Layout.GetArea("Nomenklatura");

TabDoc.Clear();

TabDoc.Output(AreaHeader);

TabDoc.Output(TableHeadArea);

TabDoc.StartAutoGroupingRows();

SelectionNomenclature = Result.Select(BypassQueryResult.ByGrouping);

Zatímco SelectionNomenclature.Next() Loop

If SelectionNomenclature.RecordType() = RequestRecordType.TotalByHierarchy Then

Area = AreaNomenclatureHierarchy;

Region = Nomenklatura regionu;

endIf;

Area.Parameters.Fill(SelectionNomenclature);

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

EndCycle;

TabDoc.FinishAutoGroupingRows();

TabDoc.Output(TableFooterArea);

TabDoc.Output(AreaFooter);

//))CONSTRUCTOR_QUERY_WITH_RESULT_PROCESSING