Kontakty

1s 8 žiadosť o dávku. Jednoduché požiadavky. Dôvody pre neoptimálny výkon dotazov

Poďme analyzovať, ako je syntax textov žiadostí o jednoduchý príklad: Zadržaný dokument Jedlé obsahujúca v tabuľkovej časti Tovar zoznam tovaru na predaj a množstvo. Pri vedení takéhoto dokladu je potrebné zabezpečiť kontrolu záporných zostatkov uložených v registri akumulácie zostatkov Zvyšky Tovaru.

Konfiguračná štruktúra je znázornená na obrázku.

(16,22 kilobajtov) Počet stiahnutí: 64

Vytvorme dotaz na tabuľkovú časť dokumentu a virtuálnu tabuľku Zvyšky akumulačný register. Zohľadníme možné duplicitné riadky v dokumente, preto záznamy zoskupíme.

Žiadosť = Nová požiadavka;
Request.Text = "
| VYBERTE SI
| nomenklatúra dok.,
| SUM(Dok.množstvo) AKO množstvo_dokumentu,
| MINIMUM(ISNULL(Reg.NumberRemainder,0)) AS Reg_Number
| OD
| Dokument.Spotrebný materiál.Tovar AS Doc
| PRIPOJENIE VĽAVO
| Akumulačný register.Zostatky tovaru.Zostatky() AS Reg
| ON
| Doc. Nomenclature = Reg. Nomenklatúra
| KDE
| Odkaz = &Odkaz
|SKUPINA PODĽA nomenklatúry dokumentov";

// Prejdite cez register

EndCycle;

EndProcedure

Prirodzene, výsledná požiadavka nie je absolútne optimálna. Optimalizujme to pomocou vnorených dotazov: Tabuľkovú časť dokladu pred napojením na tabuľku salda zoskupíme, zoznam tovaru prenesieme do parametrov virtuálnej tabuľky ako hodnotu podmienky pre výpočet salda. V dôsledku toho bude mať naša žiadosť nasledujúcu formu:

| VYBERTE SI
| nomenklatúra dok.,

| OD
| (VYBERTE

| OD
| Dokument.Spotrebný materiál.Tovar
| KDE
| Odkaz = &Odkaz
| SKUPINA PODĽA nomenklatúry) AS Doc
| PRIPOJENIE VĽAVO
Nomenklatúra B
| (VYBERTE INÉ
| Nomenklatúra
| OD
| Dokument.Spotrebný materiál.Tovar
| KDE
| Odkaz = &Odkaz)) AS Reg
| ON

Ak by v dotaze bolo potrebné získať údaje zo zvyškov rôznych registrov, potom by sa hodnota filtra, a teda aj náš druhý poddotaz, opakovala vo všetkých parametroch virtuálnych tabuliek, je prirodzené, že systém znova sprístupní databázu pre každý poddotaz na získanie údajov.

Dočasné stoly

Nepamätám si, z ktorého vydania bolo možné použiť dočasné tabuľky v dopytoch. Na to slúži objekt "Správca dočasných tabuliek". V skutočnosti správca dočasných tabuliek popisuje menný priestor dočasných tabuliek a je zodpovedný za ich vytváranie a ničenie v databáze.

Samotné dočasné tabuľky sú v skutočnosti fyzicky vytvorené v databáze, preto by sa s nimi malo zaobchádzať opatrne, pretože diskový subsystém je v súčasnosti najpomalšou súčasťou technológie a rýchlosť vytvárania a ničenia tabuliek priamo závisí od neho.

Prepíšme dotaz tak, aby používal dočasné tabuľky. Zoskupenú tabuľkovú časť dokumentu a zoznam produktov pre filter virtuálnych tabuliek umiestnime do dočasných tabuliek:

Postup spracovania účtovania (zlyhanie, režim účtovania)

MBT = New TemporaryTable Manager;

Žiadosť = Nová požiadavka;
Request.Text = "
| VYBERTE SI
| Nomenklatúra, SUM(množstvo) AS množstvo
|PUT DocTCH
| OD
| Dokument.Spotrebný materiál.Tovar
| KDE
| Odkaz = &Odkaz
|SKUPINA PODĽA nomenklatúry";

Žiadosť = Nová požiadavka;
Query.TemporaryTable Manager = MBT;
Query.Text = "VYBERTE INÉ
| Nomenklatúra
|PUT ProductList
| OD
| Dokument.Spotrebný materiál.Tovar
| KDE
| Odkaz = &Odkaz";

Žiadosť = Nová požiadavka;
Query.TemporaryTable Manager = MBT;
Request.Text = "
| VYBERTE SI
| nomenklatúra dok.,
| Doc.Quantity AS Doc_Quantity,
| ISNULL(Reg.NumberRemainder,0) AS Reg_Number
| OD
| Doc AKO Doc
| PRIPOJENIE VĽAVO
| Register hromadenia.Zostatky tovaru.Zostatky(,
| Nomenklatúra
| OD
| ON
| Nomenklatúra dokumentu = Reg. Nomenklatúra“;

QueryResult = Query.Execute();
Selection = QueryResult.Select();

Kým Selection.Next() Slučka

//Skontrolujte záporné zostatky

// Prejdite cez register

EndCycle;

EndProcedure

Pri použití dočasných tabuliek v texte dotazu použite príkaz Príspevok na vytvorenie novej dočasnej tabuľky systém v tomto prípade nepošle do výsledku dotazu obsah tejto tabuľky (pozri poznámku 1 a poznámku 2 v texte vyššie), ale počet záznamov umiestnených v dočasnej tabuľke, ak chcete, nemôžete túto hodnotu prijať.

Môžete tiež použiť návod Zničiť v tomto prípade sa zničí dočasná tabuľka, inak sa zničia dočasné tabuľky spolu s dočasným objektom správcu tabuliek.

V našom hlavnom dotaze som ako označenie zdroja získavania údajov použil názvy dočasných tabuliek (treba im priradiť synonymum, ktoré vidíme v texte). Dočasné tabuľky môžete použiť ako zdroj viackrát, čo pri šikovnom použití zníži text dopytu (zlepší čitateľnosť zložitých dopytov) a zvýši rýchlosť (pri použití údajov dočasných tabuliek na viacerých miestach dopytu).

dávkové požiadavky

Dávkové dotazy logicky dopĺňajú funkcionalitu dočasných tabuliek a poskytujú viac možností pri práci s dotazmi.

V dávkovom dotaze môžete v skutočnosti opísať niekoľko dotazov, ktoré spolu súvisia pomocou dočasných tabuliek a nesúvisia (je to možné, ale nie je jasné prečo?). Výsledkom je, že môžete vykonávať všetky dotazy postupne a získať ako výsledok buď pole s výsledkami každého vykonania dotazu, alebo výsledok posledného. Ak chcete získať pole s výsledkami dotazu, použite metódu ExecutePackage() objekt žiadosti a získať výsledok poslednej žiadosti ExecuteRequest().

V texte požiadavky sú požiadavky na balík oddelené symbolom ";" (bodkočiarka). Na dávkový dotaz existuje iba jeden priestor názvov virtuálnej tabuľky. Použitie dočasného správcu tabuliek sa nevyžaduje, ale je možné, ak chcete preniesť dočasné tabuľky z jedného dávkového dotazu do druhého.

Prepíšme postup na používanie dávkových dotazov:

Postup spracovania účtovania (zlyhanie, režim účtovania)

Žiadosť = Nová požiadavka;
Request.Text = "
| VYBERTE SI
| Nomenklatúra, SUM(množstvo) AS množstvo
|PUT DocTCH
| OD
| Dokument.Spotrebný materiál.Tovar
| KDE
| Odkaz = &Odkaz
|SKUPINA PODĽA nomenklatúry
|;
|VYBERTE INÉ
| Nomenklatúra
|PUT ProductList
| OD
| Dokument.Spotrebný materiál.Tovar
| KDE
| Odkaz = &Odkaz
|;
| VYBERTE SI
| nomenklatúra dok.,
| Doc.Quantity AS Doc_Quantity,
| ISNULL(Reg.NumberRemainder,0) AS Reg_Number
| OD
| Doc AKO Doc
| PRIPOJENIE VĽAVO
| Register hromadenia.Zostatky tovaru.Zostatky(,
| Nomenklatúra B (VYBERTE INÉ
| Nomenklatúra
| OD
| Zoznam tovaru AS Zoznam tovaru)) AS Reg
| ON
| Nomenklatúra dokumentu = Reg. Nomenklatúra“;

Kým Selection.Next() Slučka

//Skontrolujte záporné zostatky

// Prejdite cez register

EndCycle;

EndProcedure

V skutočnosti som odstránil definíciu objektu dotazu a použitie dočasného správcu tabuliek, skombinoval texty dotazov (pozor na oddeľovač ";" medzi textami). Výsledkom je, že text dopytu sa stal čitateľnejším (a pri použití nástroja na tvorbu dopytov sa čitateľnosť dopytu výrazne zlepšila).

Po vykonaní požiadavky na premennú ArrayResults máme 3 prvky. Prvé dva budú obsahovať číslo charakterizujúce počet záznamov umiestnených v dočasných tabuľkách DocPM A Zoznam produktov a tretí bude obsahovať výber s poľami Nomenklatúra, Doc_ množstvo a Reg_ množstvo.

do premennej Žiadosť o výsledok bude zahrnutá iba vzorka.

No, to je všetko pre dávkové požiadavky. Veľmi pohodlný mechanizmus ako z hľadiska písania dotazov, tak aj z hľadiska čítania zložitých dotazov.

Platforma 1C Enterprise vám umožňuje vykonávať niekoľko dopytov postupne naraz. V 1C sa to nazýva dávka žiadostí. V rámci jedného balíka je každá požiadavka oddelená „bodkočiarkou“.

Na dosiahnutie postupného vykonávania dopytov v dávke sa spravidla najprv vytvoria dočasné tabuľky, potom sa vytvoria podmienky na ich spoločné použitie, ako sú filtre, spojenia, spojenia. Vďaka tomu sa dosiahne konečný výsledok. Dočasné tabuľky získané ako výsledok akýchkoľvek dotazov v dávke naďalej existujú až do konca vykonania balíka ako celku alebo do vykonania dotazu, ktorý zničí dočasné tabuľky.

Okrem toho použitie dávkových dotazov a dočasných tabuliek výrazne zlepšuje čitateľnosť celej časti tohto kódu. Komplexné dotazy, ktoré obsahujú aj vnorené dotazy, môžu byť veľmi ťažko pochopiteľné. Ak však dlhý zložitý dotaz rozložíte na niekoľko a dokonca použijete dočasné tabuľky, nielenže to zlepší vnímanie, ale vo väčšine prípadov to vedie aj k zvýšeniu výkonu.

Ďalším dôležitým detailom v prospech dávkových požiadaviek v 1C je to, že na rozdiel od toho môžeme získať výsledok každej požiadavky v dávke samostatne.

Príklad vytvorenia dávky požiadaviek v jazyku 1C

Aby sme videli príklad vytvorenia dávky dotazov, použijeme nástroj na tvorbu dotazov, ktorý zavoláme kvôli prehľadnosti z konzoly dotazov. Okamžite teda vidíme výsledok vykonania balíka.

Vytvorme jednoduchú dávkovú požiadavku. Navrhujem okamžite vložiť text žiadosti do a potom ho otvoriť a zistiť, ako sa tvorí balík žiadosti. Pridajte novú požiadavku do konzoly a vložte nasledujúci text:

Získajte bezplatné video lekcie 267 1C:

Samonosný. Link,
Samonosný. Rodič,
Samonosný.Kód,
Samonosný kód QuickChoice,
Samonosné. Meno,
Samonosné. Zobraziť,
Samonosné. Podsúvahové,
Samonosné. Kvantitatívne,
OD
Účtovná osnova Samonosné AS Samonosné
KDE
Self-supporting.Link = &Účet
;
////////////////////////////////////////////////////////////////////////////////

VYBRAŤ
Samonosné typySubconto.LineNumber AS LineNumber,
Samonosné typy subconto Typ subconto AS Typ subconto,
Samonosné typy Subconto.Type of Subconto.Description AS Názov,
Samonosné typy subconto. Typ subconto.ValueType AS ValueType,
Samonosné typy Subconto.Only Obraty AKO OnlyObraty,
SamonosnéTypySubconto.Sum AS Sum
OD
Účtovná osnova Samonosné Typy Subconto AS Samonosné
KDE
Self-supportingTypesSubconto.Reference = &Účet
TRIEDIŤ PODĽA
SamonosnéTypySubconto.LineNumber

U mňa to vyzerá takto:

Teraz prejdime k nástroju na tvorbu dotazov. Tu nás bude zaujímať záložka „Žiadosti o balík“:

Ako vidíte, máme dávku dvoch žiadostí. Dvojitým kliknutím na ktorýkoľvek z nich môžete pokračovať v jeho úprave:

Stlačíme tlačidlo "OK" a pokúsime sa vidieť výsledok dávkového dotazu.

Nastavte parameter "Účet". Z Účtovnej osnovy si môžete vybrať ľubovoľný účet. Ako ste už pravdepodobne uhádli, táto dávka žiadostí by mala získať vlastnosti účtu. Kliknite na „Spustiť“ a pozrite si výsledok:

Metódy Execute() a ExecutePackage()

Keď sa môj dotaz stal tak zložitým, že presahoval moje chápanie, rozhodol som sa použiť dávkové dotazy.

Ale tvárou v tvár tomu, že o nich nič neviem. Ukázalo sa, že všetko je veľmi jednoduché. Za 5 minút budete môcť používať dávkové dopyty. Začnite čítať.

Ako sa ukázalo, všetko je veľmi jednoduché. Stačí napísať niekoľko dopytov oddelených bodkočiarkou. Výsledok sa vráti v poslednej žiadosti.

Dávkové požiadavky sa objavili až vo verzii 8.1.11.67.4.

Tu je text žiadosti:

VYBERTE T1.Zn PUT WTBpísmená OD (VYBERTE "A" AKO ZN KOMBINOVAŤ VŠETKY VYBERTE "B") AKO T1;

SELECT T1.Zn PUT WTCigures FROM (SELECT "1" AS Zn COMBINE ALL SELECT "2") AS T1;

VYBERTE TB.Zn, TTs.Zn, TB.Zn+TP.Zn Z VTBletters AS TB, VTSigers AS TP

Dávkové dotazy sú podporované v akejkoľvek bežnej konzole dotazov.

Obrázok ukazuje príklad vykonania dotazu:

A teraz trochu zo skúsenosti. Prečo sú potrebné dávkové požiadavky.

Faktom je, že do dočasnej tabuľky môžete vložiť nejaký medzivýsledok, ktorý potom môže byť potrebný v niekoľkých nasledujúcich dotazoch.

Predtým, keď neexistovali žiadne dočasné tabuľky, museli ste duplikovať text dotazu.

Samozrejme, môžete sa zaobísť bez dávkového dotazu postupným vykonaním niekoľkých dotazov a manipuláciou s vnorenými tabuľkami. Ale s dávkovými požiadavkami je to pohodlnejšie. Stačí napísať dotaz a nerozmýšľať nad umiestnením dočasných tabuliek. Všetko sa deje samo.

Okrem toho, ak sa používa systém skladania údajov (DCS), inteligentne vyberá požadované polia a minimalizuje celú dávku dopytov.

Ak žiadosti mali metódu Request.Execute() teraz existuje metóda Request.ExecutePackage(), ktorý vráti všetky tabuľky z dávky ako pole.

Oznámenie o dávkových požiadavkách na webovej stránke 1c je tu: http://v8.1c.ru/overview/release_8_1_11/#Functional

História zo života

Dovoľte mi vysvetliť, čo ma podnietilo k dávkovým požiadavkám.

Predstavte si teda, že existuje nejaký dokument tabuľková časť. V stĺpci" Omyl» podpísať, či nedošlo k chybe pri vypĺňaní dokladu. V stĺpci" TextErrors» môže byť jedna alebo viac viet s textom chýb. Typy chýb obsiahnutých vo vetách sú vopred známe.

Do tabuľky teda zadáme zoznam všetkých chýb Chybové kódy- obsahuje kód chyby a podreťazec vyhľadávania.

Pre každý riadok dostaneme jednu, dve alebo viac chýb. Pretože Na jednom riadku môže byť viacero chýb.

Chyba ale nemusí byť rozpoznaná, t.j. vlajka" Omyl“ stojí, ale text chyby nám neposkytol kód chyby.

Urobíme ľavé spojenie, kde je kód chyby NULL, dáme kód chyby " Iné chyby» .

Problém bol ale v tom, že tam bolo asi 200 chybových kódov, takže ľavé pripojenie fungovalo veľmi dlho. Musel som ho nahradiť vnútorným spojením, ktoré letelo. Zároveň sa však stratili riadky, pre ktoré sa chyba nenašla. Stále som nevedel prísť na to, ako tieto riadky vtiahnuť do výsledku.

Dotaz bol napísaný pre linkovací systém, t.j. v zásade nemožno použiť žiadne tabuľky hodnôt ani dočasné tabuľky. Tu sú dávkové požiadavky užitočné.

Jednoducho som znova spojil všetky riadky s chybami so všetkými riadkami, pre ktoré sa našli chyby a ešte som pridal typ chyby „Iné chyby“.

Článok popisuje mechanizmus dávkových požiadaviek implementovaných v platforme 1C:Enterprise. Po prečítaní článku sa dozviete:

  • Čo sú to dávkové požiadavky a na čo slúžia?
  • Ako vytvoriť balík dotazov pomocou nástroja na tvorbu dotazov?
  • Ako vrátiť pole výsledkov pre každú požiadavku z dávky?

Použiteľnosť

Materiál je relevantný pre aktuálne verzie platformy 1C:Enterprise, vydanie 8.3

Účel balíka žiadostí

Platforma vám umožňuje pracovať s dávkami požiadaviek. Dostávame možnosť realizovať niekoľko požiadaviek „naraz“. V dávkovej požiadavke sú texty požiadaviek oddelené symbolom ";" (bodkočiarka).

Dotazy sa vykonávajú postupne, zatiaľ čo dočasné tabuľky, ktoré boli vytvorené počas vykonávania dotazu, budú existovať až do konca vykonania celej dávky dotazu alebo do vykonania dotazu v dávke, ktorá túto dočasnú tabuľku zničí. Dôležitý rozdiel z vnoreného dotazu je, že výsledky každého dotazu balíka sú dostupné samostatne.

Dávky dotazov vám umožňujú dosiahnuť postupné vykonávanie dotazov. Na tento účel sa v dávkovom dotaze najskôr vytvoria dočasné tabuľky, potom sa zdieľajú (spojenie, spojenie, filtre), aby sa získal konečný výsledok dotazu. Je tiež dôležité poznamenať, že používanie dočasných tabuliek v dávkových dotazoch zlepšuje čitateľnosť tela dotazu.

Veľké dopyty s vnorenými dopytmi zabalenými do seba sú často dosť ťažko pochopiteľné. Ale ak prepíšete takýto dotaz pomocou dočasných tabuliek, viditeľnosť dotazu sa môže dosť zvýšiť. Použitie balíka dotazov s dočasnými tabuľkami môže tiež zlepšiť výkon dotazov.

Existujú techniky optimalizácie výkonu dotazov založené na nahradení vnorených dotazov dočasnými tabuľkami.

Dočasná tabuľka môže byť užitočná, keď potrebujete použiť rovnaké údaje viackrát vo veľkom dotaze, ako je spájanie alebo spájanie s inými tabuľkami. Pri použití vnorených dopytov by sa takéto dáta museli získavať niekoľkokrát pomocou rovnakých vnorených dopytov, čo by samozrejme ovplyvnilo čitateľnosť textu aj výkon.

Vytvorte balík dotazov pomocou konštruktora

Jednotlivé požiadavky obsiahnuté v balíku sú v texte oddelené symbolom ";" (bodkočiarka). Aby ste sa vyhli manuálnemu rozdeleniu tela dotazu, môžete na to použiť Query Builder.
Zostavovač dotazov má samostatnú kartu pre balíky dotazov. Požiadavky je možné pridávať do balíka pomocou príslušného tlačidla na paneli príkazov, ako aj posúvať nahor alebo nadol.

Vizuálne zobrazenie jednotlivých dotazov - záložky na pravej strane konštruktora, pomocou ktorých môžete pristúpiť k úprave textu konkrétneho dotazu. Na týchto záložkách sa zobrazujú názvy pre dočasné tabuľky, pre požiadavky na výber údajov – „Požiadavka na balík 2“ atď., na vymazanie – „– NameVT“.

V zozname databázových tabuliek sa tiež objavia dočasné tabuľky vytvorené v rámci tento balík. To však neznamená, že dočasné tabuľky sú uložené v databáze spolu so všetkými ostatnými tabuľkami infobase.

Vykonávanie žiadostí o balík

Ak je objekt Dopyt pri vykonávaní dávkového dotazu je nainštalovaný dočasný správca tabuliek, dočasné tabuľky, ktoré neboli zničené ako súčasť dávkového dotazu, sa uložia do nainštalovaného správcu.

V texte dávkového dotazu je možné použiť a zničiť dočasné tabuľky, ktoré existovali v nainštalovanom správcovi dočasných tabuliek v čase spustenia dávky.

Okrem metódy Execute(), ktorý postupne vykoná všetky požiadavky balíka a vráti výsledok poslednej požiadavky v balíku, v platforme existuje iná metóda - ExecutePackage().

Táto metóda vykoná všetky dotazy v poradí a vráti pole výsledkov pre každý dotaz v balíku v poradí, v akom sa dopyty objavia v tele balíka.

Výsledkom vykonania požiadavky na zničenie dočasnej tabuľky je hodnota Nedefinované, ktorý je tiež umiestnený v poli výsledkov.

Tento článok je určený čitateľom, ktorí poznajú jazyk SQL.

Dopytovací jazyk v 1C, ktorý sa používa od verzie 8, sa teraz stal užitočný nástroj pre prácu s databázami, čo umožňuje z nich čítať, ale nie zapisovať. Syntakticky je dopytovací jazyk veľmi podobný jazyku SQL, ale v ruštine.

Nižšie je uvedená tabuľka korešpondencie medzi hlavnými operátormi dopytovacieho jazyka a SQL:

1C operátory dotazovacieho jazyka

SQL príkaz

RÔZNY

COMPOUND

GROUP BY

ZJEDNOTIŤ

TRIEDIŤ PODĽA

A to ani zďaleka nie je úplný zoznam. Úplnejšie základné informácie na dostupných operátorov dotazovací jazyk možno získať v nástroji na tvorbu dotazov, o ktorom sa bude diskutovať nižšie.

Realizácia požiadavky 1C od programový kód sa vykonáva pomocou vstavaného jazykového objektu „Požiadavka“. Príklad napísania databázového dotazu pomocou vstavaného programovacieho jazyka:

Žiadosť = Nová požiadavka; Query.Text = "CHOOSE | Synonymum.Reference AS Reference |FROM | Catalog.Directory1 AS Synonymum"; Selection = Query.Execute().Select(); While Selection.Next() Loop // Vloženie spracovania výberu SelectionDetailRecords End of Loop;

Metóda „Execute“ vykoná dotaz, metóda „Select“ vráti hodnotu typu „SelectionFromQueryResult“. Môžete tiež použiť metódu Unload, ktorá vráti tabuľku hodnôt.

Parametre dotazu sú uložené vo vlastnosti "Parametre" (v tomto prípade ide o štruktúru, takže sú tu použiteľné všetky metódy štruktúry - vložiť, odstrániť atď.).

Príklad nastavenia parametra "Query.Parameters.Insert" ("Directory", ReferenceReference). V dotaze môžete pristupovať k parametrom prostredníctvom ampersandu „&Odkaz“. Nižšie je uvedený príklad žiadosti s parametrami:

Žiadosť = Nová požiadavka; Query.Text = "SELECT | Users.Reference AS Link, | Users.Parent AS Parent, | Users.Name AS Name |FROM | Directory.Users AS Users |WHERE | Users.Reference = &Adresár"; Query.Parameters.Insert("Katalóg", DirectoryReference); Selection = Query.Execute().Select(); While Selection.Next() Loop // Vloženie spracovania výberu SelectionDetailRecords End of Loop;

Pripomeňme, že dopytovací jazyk je určený iba na čítanie údajov z databázy, takže nemá analógy takýchto dopytov. SQL príkazy ako INS ERT a UPDATE. Údaje je možné upravovať iba cez objektový model vstavaný programovací jazyk 1C. V dopytovacom jazyku 1C existujú aj operátory, ktoré nemajú v SQL žiadne analógy, napríklad:

  • V HIERARCHII
  • PUT
  • INDEX BY

V HIERARCHII– umožňuje vybrať všetky prvky hierarchického slovníka, ktoré sú zahrnuté v hierarchii odovzdávaného odkazu. Ukážka žiadosti pomocou V HIERARCHII:

SELECT Products.Link, Products.Article FROM Directory.Products AS Products WHERE Products.Link IN HIERARCHHY (&Citrus)“

V tomto prípade sa do výsledku vrátia všetky podriadené prvky katalógu nomenklatúry Citrus, bez ohľadu na to, koľko úrovní hierarchie má tento katalóg.

Tiež je napríklad úlohou nájsť produkt s názvom „Pen“. Produkt musí byť zaradený do hierarchie „Papiernictvo. Tovar“, to znamená, že nemusíme hľadať kľučku. Štruktúra nomenklatúry je v tomto prípade takáto:

kancelária

|_ Plniace perá |_ Červené pero |_ Modré pero |_ Atramentové perá |_ Pravítka

príslušenstvo

|_ Kľučky |_ Jednoduchá kľučka |_ Luxusná kľučka

Píšeme dotaz takto:

VYBERTE Tovar.Odkaz, Tovar.Článok Z adresára.Tovar AKO Tovar KDE Tovar.Názov Podobne ako "Pen%" A Tovar.Odkaz V HIERARCHII (&Kancelária)"

Pri použití konštrukcie V HIERARCHII majte na pamäti, že ak zadáte prázdnu referenciu na parameter „Office“, vykonávanie požiadavky sa spomalí, pretože platforma skontroluje, či každý prvok patrí do koreňového adresára.

PUT– Tento príkaz umiestni výsledok do dočasnej tabuľky. Príklad žiadosti:

SELECT Users.Reference AS Reference, Users.Parent AS Parent, Users.Name AS Name PUT SelectedUsers FROM Directory.Users AS Users WHERE Users.Reference = &Directory; SELECT SelectedUsers.Reference AS Link, SelectedUsers.Parent AS Parent, SelectedUsers.Name AS Name FROM SelectedUsers AS SelectedUsers

Tento SQL dotaz bude vykonaný niekoľkými dotazmi:

  • Vytvorenie dočasnej tabuľky (platforma môže „znova použiť“ predtým vytvorené dočasné tabuľky, takže k vytvoreniu nedôjde vždy);
  • Ukladanie údajov do dočasnej tabuľky;
  • Vykonanie hlavného dotazu, konkrétne SEL ECT z tejto dočasnej tabuľky;
  • Zničenie/vyčistenie dočasného stola.

Dočasná tabuľka môže byť explicitne zničená pomocou konštrukcie ZNIČIŤ, alebo implicitne - pri zatváraní dočasného správcu tabuliek.

Objekt „Request“ vstavaného programovacieho jazyka má vlastnosť „TemporaryTable Manager“, ktorá je určená na prácu s dočasnými tabuľkami. Príklad kódu:

MBT = NewTempTableManager(); Žiadosť = Nová požiadavka; Query.TemporaryTable Manager = MBT;

Po vykonaní dotazu je možné premennú MBT použiť druhýkrát v inom dotaze, čo je nepochybne ďalšie plus používania dočasných tabuliek. V tomto prípade bude dočasná tabuľka vymazaná z databázy, keď sa zavolá metóda „Zavrieť“…

MVT.Close();

...alebo pri vymazaní premennej z pamäte, teda pri vykonávaní metódy, v ktorej bola premenná deklarovaná. Dočasné tabuľky zvyšujú zaťaženie diskového podsystému, takže by ste nemali vytvárať príliš veľa dočasných podsystémov (napríklad v slučke) alebo veľké podsystémy.

INDEX BY– tento operátor sa používa v spojení s operátorom PUT. Pri vytváraní dočasnej tabuľky môže tento operátor indexovať vytvorenú tabuľku, čo výrazne urýchľuje prácu s ňou (avšak len v prípade, že index zodpovedá vášmu dotazu).

Bezplatné odborné poradenstvo

Ďakujeme vám za vašu reakciu!

Špecialista 1C vás bude kontaktovať do 15 minút.

Vlastnosti niektorých operátorov dopytovacieho jazyka

PRE ZMENUdaný operátor je určený na uzamknutie konkrétnej tabuľky dotazu (alebo všetkých tabuliek, ktoré sa zúčastňujú dotazu). Uzamykanie sa vykonáva umiestnením U zámku na stôl. V SQL je to implementované cez hint UPDLOCK. Táto konštrukcia je nevyhnutná, aby sa zabránilo uviaznutiu. Príklad dotazu s konštruktom PRE ZMENU:

SELECT Users.Reference AS Link, Users.Parent AS Parent, Users.Name AS Name FROM Directory.Users AS Users

IN tento príklad U Zámok sa umiestni na tabuľku „Používatelia“. Ak nešpecifikujete tabuľku, ktorá sa má zamknúť, bude sa vzťahovať na všetky tabuľky zúčastňujúce sa dotazu. Je dôležité poznamenať, že táto konštrukcia funguje iba v konfiguráciách, v ktorých je automatický režim riadenie blokovania.



COMPOUND- dotaz podporuje pripojenia ĽAVÝ/PRAVÝ, PLNÝ, VNÚTORNÝ,čo zodpovedá spojeniam v SQL - LEFT/RIGHT JOIN, OUTER JOIN, INNER JOIN.

Pri použití nástroja na tvorbu dotazov to však nebudete môcť urobiť SPRÁVNE PRIPOJTE SA. Konštruktor jednoducho vymení tabuľky, ale vždy zostane operátor. Z tohto dôvodu v 1C nikdy nenájdete použitie správneho spojenia.

Syntakticky spojenie vyzerá takto:

SELECT Table1.Reference AS Reference FROM Reference.Reference1 AS Table1 LEFT JOIN Reference.Reference2 AS Table2 BY Table1.Attributes = Table2.Attributes

Dotazovací jazyk 1C nemá operátor na pripojenie karteziánskeho súčinu (CROSS JOIN). Neprítomnosť operátora však neznamená, že dopytovací jazyk nepodporuje takéto spojenie. V prípade potreby môžete tabuľky spojiť nasledujúcim spôsobom:

SELECT Table1.Reference AS Reference FROM Reference.Reference1 AS Table1 LEFT JOIN Reference.Reference2 AS Table2 ON TRUE

Ako vidíte na príklade, kľúč pripojenia je nastavený V PRAVDE, to znamená, že každý riadok jednej tabuľky zodpovedá riadku inej tabuľky. Na type spojenia (LEFT, RIGHT, FULL, INNER) nezáleží, ak máte riadky v oboch tabuľkách, ale ak jedna tabuľka nemá žiadne riadky (tabuľka sa nechá ísť), výsledok bude iný. Napríklad pri používaní INTERNÉ výsledok pripojenia bude prázdny. Použitím VĽAVO VPRAVO výsledkom spojenia budú alebo nebudú údaje v závislosti od toho, či spájame tabuľku s údajmi alebo nie. Použitím KOMPLETúdaje o pripojení budú vždy (samozrejme len jedna tabuľka, keďže druhá je prázdna), výber typu pripojenia závisí od konkrétnej úlohy aplikácie.

Malá vizuálna stopa, ako fungujú odlišné typy spojenia:



PÁČI SA MI TO. Na rozdiel od podobného operátora jazyk SQL– LIKE, šablóna pre PÁČI SA MI TO možno zadať iba pomocou niektorých špeciálnych znakov:

  • % (percento): sekvencia obsahujúca ľubovoľný počet ľubovoľných znakov;
  • _ (podčiarkovník): jeden ľubovoľný znak;
  • / - nasledujúci znak by sa mal interpretovať ako bežný znak.

VÝSLEDKY ZAPNUTÉ ekvivalentom SQL je operátor ROLLUP. Príklad použitia operátora VÝSLEDKY:

VYBERTE Tovar. Cena AKO Cena, Tovar. Položka AKO Tovar Z Adresára. Nomenklatúra AKO Tovar VÝSLEDKY PRIEMER (Cena) PODĽA Tovaru

Výsledok bude takýto:

Posteľ

9833,333

železo

Pero

To znamená, že k výsledku sa pridá ďalší riadok, ktorý obsahuje hodnotu poľa, pomocou ktorého sa zoskupenie vykonáva, a hodnotu agregačnej funkcie.

Práca s dávkovými požiadavkami

1C vám umožňuje pracovať s dávkami žiadostí. V dávkovej požiadavke sú texty požiadaviek oddelené bodkočiarkou (;). Vykonanie dávkovej požiadavky 1C sa vykonáva postupne. Príklad textu hromadnej žiadosti:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Name FROM Directory.Users AS Users;
SELECT Work Schedule.User AS User, Work Schedule.Date AS Date, Work Harmony. Pracovný čas AKO Pracovný čas Z údajového registra Pracovný rozvrh AKO Pracovný plán

Ak chcete získať výsledok všetkých požiadaviek zahrnutých v balíku, musíte použiť metódu objektu požiadavky "ExecutePackage" namiesto "Execute". Táto metóda vykoná všetky požiadavky postupne. Výsledkom dotazu je pole výsledkov pre každý dotaz z balíka a poradie v poli je rovnaké ako poradie požiadaviek v tele balíka.

Vzhľadom na dopytovací jazyk stojí za zmienku funkcia ako virtuálne tabuľky. V databáze nie sú prítomné virtuálne tabuľky, ide o druh obalu, ktorý sa vykonáva na strane DBMS ako dotaz pomocou poddotazov. Príklad dotazu 1C pomocou virtuálnych tabuliek:

SELECT Register záväzkovObraty.Záväzky AS Povinnosť Z Registra kumulácie.Register záväzkov.Obraty() AS Register záväzkovObraty

Takýto dotaz na DBMS bude vyzerať takto:

SEL ECT T1.Fld25931RRef FR OM (SELECT T2._Fld25931RRef AS Fld25931RRef, CAST(SUM(T2._Fld25936) AS NUMERIC(38, 8)) AS Fld25936Obrat_, AST25931RRef AS Fld25931RRef(SUM(T2._Fld25936) AS NUMERIC(38, 8)) AS Fld25936Obrat_, 25936CAST. AS Fld25937Turnover_ FR OM dbo._AccumRgTn25938 T2 WH ERE ((T2._Fld949 = @P1)) A ((T2._Fld25936 @P2 ALEBO T2._Fld25937 @P3) H2.AV6_TLD915 GROUP ) ) AKO ČÍSELNÉ (38, 8))) 0,0 ALEBO (HRADENÉ (SÚČET(T2._Fld25937) AKO ČÍSLO(38, 8))) 0,0) T1>>>>

Je vidieť, že to nevyzerá ako SQL, keďže existuje poddotaz, zoskupenie. Virtuálne tabuľky sú vo všeobecnosti „syntaktický cukor“, to znamená, že boli vytvorené vo všeobecnosti pre pohodlie pri vytváraní dopytov, aby boli dopyty kompaktnejšie a čitateľnejšie.

Virtuálne tabuľky majú iba registre, ale ktoré virtuálne tabuľky sú dostupné pre register, môžete vidieť v nástroji na tvorbu dotazov.



Pri používaní virtuálnych tabuliek musíte vždy zadať podmienku výberu. V opačnom prípade sa môžu vyskytnúť problémy s výkonom.



V tele žiadosti to vyzerá takto:

Register Akumulácie.RegistráciaZáväzky.Obraty(, Operácia = &Operácia) AS RegisterPovinnostiObraty

Pre pohodlie pri písaní dotazov, teda pri vytváraní textov dotazov, je v 1C konštruktor, ktorý je možné volať cez kontextové menu (kliknutie pravým tlačidlom myši):



V nástroji Query Builder môžete vidieť úplný zoznam podporovaných funkcií a operátorov jazyka dotazov.


Query Builder je veľmi flexibilný vizuálny nástroj na vytváranie dopytov akejkoľvek zložitosti. Je k dispozícii iba v režime konfigurátora. V režime Enterprise existuje takzvaná "Konzola dotazov" - to je externé spracovanie dodávané na disku ITS. Pre spravovanú aplikáciu je možné konzolu žiadostí stiahnuť z webovej lokality its.1c.ru.

Popis práce v nástroji na tvorbu dotazov presahuje rámec tohto článku, preto sa ním nebudeme podrobne zaoberať.

Dôvody pre neoptimálny výkon dotazov

Nižšie je uvedený zoznam hlavných dôvodov (nie však všetkých), ktoré vedú k pomalému vykonávaniu dotazu.

  • Použitie spojenia s poddotazmi

Neodporúča sa spájať s poddotazmi, poddotazy by sa mali nahradiť dočasnými tabuľkami. Spájanie poddotazov môže viesť k výraznej strate výkonu, zatiaľ čo vykonávanie dotazu na rôznych DBMS sa môže výrazne líšiť v rýchlosti. Rýchlosť vykonávania takýchto dopytov je tiež citlivá na štatistiky v DBMS. Dôvodom tohto správania je, že optimalizátor DBMS nemôže vždy správne určiť optimálny plán vykonávania dotazu, pretože optimalizátor nevie nič o tom, koľko riadkov vráti poddotaz po jeho vykonaní.

  • Používanie virtuálnych tabuliek v spojení dotazov

Virtuálne tabuľky na úrovni DBMS sa vykonávajú ako poddotazy, takže dôvody sú rovnaké ako v prvom odseku.

  • Použitie podmienok v dotaze, ktoré sa nezhodujú s existujúcimi indexmi

Ak sú v podmienkach dopytu (v operátorovi KDE alebo v podmienkach virtuálnej tabuľky) používa polia, ktoré nie sú všetky zahrnuté v indexe, daná žiadosť bude hotovo pomocou SQL konštrukcie skenovania tabuľky alebo skenovania indexu (úplne alebo čiastočne). To ovplyvní nielen čas vykonania dotazu, ale aj nadmerné uzamknutie S na nadbytočných riadkoch, čo môže viesť k eskalácii uzamknutia, to znamená, že celá tabuľka bude uzamknutá.

  • Použitie OR v podmienkach dopytu

Použitie logický operátor ALEBO v stavebníctve KDE môže tiež viesť k skenovaniu tabuľky. Je to spôsobené tým, že DBMS nedokáže správne použiť index. Namiesto ALEBO možno použiť konštrukciu KOMBINUJ VŠETKO.

  • Získavanie údajov cez bodku pre polia zloženého typu

Neodporúča sa prijímať hodnoty cez bodku (v konštrukcii VYBERTE SI KDE), pretože ak je atribút objektu zložený typ, spojenie sa uskutoční s každou tabuľkou zahrnutou v tomto zloženom type. V dôsledku toho bude dopyt do DBMS výrazne komplikovanejší, čo môže optimalizátorovi brániť vo výbere správneho plánu vykonávania dotazu.



Páčil sa vám článok? Zdieľaj to