Požiadavka na dávku 1s 8.3. Jednoduché otázky. Vytvorenie dávky požiadaviek pomocou návrhára

značne zvyšujú čitateľnosť, čím sa znižuje pravdepodobnosť chýb => toto samo o sebe mi stačí.

Vstavanému dotazovaciemu jazyku 1C:Enterprise verzie 8.0 chýbala možnosť používať dočasné tabuľky a zapisovať dávkové dotazy. Zároveň bolo často potrebné vykonať komplexné výpočty v rámci jednej požiadavky (to znamená jeden cyklus interakcie medzi klientom - 1C:Enterprise server - DBMS server). Na vyriešenie takýchto problémov sa používali poddotazy - volania nie na objekty metadát, ale na výbery z týchto objektov. Typicky sa poddotazy vykonávali so zoskupovaním a často sa používali pri spojeniach.

Optimalizátor servera DBMS (bez ohľadu na to, ktorý DBMS používate) nemôže vždy správne optimalizovať takýto dotaz. V tomto prípade je problémom optimalizátora výber správneho spôsobu pripojenia. Existuje niekoľko algoritmov na spojenie dvoch vzoriek. Výber jedného alebo druhého algoritmu závisí od toho, koľko záznamov bude obsiahnutých v jednej a druhej vzorke. Ak spájate dve fyzické tabuľky, DBMS môže jednoducho určiť veľkosť oboch vzoriek na základe dostupných štatistík. Ak je jedným zo spojených výberov poddotaz, potom je veľmi ťažké pochopiť, koľko záznamov vráti. V tomto prípade môže DBMS urobiť chybu pri výbere plánu, čo povedie ku katastrofálnemu poklesu výkonu dotazov.

Prepísanie dotazu pomocou vyššie uvedenej metódy má zjednodušiť prácu optimalizátora DBMS. V prepísanom dotaze budú všetky výbery zúčastňujúce sa spojení fyzické tabuľky a DBMS bude môcť ľahko určiť veľkosť každého výberu. To umožní DBMS zaručiť výber najrýchlejšieho zo všetkých možných plánov. Navyše, DBMS urobí správnu voľbu bez ohľadu na akékoľvek podmienky. Takto prepísaný dotaz bude fungovať rovnako dobre na akomkoľvek DBMS, čo je obzvlášť dôležité pri vývoji riešení pre obeh. Okrem toho je takto prepísaný dotaz lepšie čitateľný, ľahšie pochopiteľný a laditeľný.

Treba chápať, že takýmto prepísaním dotazu sme doň mohli vniesť určité spomalenie z dôvodu dodatočnej réžie – vytváranie dočasných tabuliek. Ak DBMS neurobí chybu pri výbere plánu, pravdepodobne vykoná starý dotaz rýchlejšie ako nový. Toto spomalenie však bude vždy extrémne malé. Veľkosť spomalenia závisí od použitej DBMS a výkonu hardvéru. V typickom prípade môže vytvorenie jednej dočasnej tabuľky trvať niekoľko milisekúnd. To znamená, že tieto spomalenia nemôžu mať výrazný vplyv na výkon systému a spravidla ich možno ignorovať.

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

Dotazovací jazyk 1C, používaný od verzie 8, sa dnes stal užitočným nástrojom na prácu s databázami, ktorý vám 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ým dotazovacím jazykom a operátormi SQL:

1C operátory dotazovacieho jazyka

SQL príkaz

RÔZNY

COMPOUND

GROUP BY

SPOJOVAŤ

TRIEDIŤ PODĽA

A toto nie je úplný zoznam. Kompletnejšie referenčné informácie o dostupných operátoroch dotazovacieho jazyka môžete získať v návrhárovi dotazov, o ktorom sa bude diskutovať nižšie.

Vykonanie požiadavky 1C z programového kódu sa vykonáva pomocou vstavaného jazykového objektu „Request“. Príklad napísania databázového dotazu pomocou vstavaného programovacieho jazyka:

Žiadosť = Nová požiadavka; Query.Text = "SELECT | Synonymum.Link AS Link |FROM | Directory.Directory1 AS Synonymum"; Select = Query.Run().Select(); While Selection.Next() Loop // Vloženie spracovania výberu SelectionDetailedRecords EndCycle;

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

Parametre požiadavky 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“, DirectoryLink). V žiadosti môžete pristupovať k parametrom pomocou ampersandu „&Adresár“. Nižšie je uvedený príklad požiadavky s parametrami:

Žiadosť = Nová požiadavka; Query.Text = "SELECT | Users.Link AS Link, | Users.Parent AS Parent, | Users.Name AS Name |FROM | Directory.Users AS Users |WHERE | Users.Link = &Adresár"; Query.Parameters.Insert("Adresár", DirectoryLink); Select = Query.Run().Select(); While Selection.Next() Loop // Vloženie spracovania výberu SelectionDetailedRecords EndCycle;

Pripomeňme, že dopytovací jazyk je určený len na čítanie údajov z databázy, takže nemá analógy takých príkazov SQL ako INS ERT a UPDATE. Údaje je možné upravovať iba prostredníctvom objektového modelu vstavaného programovacieho jazyka 1C. Aj v dotazovacom jazyku 1C existujú operátory, ktoré nemajú v SQL žiadne analógy, napríklad:

  • V HIERARCHII
  • PLACE
  • INDEX BY

V HIERARCHII– umožňuje vybrať všetky prvky hierarchického adresára, ktoré sú zahrnuté v hierarchii prenášaného odkazu. Príklad použitia žiadosti V HIERARCHII:

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

V tomto prípade výsledok vráti všetky podriadené prvky adresára nomenklatúry Citrus, bez ohľadu na to, koľko úrovní hierarchie má tento adresár.

Úlohou je napríklad 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 dverí. Š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 nasledujúcu žiadosť:

SELECT Products.Link, Products.Article FROM Directory.Products AS Products WHERE Products.Name Like "Pen%" AND Products.Link IN HIERARCHY(&Picture)"

Pri použití dizajnu V HIERARCHII je potrebné vziať do úvahy, že ak prejdete prázdnym odkazom do parametra „Office“, vykonávanie požiadavky sa spomalí, pretože platforma skontroluje každý prvok, či patrí do koreňového adresára.

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

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Name PLACE SelectedUsers FROM Directory.Users AS Users WHERE Users.Link = &Adresár; SELECT SelectedUsers.Link 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);
  • Umiestnenie údajov do dočasnej tabuľky;
  • Vykonanie hlavného dotazu, konkrétne SEL ECT z tejto dočasnej tabuľky;
  • Zničenie/čistenie dočasného stola.

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

Objekt „Query“ vstavaného programovacieho jazyka má vlastnosť „Temporary Table Manager“, ktorá je určená na prácu s dočasnými tabuľkami. Vzorový kód:

MVT = New TemporaryTableManager(); Žiadosť = Nová požiadavka; Query.TemporaryTableManager = MVT;

Po vykonaní dotazu je možné premennú MVT použiť druhýkrát v inom dotaze, čo je nepochybne ďalšia výhoda používania dočasných tabuliek. V tomto prípade bude dočasná tabuľka z databázy vymazaná pri volaní metódy “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ľkoobjemových podsystémov.

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

Bezplatná odborná konzultácia

Ďakujeme za vašu žiadosť!

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

Vlastnosti niektorých operátorov dopytovacieho jazyka

PRE ZMENU– tento operátor je určený na uzamknutie konkrétnej tabuľky dotazu (alebo všetkých tabuliek, ktoré sa zúčastňujú dotazu). Uzamknutie sa dosiahne použitím U zámku na stôl. V SQL je to implementované cez hint UPDLOCK. Tento dizajn je potrebný, aby sa zabránilo uviaznutiu. Príklad požiadavky s konštrukciou PRE ZMENU:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Name FROM Directory.Users AS Users LEFT JOIN Directory.RFK AS RFK BY Users.RFK = RFK.Link TO CHANGE Directory.Users

V tomto príklade sa zámok U umiestni na tabuľku používateľov. Ak nešpecifikujete tabuľku pre zámok, bude uložený na všetky tabuľky zúčastňujúce sa dotazu. Je dôležité poznamenať, že tento dizajn funguje iba v konfiguráciách, v ktorých je povolený režim automatického riadenia zámku.



COMPOUND– požiadavka 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 operátor bude vždy ľavák. Z tohto dôvodu nikdy neuvidíte použitie správneho spojenia v 1C.

Syntakticky spojenie vyzerá takto:

SELECT Table1.Link AS Link FROM Directory.Directory1 AS Table1 LEFT JOIN Directory.Directory2 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 takéto spojenie nepodporuje. V prípade potreby môžete stoly pripojiť takto:

SELECT Table1.Link AS Link FROM Directory.Directory1 AS Table1 LEFT JOIN Directory.Directory2 AS Table2 BY TRUE

Ako je zrejmé z príkladu, kľúč pripojenia je nastavený PODĽA PRAVDY, to znamená, že každý riadok jednej tabuľky zodpovedá riadku inej tabuľky. Typ spojenia (ĽAVÝ, PRAVÝ, PLNÝ, VNÚTORNÝ) nie je dôležitý, ak máte riadky v oboch tabuľkách, ale ak v jednej z tabuliek (povedzme v tabuľke) žiadne riadky nie 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ú dáta v závislosti od toho, ktorú tabuľku spájame - s dátami alebo nie. Použitím PLNÝ Dáta budú vždy prepojené (samozrejme len z jednej tabuľky, keďže druhá je prázdna), výber typu spojenia závisí od konkrétnej úlohy aplikácie.

Malá vizuálna rada o tom, ako fungujú rôzne typy pripojení:



PÁČI SA MI TO. Na rozdiel od podobného operátora 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 SOFTVÉRU Analóg SQL je operátor ROLLUP. Príklad použitia operátora VÝSLEDKY:

VYBERTE produkty. Cena AKO Cena, Produkty.Produkt AKO Produkt Z adresára.Nomenklatúra AKO Produkty PRIEMERNÉ VÝSLEDKY (Cena) PODĽA produktu

Výsledok bude takýto:

Posteľ

9833,333

Železo

Pero

To znamená, že k výsledku sa pridá ďalší riadok obsahujúci 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 (;). Dávková požiadavka 1C sa vykonáva postupne. Príklad textu dávkovej požiadavky:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Name FROM Directory.Users AS Users;
VYBERTE pracovný plán.Používateľ AKO Používateľ, Plán práce.Dátum AKO Dátum, Plán práce.Pracovný čas AKO Pracovný čas OD Registrovať informácie.Práca AKO Plán práce

Ak chcete získať výsledok všetkých dotazov zahrnutých v balíku, musíte použiť metódu „ExecutePackage“ objektu požiadavky namiesto „Run“. Táto metóda vykonáva všetky požiadavky postupne. Výsledok dotazu je pole výsledkov pre každý dotaz v balíku a postupnosť umiestnenia v poli je rovnaká ako postupnosť dotazov v texte balíka.

Pri zvažovaní dopytovacieho jazyka stojí za zmienku taká funkcia, ako sú virtuálne tabuľky. Virtuálne tabuľky sa v databáze nenachádzajú, sú akýmsi obalom, ktorý sa vykonáva na strane DBMS ako dotaz pomocou poddotazov. Príklad dotazu 1C pomocou virtuálnych tabuliek:

SELECT RegisterZáväzkyObraty.Zodpovednosť AKO Zodpovednosť FROM RegisterAkumulácie.RegistráciaZáväzky.Turnover() AS RegisterZáväzkyObraty

Takýto dotaz na DBMS by vyzeral takto:

SEL ECT T1.FLD25931RRRRRERF FR OM (Vyberte t2._fld25931rref ako FLD25931RRRRERF, CAST (SUM (T2._FLD25936) AS Numeric (38, 8)) As FLD25936LDUM (25931rref ako FLD25931 RRRRERF, CAST ako FLD25936 (SUM 25936, 293 CAST) ako číselný 8)) AS Fld25937Turnover_ FR OM dbo._AccumRgTn25938 T2 WH ERE ((T2._Fld949 = @P1)) A ((T2._Fld25936 @P2 ALEBO T2._Fld25937 @T25937 (T2._Fld25937 @T25937 @T2P3) GROUP T2._Fld25) 936 ) AKO ČÍSLO(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 sú vo všeobecnosti vytvorené pre pohodlie pri vytváraní dotazov, aby boli dotazy kompaktnejšie a čitateľnejšie.

Virtuálne tabuľky majú iba registre, ale ktoré virtuálne tabuľky sú dostupné v registri, môžete vidieť v návrhári 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 kumulácie Register záväzkov Obraty (, Prevádzka = &Prevádzka) AS Register záväzkov Obraty

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 (pravé tlačidlo myši):



V návrhárovi dotazov môžete vidieť úplný zoznam podporovaných funkcií a operátorov dotazovacieho jazyka.


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á „Query Console“ - ide o externé spracovanie dodávané na disku ITS. Pre spravovanú aplikáciu možno konzolu dotazov stiahnuť z its.1c.ru.

Popis práce v návrhárovi 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 (ale nie všetkých), ktoré vedú k pomalému vykonávaniu dotazu.

  • Použitie spojení s poddotazmi

Neodporúča sa vykonávať spojenie s poddotazmi, poddotazy by sa mali nahradiť dočasnými tabuľkami. Reťazenie poddotazov môže viesť k výrazným stratám výkonu a rýchlosť vykonávania dotazov na rôznych DBMS sa môže výrazne líšiť. 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 spojeniach 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é nevyhovujú existujúcim indexom

Ak je v podmienkach požiadavky (u prevádzkovateľa KDE alebo podmienky virtuálnej tabuľky) používa polia, ktoré nie sú všetky zahrnuté v indexe, tento dotaz sa vykoná pomocou skenovania tabuľky konštruktu SQL alebo skenovania indexu (úplne alebo čiastočne). To ovplyvní nielen čas vykonania dotazu, ale aj nadmerný zámok S bude umiestnený na ďalšie riadky, čo zase môže viesť k eskalácii zámku, to znamená, že celá tabuľka bude uzamknutá.

  • Použitie OR v podmienkach dopytu

Použitie logického operátora ALEBO v dizajne KDE môže tiež viesť k skenovaniu tabuľky. Stáva sa to preto, lebo DBMS nedokáže správne použiť index. Namiesto ALEBO môžete použiť dizajn KOMBINUJTE VŠETKO.

  • Prijímanie údajov cez bodku pre polia zloženého typu

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

Firemný blog 1C GOODWILL

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

Na dosiahnutie postupného vykonávania dotazov v balíku sa spravidla najprv vytvoria dočasné tabuľky, potom sa vytvoria podmienky na ich zdieľanie, ako sú filtre, spojenia a 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 dávky 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 zvyšuje čitateľnosť celého segmentu 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 povedie k zvýšeniu výkonu.

Ďalším dôležitým detailom v prospech dávkových dotazov v 1C je, že na rozdiel od vnorených dotazov môžeme samostatne získať výsledok každého dotazu v dávke.

Príklad vytvorenia balíka požiadaviek v jazyku 1C

Aby sme videli príklad vytvorenia balíka dotazov, použijeme návrhára dotazov, ktorý pre prehľadnosť zavoláme z konzoly dotazov. Okamžite teda vidíme výsledok spustenia balíka.

Vytvorme jednoduchú dávkovú požiadavku. Navrhujem okamžite vložiť text požiadavky do konzoly a potom otvoriť konštruktor a pozrieť sa, ako sa vytvára balík žiadosti. Pridajte novú požiadavku do konzoly a vložte nasledujúci text:

Samonosný. Rodič,

Samonosný kód,

Samonosný kód rýchleho výberu,

Samonosné. Meno,

Samonosné. Typ,

Samonosné. Podsúvahové,

Samonosné. Kvantitatívne,

Účtovná osnova Samonosné AS Samonosné

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

Samonosné typySubconto.Line Number AS Číslo riadku,

SamonosnéTypy Subconto.ViewSubconto AS TypeSubconto,

SamonosnéTypySubconto.TypeSubconto.Name AS Názov,

Samonosné typySubconto.TypeSubconto.ValueType ASValueType,

Samonosné typySubconto.OnlyTurnover AS OnlyTurnover,

SamonosnéTypySubconto.Summary AS Summative

Účtovná osnova Samonosný Typ podúčtu AS Samoúčtovníctvo Typy podúčtu

TRIEDIŤ PODĽA

Samonosné typySubconto.NumberLines

U mňa to vyzerá takto:

Teraz poďme k návrhárovi dotazov. Tu nás bude zaujímať karta „Požiadať o balík“:

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

Kliknite na tlačidlo „OK“ a skúste zobraziť výsledok dávkovej požiadavky.

Nastavíme parameter "Účet". Z účtovej osnovy si môžete vybrať ľubovoľný účet. Ako ste už pravdepodobne uhádli, tento balík žiadostí musí získať vlastnosti účtu. Kliknite na „Spustiť“ a pozrite si výsledok:

Metódy Run() a RunBatch()

Okrem metódy Execute(), ktorá jednu po druhej vykoná všetky požiadavky v dávke a vráti výsledok poslednej požiadavky, v 1C existuje metóda ExecuteBatch(). Vráti pole vzoriek každej požiadavky v dávke. Vo vyššie uvedenom príklade je to presne táto metóda.

ArrayResults = Query.ExecuteBatch();

Selection1 = ArrayResults.Select();

Ak Select1.Next() Then

//Akcie s výberom 1

koniec Ak;

SelectionViewsSubconto = ArrayResults.Select();

Príspevok Práca s dávkovými požiadavkami v 1C 8.3 a 8.2 sa prvýkrát objavil na blogu spoločnosti 1C GOODWILL.

Návrhár dotazov v 1C 8.3 a 8.2 je výkonný vývojový nástroj. Umožňuje vám zostaviť text požiadavky pomocou špeciálneho vizuálneho prostredia. Na vytvorenie požiadavky 1C teda nie je potrebné poznať vstavaný dopytovací jazyk, stačí sa orientovať v jednoduchom a intuitívnom rozhraní dizajnéra.

Zostavovač dotazov je sada kariet, z ktorých každá je zodpovedná za svoju vlastnú časť dotazu. Takže vyplnenie karty Tabuľky a polia Vyberáme tabuľky, z ktorých dotaz 1C dostane údaje a polia týchto tabuliek potrebné na vyriešenie konkrétneho problému. Výplň do muriva Podmienky na vybrané tabuľky kladieme podmienky, aby sme z nich vybrali len tie údaje, ktoré potrebujeme a pod.

Popis návrhára dotazov na oficiálnej webovej stránke 1C 8: v8.1c.ru

Tabuľky a polia; ; ; ; ; ; Vnorené dopyty (vo vývoji).

Ak chcete zavolať návrhára dotazov 1s 8 v kóde programu, musíte:

  • Vytvorte novú žiadosť
Žiadosť = Nová požiadavka;
  • Nastavte prázdny riadok textu požiadavky
Request.Text = "";
  • Umiestnite kurzor myši medzi úvodzovky a stlačte pravé tlačidlo myši. V kontextovej ponuke, ktorá sa otvorí, vyberte položku Konštruktor dotazov a odpovedať Áno na otázku o vytvorení novej požiadavky. Ak už bol text požiadavky zapísaný, musíte kliknúť kdekoľvek v ňom a zavolať konštruktor ;

Pozrime sa na všetky hlavné karty nástroja na tvorbu dotazov pomocou malých príkladov zvyšujúcej sa zložitosti. Tento prístup umožní začínajúcemu programátorovi 1C efektívnejšie študovať konštruktor a všetky jeho schopnosti. Pre príklady použijeme konfiguráciu Účtovníctvo 3.0.

Lekcia 1. Zostavovač dotazov je najjednoduchší prípad použitia.

Úloha: napíšte požiadavku do adresára nomenklatúry, vyberte celé názvoslovie adresára.

Nové karty: Tabuľky a polia.

Nové mechanizmy: zobrazenie a úprava textu požiadavky pomocou tlačidla „Žiadosť“.

Ak chcete začať vytvárať požiadavku, vytvorte novú požiadavku a zavolajte konštruktor (ako je napísané o pár odsekov vyššie). Potom sa na karte otvorí okno návrhára Tabuľky a polia.

Teoretická časť lekcie č.1

Tab Tabuľky a polia pozostáva z troch sekcií:

Databáza. Táto časť predstavuje všetky databázové tabuľky, ktoré možno použiť na zostavenie dotazu;

Tabuľky. V tejto časti sú vybrané tabuľky potrebné pre tento dotaz. Potom ich presuniete zo sekcie databázy potrebovať:

  • Alebo dvakrát kliknite na stôl;
  • Alebo použite tlačidlá „>“ alebo „>>“.

Nad sekciou Tabuľky Existuje množstvo tlačidiel. Väčšine z nich sa budeme podrobnejšie venovať v nasledujúcich lekciách. Zatiaľ uvediem len krátke vysvetlenia.

  • Vytvorte poddotaz(Červená čiara). Navrhnuté na vytvorenie nového poddotazu;
  • Vytvorte dočasný popis tabuľky(žltá čiara). Umožňuje zadať názov dočasnej tabuľky, ktorá sa nachádza mimo tohto dotazu; dá sa tiež použiť na odovzdanie tabuľky hodnôt do dotazu;
  • Zmeniť aktuálny prvok(zelená čiara). Umožňuje vám prejsť na vybratý poddotaz, dočasnú tabuľku alebo popis dočasnej tabuľky;
  • Odstrániť aktuálnu položku(modrá čiara). Odstráni vybratú tabuľku z vybratých tabuliek;
  • Vymeňte stôl(modrá čiara). Otvorí dialógové okno na nahradenie vybranej tabuľky. Užitočné, ak ste vybrali nesprávny register virtuálneho stola, pretože umiestnenie prebieha na aktuálne vybratom stole v zozname.
  • Možnosti virtuálneho stola(fialová čiara). Otvorí parametre tabuľky virtuálnych registrov.

Polia. Táto časť vyberá polia tabuľky z predchádzajúcej časti. Tieto polia budú stĺpce tabuľky alebo výberu získaného ako výsledok dotazu. Sú potrebné predovšetkým na to, aby sa z vybraných tabuliek získali len informácie potrebné v konkrétnom prípade. Aby ste ich presunuli zo sekcie Potrebné tabuľky:

  • Alebo dvakrát kliknite na pole;
  • Alebo použite tlačidlá „>“ alebo „>>“;
  • Nové pole môžete pridať aj sami pomocou ľubovoľného výrazu z polí vybratých tabuliek a funkcií dopytovacieho jazyka.

Nad sekciou Polia Existuje množstvo tlačidiel. Vytváraniu polí pomocou ľubovoľných výrazov sa budeme podrobnejšie venovať v nasledujúcich lekciách. Zatiaľ uvediem len krátke vysvetlenia.

  • Pridať(zelená čiara). Navrhnuté na pridanie nového poľa pomocou editora voľných výrazov;
  • Zmeniť aktuálny prvok(Červená čiara). Umožňuje zmeniť vybrané pole pomocou editora;
  • Vymazať aktuálne(modrá čiara). Odstráni vybraté pole zo zoznamu.

Praktická časť lekcie č.1

Zaoberali sme sa teóriou potrebnou na dokončenie úlohy uvedenej v tejto lekcii. Pripomeniem, ako to znie: napíšte požiadavku do adresára nomenklatúry, vyberte celé názvoslovie adresára.

Začnime vytvárať požiadavku na položky:

  • Vytvorme novú požiadavku a otvorme konštruktor pomocou metódy uvedenej na začiatku lekcie;
  • V kapitole Databáza, otvorme vlákno Adresáre a nájdeme tam sprievodcu nomenklatúra;
  • Vyberte ho a pomocou tlačidla „>“ ho presuňte do sekcie Stoly;
  • V kapitole Tabuľky otvorte adresár nomenklatúry pomocou ikony „+“;
  • V zozname polí, ktorý sa otvorí, nájdite pole Link a presuňte ho do sekcie Polia pomocou tlačidla „>“.
  • Požiadavka položky je pripravená, kliknite na tlačidlo „OK“ v spodnej časti okna návrhára.

Keď sa môj dopyt stal tak zložitým, že prekročil hranice môjho chápania, rozhodol som sa použiť dávkové dopyty.

Bol som však konfrontovaný s tým, že som o nich nič nevedel. 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:

SELECT T1.Zn PLACE VTBpísmená FROM (SELECT "A" AS Zn COMBINE ALL SELECT "B") AS T1;

VYBERTE T1.ZN UMIESTNITE VTDIGITS Z (VYBERTE "1" AKO VN KOMBINOVAŤ VŠETKY VYBERTE "2") AKO T1;

VYBERTE TB.Zn, TC.Zn, TB.Zn+TC.Zn Z VTB Písmená AS TB, VTC čísla AS TC

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

Obrázok ukazuje príklad vykonania požiadavky:

A teraz trochu zo skúsenosti. Prečo potrebujeme dávkové žiadosti?

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, musel byť text dopytu duplikovaný.

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

Okrem toho, ak sa použije systém skladania údajov (DCS), inteligentne vyberá potrebné polia a minimalizuje celý balík dopytov.

Ak žiadosti mali metódu Request.Run() potom teraz existuje metóda Request.ExecuteBatch(), ktorý vráti všetky tabuľky z balíka 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

Životný príbeh

Dovoľte mi vysvetliť, čo ma podnietilo spustiť dávkové požiadavky.

Predstavte si teda, že existuje dokument, ktorý má tabuľkovú časť. V stĺpci" Chyba» označuje, či pri vypĺňaní dokumentu došlo k chybe. 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.

Vložíme teda zoznam všetkých chýb do tabuľky 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 V jednom riadku môže byť niekoľko chýb.

Chyba ale nemusí byť rozpoznaná, t.j. vlajka" Chyba“ stojí, ale chybový text 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, pri ktorých sa nenašla chyba. Stále som nevedel prísť na to, ako tieto riadky dostať do výsledku.

Požiadavka bola napísaná na dispozičný systém, t.j. V zásade nemožno použiť žiadne tabuľky hodnôt ani dočasné tabuľky. Tu sa hodia hromadné dopyty.

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