Kontakty

Vytváranie požiadaviek a práca s nimi (pre začiatočníkov). Vytváranie a práca s dotazmi (pre začiatočníkov) Podmienka v dotaze 1C 8.3 príklady

Dotazovací jazyk v 1C 8 je zjednodušeným analógom známeho „štruktúrovaného programovacieho jazyka“ (ako sa častejšie nazýva SQL). Ale v 1C sa používa iba na čítanie údajov na zmenu údajov.

Ďalším zaujímavým rozdielom je ruská syntax. Aj keď v skutočnosti môžete použiť konštrukcie v anglickom jazyku.

Príklad žiadosti:

VYBERTE SI
Banks.Name,
Banky.Účet korešpondentov
OD
Adresár.Banky AKO Banky

Táto požiadavka nám umožní vidieť informácie o názve a korešpondenčnom účte všetkých bánk existujúcich v databáze.

Dotazovací jazyk je najjednoduchší a najefektívnejší spôsob získavania informácií. Ako je vidieť z vyššie uvedeného príkladu, v dopytovacom jazyku musíte použiť názvy metadát (ide o zoznam systémových objektov, ktoré tvoria konfiguráciu, t. j. adresáre, dokumenty, registre atď.).

Popis konštrukcií dotazovacieho jazyka

Štruktúra dopytu

Na získanie údajov stačí použiť konštrukcie „SELECT“ a „FROM“. Najjednoduchšia požiadavka vyzerá takto:

SELECT * FROM Directories.Nomenklatúra

Kde „*“ znamená výber všetkých polí tabuľky a Directories.Nomenclature – názov tabuľky v databáze.

Pozrime sa na komplexnejší a všeobecnejší príklad:

VYBERTE SI
<ИмяПоля1>AKO<ПредставлениеПоля1>,
Suma(<ИмяПоля2>) AKO<ПредставлениеПоля2>
OD
<ИмяТаблицы1>AKO<ПредставлениеТаблицы1>
<ТипСоединения>COMPOUND<ИмяТаблицы2>AKO<ПредставлениеТаблицы2>
BY<УсловиеСоединениеТаблиц>

KDE
<УсловиеОтбораДанных>

GROUP BY
<ИмяПоля1>

TRIEDIŤ PODĽA
<ИмяПоля1>

VÝSLEDKY
<ИмяПоля2>
BY
<ИмяПоля1>

V tomto dotaze vyberieme údaje polí „FieldName1“ a „FieldName1“ z tabuliek „TableName1“ a „TableName“, priradíme synonymá k poliam pomocou operátora „HOW“ a spojíme ich pomocou určitej podmienky „TableConnectionCondition “.

Z prijatých údajov vyberieme len údaje, ktoré spĺňajú podmienku z „KDE“ „Podmienka výberu údajov“ Ďalej zoskupíme požiadavku podľa poľa „Názov poľa1“, pričom „Názov poľa2“ vytvoríme súčty „Názov poľa1“ a posledné pole „Názov poľa2“.

Posledným krokom je triedenie požiadavky pomocou konštrukcie ORDER BY.

Všeobecné vzory

Pozrime sa na všeobecné štruktúry dopytovacieho jazyka 1C 8.2.

NAJPRVn

Pomocou tohto operátora môžete získať n počet prvých záznamov. Poradie záznamov je určené poradím v dotaze.

VYBERTE PRVÝCH 100
Banks.Name,
Banky kód AS BIC
OD
Adresár.Banky AKO Banky
TRIEDIŤ PODĽA
Banky.Názov

Žiadosť dostane prvých 100 záznamov z adresára „Banky“ zoradených podľa abecedy.

POVOLENÝ

Tento dizajn je relevantný pre prácu s mechanizmom. Podstatou mechanizmu je obmedziť čítanie (a iné akcie) na používateľov pre konkrétne záznamy v databázovej tabuľke, a nie pre tabuľku ako celok.

Ak sa používateľ pokúsi pomocou dotazu prečítať záznamy, ktoré sú pre neho nedostupné, zobrazí sa mu chybové hlásenie. Aby ste tomu zabránili, mali by ste použiť konštrukciu „POVOLENÉ“, t. j. požiadavka bude čítať iba záznamy, ktoré má povolené.

VYBERTE POVOLENÉ
Odkaz na úložisko ďalších informácií
OD
Adresár.Úložisko dodatočných informácií

RÔZNY

Použitie „DIFFERENT“ zabráni duplicitným riadkom v zadávaní výsledku dotazu 1C. Duplikácia znamená, že všetky polia požiadavky sa zhodujú.

VYBERTE PRVÝCH 100
Banks.Name,
Banky kód AS BIC
OD
Adresár.Banky AKO Banky

EmptyTable

Táto konštrukcia sa používa veľmi zriedkavo na kombinovanie dopytov. Pri pripájaní možno budete musieť zadať prázdnu vnorenú tabuľku v jednej z tabuliek. Operátor „EmptyTable“ je na to ako stvorený.

Príklad z pomocníka 1C 8:

VYBERTE číslo odkazu, PRÁZDNÚ TABUĽKU. (Č., Položka, Množstvo) AKO Zloženie
FROM Document.Expense Faktúra
KOMBINUJTE VŠETKO
SELECT Link.Number, Contents. (LineNumber, Product, Quantity)
FROM Document.Invoice Document.Invoice.Composition.*

ISNULL

Veľmi užitočná funkcia, ktorá vám umožní vyhnúť sa mnohým chybám. YesNULL() vám umožňuje nahradiť hodnotu NULL požadovanou hodnotou. Veľmi často sa používa pri kontrole prítomnosti hodnoty v spojených tabuľkách, napríklad:

VYBERTE SI
Odkaz na nomenklatúru,
IsNULL(Položka Remaining.QuantityRemaining,0) AS QuantityRemaining
OD


Dá sa použiť aj inak. Napríklad, ak pre každý riadok nie je známe, v ktorej tabuľke hodnota existuje:

ISNULL(InvoiceReceived.Date, InvoiceIssued.Date)

HOW je operátor, ktorý nám umožňuje priradiť názov (synonymum) tabuľke alebo poli. Príklad použitia sme videli vyššie.

Tieto konštrukcie sú veľmi podobné – umožňujú vám získať reťazcovú reprezentáciu požadovanej hodnoty. Jediný rozdiel je v tom, že REPRESENTATION konvertuje ľubovoľné hodnoty na typ reťazca, zatiaľ čo REPRESENTATIONREF konvertuje iba referenčné hodnoty. REFERENČNÁ REPREZENTÁCIA sa odporúča použiť v systémových dotazoch na zloženie údajov na optimalizáciu, pokiaľ sa, samozrejme, neplánuje použitie referenčného údajového poľa vo výberoch.

VYBERTE SI
View(Link), //reťazec, napríklad „Predbežná správa č. 123 zo dňa 10.10.2015
View(DeletionMark) AS DeleteMarkText, //string, “Yes” or “No”
ViewReferences(DeletionMark) AS DeleteMarkBoolean //boolean, True or False
OD
Dokument.Predbežná správa

EXPRESNÉ

Express vám umožňuje konvertovať hodnoty polí na požadovaný typ údajov. Hodnotu môžete previesť buď na primitívny typ, alebo na typ odkazu.

Express pre referenčný typ sa používa na obmedzenie požadovaných typov údajov v poliach komplexného typu, ktoré sa často používajú na optimalizáciu výkonu systému. Príklad:

EXPRESS(TableCost.Subconto1 AS Directory.Cost Items).Typ aktivitypreNáklady na daňové účtovníctvo

Pri primitívnych typoch sa táto funkcia často používa na obmedzenie počtu znakov v poliach neobmedzenej dĺžky (s takýmito poľami nemožno porovnávať). Aby sa predišlo chybe" Neplatné parametre v operácii porovnávania. Nemožno porovnávať polia
neobmedzená dĺžka a polia nekompatibilných typov
", musíte tieto polia vyjadriť takto:

EXPRESS(Komentár AKO riadok(150))

DIFFERENCEDATE

Získajte 267 video lekcií na 1C zadarmo:

Príklad použitia IS NULL v požiadavke 1C:

VYBER Z
Ref
ĽAVÉ PRIPOJENIE RegisterAkumulácia.ProduktyVSkladoch.Zostávajúce AKO Zostávajúce produkty
Softvér NomenclatureRef.Link = Predaný tovarCommitteesRemains.Nomenclature
KDE NIE JE Zostávajúci tovar Počet zostávajúcich je NULL

Typ údajov v dotaze možno určiť pomocou funkcií TYPE() a VALUETYPE() alebo pomocou logického operátora REFERENCE. Tieto dve funkcie sú podobné.

Preddefinované hodnoty

Okrem použitia odovzdaných parametrov v dotazoch v dotazovacom jazyku 1C môžete použiť preddefinované hodnoty alebo . Napríklad prevody, preddefinované adresáre, účtovné osnovy atď. Na tento účel sa používa konštrukcia „Value()“.

Príklad použitia:

WHERE Nomenklatúra. Typ nomenklatúry = Hodnota (Adresár. Typy nomenklatúry. Produkt)

WHERE Protistrany. Typ kontaktných informácií = hodnota (vyčíslenie. Typy kontaktných informácií. Telefón)

KDE Zostatky na účte. Účtovný účet = Hodnota (Účtovná tabuľka. Zisk. ZiskStrata)

Spojenia

Existujú 4 typy spojení: LEFT, SPRÁVNY, KOMPLETNÉ, VNÚTORNÉ.

ĽAVÉ a PRAVÉ PRIPOJENIE

Spojenia sa používajú na prepojenie dvoch tabuliek na základe konkrétnej podmienky. Funkcia kedy ĽAVÉ PRIPOJENIE je, že vezmeme prvú špecifikovanú tabuľku celú a podmienečne zviažeme druhú tabuľku. Polia druhej tabuľky, ktoré nebolo možné zviazať podmienkou, sú vyplnené hodnotou NULOVÝ.

Napríklad:

Vráti celú tabuľku Protistrán a pole „Banka“ vyplní len na tých miestach, kde bude splnená podmienka „Protistrany.Názov = Banky.Názov“. Ak podmienka nie je splnená, pole Banka bude nastavené na NULOVÝ.

RIGHT JOIN v jazyku 1Cúplne podobné ĽAVÉ pripojenie, s výnimkou jedného rozdielu - v PRÁVO PRIPOJENIA„Hlavná“ tabuľka je druhá, nie prvá.

ÚPLNÉ PRIPOJENIE

ÚPLNÉ PRIPOJENIE od ľavej a pravej sa líši tým, že zobrazuje všetky záznamy z dvoch tabuliek a spája len tie, ktoré dokáže spojiť podľa podmienky.

Napríklad:

OD

ÚPLNÉ PRIPOJENIE
Adresár.Banky AKO Banky

BY

Jazyk dotazu vráti obe tabuľky úplne iba vtedy, ak je splnená podmienka spojenia záznamov. Na rozdiel od ľavého/pravého spojenia je možné, že NULL sa objaví v dvoch poliach.

VNÚTORNÉ SPOJENIE

VNÚTORNÉ SPOJENIE sa od plnej líši tým, že zobrazuje len tie záznamy, ktoré bolo možné podľa danej podmienky spojiť.

Napríklad:

OD
Adresár Klientov protistrany

VNÚTORNÉ SPOJENIE
Adresár.Banky AKO Banky

BY
Klienti.Názov = Banky.Názov

Tento dotaz vráti iba riadky, v ktorých majú banka a protistrana rovnaký názov.

združenia

Konštrukty JOIN a JOIN ALL spájajú dva výsledky do jedného. Tie. výsledok vykonania dvoch sa „zlúči“ do jedného, ​​spoločného.

To znamená, že systém funguje úplne rovnako ako bežné, len pre dočasnú tabuľku.

Ako používať INDEX BY

Treba však vziať do úvahy jeden bod. Vytvorenie indexu na dočasnej tabuľke si tiež vyžaduje čas. Preto je vhodné použiť konštrukciu „ “ iba vtedy, ak je s istotou známe, že v dočasnej tabuľke bude viac ako 1-2 záznamy. V opačnom prípade môže byť efekt opačný – výkon indexovaných polí nekompenzuje čas potrebný na vytvorenie indexu.

VYBERTE SI
Kurzy mien Najnovší prierez Mena AS Mena,
Kurzy mien Najnovší prierez.
Kurzy mien PUT
OD
Informácie Register.Currency Kurzy.Posledný výsek(&obdobie,) AS Kurzy mienPosledný výsek
INDEX BY
mena
;
VYBERTE SI
Ceny Nomenklatúra. Nomenklatúra,
Ceny Nomenklatúry. Cena,
Nomenklatúry cien. Mena,
Kurzy mien. Sadzba
OD
Register informácií.Nomenklatúra Ceny.Posledná časť(&Obdobie,
Nomenklatúra B (&Nomenklatúra) A PriceType = &PriceType) AS Cenová nomenklatúra
LEFT JOIN Menové kurzy AKO kurzy mien
Nomenklatúry cien softvéru.Currency = Kurzy meny.Mena

Zoskupovanie

Dotazovací jazyk 1C vám umožňuje používať špeciálne agregačné funkcie pri zoskupovaní výsledkov dotazov. Zoskupovanie je možné použiť aj bez agregačných funkcií na „elimináciu“ duplikátov.

Existujú nasledujúce funkcie:

Množstvo, Množstvo, Počet rôznych, Maximum, Minimum, Priemer.

Príklad č. 1:

VYBERTE SI
Nomenklatúra tovaru a služieb.
SUM(Predaj tovaruSlužbyTovar.Množstvo) AS Množstvo,
SUM(Sales of GoodsServicesToods.Amount) AS Suma
OD

GROUP BY
Predaj tovarov a služieb Nomenklatúra tovaru

Požiadavka dostane všetky riadky s tovarom a sumarizuje ich podľa množstva a sumy podľa položky.

Príklad č.2

VYBERTE SI
Banks.Code,
MNOŽSTVO (ROZNÉ Banky.Odkaz) AKO Počet duplikátov
OD
Adresár.Banky AKO Banky
GROUP BY
Banks.Code

Tento príklad zobrazí zoznam BIC v adresári „Banks“ a ukáže, koľko duplikátov existuje pre každú z nich.

Výsledky

Výsledky predstavujú spôsob, ako získať údaje zo systému s hierarchickou štruktúrou. Súhrnné funkcie možno použiť pre súhrnné polia, rovnako ako pre zoskupenia.

Jedným z najobľúbenejších spôsobov využitia výsledkov v praxi je dávkový odpis tovaru.

VYBERTE SI




OD
Dokument Predaj tovarov a služieb AKO Predaj tovarov a služieb
TRIEDIŤ PODĽA

VÝSLEDKY
SUM(množstvo),
SUM(Súčet)
BY
Nomenklatúra

Výsledok dotazu bude nasledujúci hierarchický:

Všeobecné výsledky

Ak potrebujete získať súčty pre všetky „súčty“, použite operátor „GENERAL“.

VYBERTE SI
Predaj tovarov a služieb Nomenklatúra AS Nomenklatúra,
Predaj tovaru a služieb Tovar Link AS,
Predaj tovaru a služieb Množstvo AS Množstvo,
Predaj tovaru a služieb Tovar Suma AS Suma
OD
Dokument Predaj tovarov a služieb AKO Predaj tovarov a služieb
TRIEDIŤ PODĽA
Dátum predaja tovaru a služieb
VÝSLEDKY
SUM(množstvo),
SUM(Súčet)
BY
SÚ BEŽNÉ,
Nomenklatúra

V dôsledku vykonania požiadavky dostaneme nasledujúci výsledok:

V ktorej 1 úrovni zoskupenia je agregácia všetkých potrebných polí.

Aranžovanie

Operátor ORDER BY sa používa na triedenie výsledku dotazu.

Triedenie pre primitívne typy (reťazec, číslo, boolean) sa riadi obvyklými pravidlami. Pre polia typu odkazu sa triedenie uskutočňuje podľa internej reprezentácie odkazu (jedinečný identifikátor), a nie podľa kódu alebo reprezentácie odkazu.

VYBERTE SI

OD
Adresár.Nomenklatúra AS Nomenklatúra
TRIEDIŤ PODĽA
názov

Požiadavka zobrazí zoznam mien v adresári nomenklatúry zoradený abecedne.

Automatická objednávka

Výsledkom dotazu bez zoradenia je chaoticky prezentovaná množina riadkov. Vývojári platformy 1C nezaručujú, že pri vykonávaní rovnakých dopytov sa riadky budú zobrazovať v rovnakom poradí.

Ak potrebujete zobraziť záznamy tabuľky v konštantnom poradí, musíte použiť konštrukciu automatického poradia.

VYBERTE SI
Nomenklatúra.Názov AS Názov
OD
Adresár.Nomenklatúra AS Nomenklatúra
AUTO OBJEDNÁVKA

Virtuálne stoly

Virtuálne tabuľky v 1C sú jedinečnou vlastnosťou dopytovacieho jazyka 1C, ktorá sa nenachádza v iných podobných syntaxách. Virtuálna tabuľka je rýchly spôsob, ako získať informácie o profile z registrov.

Každý typ registra má svoju vlastnú sadu virtuálnych tabuliek, ktoré sa môžu líšiť v závislosti od nastavenia registra.

  • rez prvého;
  • strih druhého.
  • zvyšky;
  • revolúcie;
  • zostatky a obrat.
  • pohyby zo subkonta;
  • revolúcie;
  • rýchlosť Dt Kt;
  • zvyšky;
  • zostatky a obrat
  • subconto.
  • základňa;
  • grafové údaje;
  • skutočné obdobie platnosti.

Pre vývojára riešenia sú dáta prevzaté z jednej (virtuálnej) tabuľky, ale v skutočnosti platforma 1C berie z mnohých tabuliek a transformuje ich do požadovanej podoby.

VYBERTE SI
Nomenklatúra produktov v skladoch a obrat.
ProductsInWarehousesRemainingAndTurnover.QuantityInitialRemaining,
ProductsInWarehousesRemainsAndTurnover.QuantityObrat,
Tovar v skladochRemainsAndTurnover.QuantityIncoming,
ProductsIn WarehousesRemainsAndTurnover.QuantityConsumption,
ProductsInWarehousesRemainingsAndTurnover.QuantityFinalRemaining
OD
RegisterAccumulations.GoodsInWarehouses.RemainsAndTurnover AS GoodsInWarehousesRemainsAndTurnover

Tento dotaz vám umožňuje rýchlo získať veľké množstvo údajov.

Možnosti virtuálneho stola

Veľmi dôležitým aspektom práce s virtuálnymi tabuľkami je použitie parametrov. Parametre virtuálnej tabuľky sú špecializované parametre na výber a konfiguráciu.

Pre takéto tabuľky sa považuje za nesprávne použiť výber v konštrukcii „WHERE“. Okrem toho, že sa dopyt stane neoptimálnym, je možné získať nesprávne údaje.

Príklad použitia týchto parametrov:

Evidencia hromadenia tovaru na skladoch (& Začiatok obdobia, & Koniec obdobia, Mesiac, pohyby a hranice obdobia, Číselník = & Povinná nomenklatúra)

Algoritmus pre virtuálne tabuľky

Napríklad najpoužívanejšia virtuálna tabuľka typu „Remains“ ukladá dáta z dvoch fyzických tabuliek – zostatky a pohyby.

Pri použití virtuálnej tabuľky systém vykonáva nasledujúce manipulácie:

  1. Získame vypočítanú hodnotu najbližšie podľa dátumu a meraní v tabuľke súčtov.
  2. Sumu z tabuľky pohybu „pripočítame“ k sume z tabuľky súčtov.


Takéto jednoduché akcie môžu výrazne zlepšiť výkon systému ako celku.

Používanie nástroja na tvorbu dotazov

Zostavovač dopytov– nástroj zabudovaný do systému 1C Enterprise, ktorý výrazne uľahčuje vývoj databázových dotazov.

Nástroj na tvorbu dotazov má pomerne jednoduché a intuitívne rozhranie. Napriek tomu sa pozrime na používanie konštruktora dotazov podrobnejšie.

Konštruktor textu dotazu sa spúšťa z kontextového menu (pravé tlačidlo myši) na požadovanom mieste v kóde programu.

Popis konštruktora požiadavky 1C

Pozrime sa na každú kartu dizajnéra podrobnejšie. Výnimkou je záložka Builder, ktorá je témou na inú diskusiu.

Karta Tabuľky a polia

Táto karta určuje zdroj údajov a polia, ktoré je potrebné zobraziť v zostave. V podstate sú tu popísané konštrukcie SELECT.. FROM.

Zdrojom môže byť fyzická tabuľka databázy, tabuľka virtuálnych registrov, dočasné tabuľky, vnorené dotazy atď.

V kontextovom menu virtuálnych tabuliek môžete nastaviť parametre virtuálnej tabuľky:

Karta Pripojenia

Záložka slúži na popis spojení viacerých tabuliek a vytvára konštrukcie so slovom SPOJENIE.

Karta Zoskupovanie

Na tejto karte vám systém umožňuje zoskupiť a zhrnúť požadované polia výsledku tabuľky. Popisuje použitie konštrukcií GROUP BY, SUM, MINIMUM, AVERAGE, MAXIMUM, QUANTITY, NUMBER OF RŮZNÉ.

Karta Podmienky

Zodpovedá za všetko, čo príde v texte požiadavky po konštrukcii WHERE, t.j. za všetky podmienky kladené na prijaté dáta.

Karta Rozšírené

Tab Okrem toho plný najrôznejších parametrov, ktoré sú veľmi dôležité. Pozrime sa na každú z vlastností.

Zoskupovanie Výber záznamov:

  • Prvý N– parameter, ktorý do dotazu vráti iba N záznamov (operátor FIRST)
  • Žiadne duplikáty– zabezpečuje jedinečnosť prijatých záznamov (INÝ operátor)
  • Povolený– umožňuje vybrať len tie záznamy, ktoré vám systém umožňuje vybrať s prihliadnutím na (POVOLENÁ konštrukcia)

Zoskupovanie Typ žiadosti určuje, aký typ dotazu bude: získanie údajov, vytvorenie dočasnej tabuľky alebo zničenie dočasnej tabuľky.

Dole je vlajka Uzamknite prijaté údaje pre neskoršie úpravy. Umožňuje povoliť možnosť nastavenia uzamykania údajov, ktoré zaisťuje bezpečnosť údajov od ich načítania až po ich zmenu (relevantné len pre režim Automatické uzamykanie, prevedenie NA ZMENU).

Karta Pripojenia/Aliasy

Na tejto karte návrhára dotazov môžete nastaviť možnosť spájania rôznych tabuliek a aliasov (konštrukcia AKO). Tabuľky sú uvedené na ľavej strane. Ak nastavíte príznaky oproti tabuľke, použije sa konštrukcia UNITE, inak - UNITE ALL (rozdiely medzi týmito dvoma metódami). Na pravej strane je uvedená korešpondencia polí v rôznych tabuľkách, ak korešpondencia nie je špecifikovaná, dotaz vráti hodnotu NULL.

Záložka Objednávka

Toto určuje poradie, v ktorom sú hodnoty zoradené (ORDER BY) - zostupne (DESC) alebo vzostupne (ASC).

Je tu aj zaujímavá vlajka - Automatická objednávka(v dopyte - AUTO OBJEDNÁVKA). V predvolenom nastavení systém 1C zobrazuje údaje v „chaotickom“ poradí. Ak nastavíte tento príznak, systém zoradí údaje podľa interných údajov.

Karta Dávka dopytov

Na karte Návrhár dotazov môžete vytvoriť nové a použiť ju aj ako navigáciu. V texte požiadavky sú pakety oddelené symbolom „;“ (čiarkou).

Tlačidlo „Dopyt“ v návrhárovi dotazov

V ľavom dolnom rohu návrhára požiadavky sa nachádza tlačidlo Žiadosť, pomocou ktorého si môžete kedykoľvek zobraziť text požiadavky:

V tomto okne môžete vykonať úpravy požiadavky a vykonať ju.


Pomocou konzoly dotazov

Query Console je jednoduchý a pohodlný spôsob ladenia zložitých dotazov a rýchleho získavania informácií. V tomto článku sa pokúsim popísať, ako používať Query Console a poskytnúť odkaz na stiahnutie Query Console.

Poďme sa na tento nástroj pozrieť bližšie.

Stiahnite si konzolu dotazov 1C

Po prvé, ak chcete začať pracovať s konzolou dotazov, musíte si ju odniekiaľ stiahnuť. Liečby sa zvyčajne delia na dva typy – kontrolované formy a konvenčné (alebo sa niekedy nazývajú 8.1 a 8.2/8.3).

Pokúsil som sa spojiť tieto dva pohľady do jedného spracovania - požadovaný formulár sa otvorí v požadovanom prevádzkovom režime (v riadenom režime konzola funguje iba v hrubom režime).

Popis konzoly dotazu 1C

Začnime sa pozerať na konzolu dotazov s popisom hlavného panela spracovania:

V hlavičke konzoly dotazu môžete vidieť čas vykonania posledného dotazu s presnosťou na milisekundy, čo vám umožňuje porovnávať rôzne návrhy z hľadiska výkonu.

Prvá skupina tlačidiel na paneli príkazov je zodpovedná za ukladanie aktuálnych dopytov do externého súboru. To je veľmi pohodlné, vždy sa môžete vrátiť k písaniu zložitej žiadosti. Alebo si napríklad uložte zoznam typických príkladov určitých vzorov.

Vľavo v poli „Žiadosť“ môžete vytvárať nové požiadavky a ukladať ich do stromovej štruktúry. Druhá skupina tlačidiel je zodpovedná za správu zoznamu požiadaviek. Pomocou neho môžete vytvoriť, kopírovať, mazať, presúvať požiadavku.

  • Vykonaťžiadosť– jednoduché prevedenie a výsledky
  • Spustite balík– umožňuje zobraziť všetky prechodné dotazy v dávke dotazov
  • Zobrazenie dočasných tabuliek– umožňuje zobraziť výsledky, ktoré dočasné dotazy vracajú v tabuľke

Parametre požiadavky:

Umožňuje nastaviť aktuálne parametre požiadavky.

V okne parametrov dotazu je zaujímavé nasledovné:

  • Tlačidlo Získajte zo žiadosti automaticky nájde všetky parametre v požiadavke pre pohodlie vývojára.
  • Vlajka Spoločné parametre pre všetky požiadavky– po inštalácii sa pri jeho spracovaní nevymažú parametre pri prechode z požiadavky na požiadavku vo všeobecnom zozname požiadaviek.

Nastavte parameter so zoznamom hodnôt Je to veľmi jednoduché, stačí pri výbere hodnoty parametra kliknúť na tlačidlo vymazať hodnotu (krížik), systém vás vyzve na výber typu údajov, kde je potrebné vybrať „Zoznam hodnôt“:

V hornom paneli je tiež tlačidlo na vyvolanie nastavení konzoly dotazov:

Tu môžete zadať parametre pre automatické ukladanie dotazov a parametre vykonávania dotazu.

Text požiadavky sa zadá do poľa žiadosti konzoly. Dá sa to urobiť jednoduchým zadaním testu dotazu alebo zavolaním špeciálneho nástroja – návrhára dotazov.

Návrhár dotazov 1C 8 sa vyvolá z kontextovej ponuky (pravé tlačidlo myši), keď kliknete na vstupné pole:

Toto menu má tiež také užitočné funkcie, ako je vymazanie alebo pridanie zlomov riadkov („|“) k požiadavke alebo prijatie kódu požiadavky v tejto pohodlnej forme:

Žiadosť = Nová požiadavka;
Request.Text = ”
|VYBERTE
| Meny.Odkaz
|OD
| Adresár.Currencies AS Meny”;
RequestResult = Request.Execute();

Spodné pole konzoly dotazu zobrazuje pole výsledku dotazu, preto bolo vytvorené toto spracovanie:



Konzola dotazov môže okrem zoznamu zobraziť aj údaje vo forme stromu - pre dotazy obsahujúce súčty.

Optimalizácia dopytu

Jedným z najdôležitejších bodov pri zvyšovaní produktivity 1C enterprise 8.3 je optimalizáciažiadosti. Tento bod je tiež veľmi dôležitý, keď absolvovanie certifikácie. Nižšie si povieme o typických príčinách neoptimálneho výkonu dotazov ao optimalizačných metódach.

Výbery vo virtuálnej tabuľke pomocou konštrukcie WHERE

Na detaily virtuálnej tabuľky je potrebné aplikovať filtre len cez parametre VT. Za žiadnych okolností by ste nemali používať konštrukciu WHERE na výber vo virtuálnej tabuľke, čo je z hľadiska optimalizácie vážna chyba. V prípade výberu pomocou WHERE v skutočnosti systém dostane VŠETKY záznamy a až potom vyberie potrebné.

SPRÁVNY:

VYBERTE SI

OD
Register kumulácií s účastníkmi zostatkov (.
,
Organizácia = &Organizácia
A jednotlivec = & jednotlivec) AKO Vzájomné vyrovnania s účastníkmi organizácií zostatky

ZLE:

VYBERTE SI
Vzájomné vyrovnanie zostatkov s účastníkmi organizácií
OD
Register kumulácií s účastníkmi organizácií Zostatky (,) AKO Vzájomné vyrovnania s účastníkmi organizácií Zostatky
KDE
Vzájomné vyrovnania s účastníkmi organizácií Zostatky Organizácia = & Organizácia
AND Vzájomné vyrovnania s účastníkmi organizácií Zostatky Jednotlivec = &Jednotlivec

Získanie hodnoty poľa komplexného typu pomocou bodky

Pri prijímaní údajov komplexného typu v dotaze cez bodku systém spojí ľavým spojením presne toľko tabuliek, koľko je možných typov v poli komplexného typu.

Napríklad pre optimalizáciu je veľmi nežiaduce pristupovať do poľa záznam registra – registrátor. Registrátor má zložený typ údajov, medzi ktorými sú všetky možné typy dokumentov, ktoré môžu zapisovať údaje do registra.

ZLE:

VYBERTE SI
Record Set.Recorder.Date,
RecordSet.Quantity
OD
RegisterAccumulations.ProductsOrganizations AS SetRecords

To znamená, že v skutočnosti takýto dopyt nepristúpi k jednej tabuľke, ale k 22 databázovým tabuľkám (tento register má 21 typov registrátorov).

SPRÁVNY:

VYBERTE SI
VOĽBA
KEĎ ProductsOrg.Registrar LINK Document.Predaj produktov a služieb
POTOM VYJADRITE(ProduktyOrg.Registrátor AKO doklad.Predaj tovaruSlužby).Dátum
KEĎ GoodsOrg.Registrar LINK Document.Prijatie tovaruSlužby
POTOM VYJADRITE(GoodsOrg.Registrar AS Document.Receipt of GoodsServices).Dátum
KONIEC AKO DÁTUM,
ProduktyOrg.Množstvo
OD
RegisterAccumulations.ProductsOrganizations AS ProductsOrganization

Alebo druhá možnosť je doplniť takéto informácie do detailov, napríklad v našom prípade pridanie dátumu.

SPRÁVNY:

VYBERTE SI
ProductsOrganizations.Date,
ProduktyOrganizácie.Množstvo
OD
Register tovarov organizácií AS tovary organizácií

Poddotazy v stave spojenia

Pre optimalizáciu je neprijateľné používať poddotazy v podmienkach spojenia, čo výrazne spomaľuje dopyt. V takýchto prípadoch je vhodné použiť VT. Ak sa chcete pripojiť, musíte použiť iba metaúdaje a objekty VT, ktoré ste predtým indexovali podľa polí pripojenia.

ZLE:

VYBERTE si…

PRIPOJTE SA VĽAVO (
SELECT FROM RegisterInformation.Limits
KDE …
SKUPINA PODĽA...
) OD…

SPRÁVNY:

VYBERTE si…
Limity PUT
FROM Information Register.Limits
KDE …
SKUPINA PODĽA...
INDEX PODĽA...;

VYBERTE si…
Z dokladu o predaji tovaru a služieb
LEFT JOIN Limity
BY…;

Spájanie záznamov s virtuálnymi tabuľkami

Sú situácie, keď pri pripájaní virtuálneho stola k iným systém nefunguje optimálne. V tomto prípade, aby ste optimalizovali výkon dotazu, môžete skúsiť umiestniť virtuálnu tabuľku do dočasnej tabuľky, pričom nezabudnite indexovať spojené polia v dotaze na dočasnú tabuľku. Je to spôsobené skutočnosťou, že VT sú často obsiahnuté v niekoľkých fyzických tabuľkách DBMS, v dôsledku čoho sa na ich výber zostaví poddotaz a problém je podobný predchádzajúcemu bodu.

Používanie výberov založených na neindexovaných poliach

Jednou z najčastejších chýb pri písaní dotazov je používanie podmienok na neindexovaných poliach, čo je v rozpore pravidlá optimalizácie dopytov. DBMS nemôže vykonať dotaz optimálne, ak dotaz obsahuje výber neindexovateľných polí. Ak vezmete dočasnú tabuľku, musíte tiež indexovať polia pripojenia.

Pre každú podmienku musí existovať vhodný index. Vhodný index je taký, ktorý spĺňa nasledujúce požiadavky:

  1. Index obsahuje všetky polia uvedené v podmienke.
  2. Tieto polia sú na samom začiatku indexu.
  3. Tieto výbery idú za sebou, to znamená, že hodnoty, ktoré nie sú zahrnuté v podmienke dotazu, nie sú medzi nimi „zaklinené“.

Ak DBMS nezvolí správne indexy, naskenuje sa celá tabuľka – to bude mať veľmi negatívny vplyv na výkon a môže viesť k dlhšiemu zablokovaniu celej sady záznamov.

Použitie logického OR v podmienkach

To je všetko, tento článok sa zaoberal základnými aspektmi optimalizácie dotazov, ktoré by mal poznať každý odborník na 1C.

Veľmi užitočný bezplatný video kurz o vývoji a optimalizácii dopytov, Vrelo odporucam pre začiatočníkov a viac!

V tomto článku preskúmame tému vnorených tabuliek v dopytovacom jazyku 1C.

V poliach výberu dotazu môžete použiť vnorenú zdrojovú tabuľku dotazu. Napríklad dokument „Poskytovanie služieb“ má tabuľkovú časť Služieb, a tak je možné túto tabuľkovú časť zobraziť aj vo výberovom poli. Teraz uvidíte, ako sa to dá implementovať.

V mojej tréningovej databáze spustím konzolu dotazov, otvorím návrhára dotazov a vyberiem tabuľku „Poskytovanie služieb“.

Rozšírime túto tabuľku

A v ňom vidíme tabuľkovú časť „Služby“.

Vyberieme celú túto časť tabuľky.

Ako vidíte, celá tabuľková časť služby sa úplne presunula do polí.

Upozorňujeme, že tabuľková časť v skutočnosti prichádza ako samostatné pole s názvom „Služby“ a typ bude „Výsledok žiadosti“. Poďme sa naučiť, ako používať vnorenú tabuľku v dotaze.

Nechajme tri polia vnorenej tabuľky a pridajme nejaké polia z hlavičky dokumentu.

Klikneme na OK v dizajnéri a uvidíme, ako bude naša požiadavka vyzerať.

Ako vidíte, v žiadosti je za poľom „Služby“ bodka a vybrané polia sú uvedené v zátvorkách za ňou.

Splňme žiadosť.

Na obrázku vidíme, že všetky vybrané polia v tabuľkovej časti dokumentu sú uvedené oddelené čiarkami v poli „Služby“. Nie všetky dotazovacie konzoly majú displej ako ten na obrázku vyššie, niekedy sa môže zobraziť len „ “.

Ďalší zaujímavý bod: do vnorenej tabuľky môžete namiesto polí vložiť hviezdičku, potom sa zobrazia všetky polia tabuľkovej časti. Toto sa nedá urobiť v konštruktore, iba ručne v požiadavke. Žiadosť bude mať nasledujúcu formu:

Pozrime sa, ako bude takáto požiadavka vykonaná.

Jediná vec je, že táto hviezdička sa neuloží, ak otvoríme konštruktor dotazu.

Naučili sme sa, ako vytvoriť dotaz s vnorenou tabuľkou v konzole, teraz sa naučíme, ako použiť vnorenú tabuľku vo výbere

V skutočnosti nie je tak ťažké získať prístup k vnorenej tabuľke pri spracovaní dotazu. Jednoducho pristúpite k výberu podľa názvu vašej tabuľky a získate premennú s typom „Výsledok dopytu“. A potom to spracujete ako normálny výsledok požiadavky: ak chcete, získajte vzorku, ak chcete, urobte upload.

Nižšie je uvedený malý príklad kódu, ktorý pracuje s vnorenou tabuľkou:


&Na serveri
Postup FillOnServer()
Žiadosť = Nová požiadavka;
Žiadosť. Text = "VYBERTE si
| Predaj produktu, odkaz.
| Predaj produktu.Produktov.(
| produkt,
| Množstvo
|OD
| Dokument o predaji produktov AKO predávať produkty"
;
Načítanie = dotaz. Spustiť (). Vybrať ();
Čau výber. Next() Slučka
TopLine of the Tree = Výpredaj produktov. GetItems();
NewRow = TopRowTree. Pridať ();
Nový riadok. Odkaz = výber. Link;
TableProducts = Výber. Tovar;
SelectionProducts = TableProducts. Vybrať ();
Pri výbere produktov. Next() Slučka
TreeChildRow = Nový riadok. GetItems();
ProductRow = ChildTreeRow. Pridať ();
ProductString. Odkaz = Výber produktu. Produkt;
ProductString. Množstvo = SampleItems. Množstvo ;
EndCycle;
EndCycle;
Koniec procedúry

Dovoľte mi vysvetliť vyššie uvedený kód.

V prvom rade sme dostali lineárny výber a tento výber prejdeme v slučke, v ktorej vytvoríme horný riadok stromu hodnôt (je na formulári) a napíšeme do neho odkaz na náš dokument.

A potom to najzaujímavejšie, dokonca si to môžete pozrieť neskôr v debuggeri sami, obrátime sa na pole Výber produktov a pre pohodlie zapíšte toto pole do samostatnej premennej v TableProducts. Táto premenná je typu „Výsledok dopytu“. A môžete ľahko získať vzorku tohto výsledku. To je to, čo robíme. Zostáva obísť tento výber pomocou nasledujúcej funkcie a cyklu while.

A v tejto slučke budeme označovať výberové polia ako polia vnorenej tabuľky a zapíšeme ich do podriadených riadkov stromu z formulára.

Toto je výsledok, ktorý tento kód vráti

Stále máte otázky?

Zodpovedáte si ich sami, keď si preštudujete môj kurz “Dotazy v 1C pre začiatočníkov”. Kde sa o týchto a mnohých ďalších problémoch diskutuje podrobnejšie. Všetky informácie sú uvedené v jednoduchej a dostupnej forme a sú zrozumiteľné aj pre tých, ktorí nie sú obzvlášť oboznámení s programovaním v 1C.

Promo kód na zľavu 20%: hrW0rl9Nnx

Podporte môj projekt príspevkom ľubovoľnej sumy

Pridajte sa k mojim skupinám.

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, môže sa použiť aj 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 na položku je pripravená, kliknite na tlačidlo „OK“ v spodnej časti okna návrhára.

Dotazovací jazyk je jedným zo základných mechanizmov 1C 8.3 pre vývojárov. Pomocou dotazov môžete rýchlo získať akékoľvek údaje uložené v databáze. Jeho syntax je veľmi podobná SQL, existujú však určité rozdiely.

Hlavné výhody dotazovacieho jazyka 1C 8.3 (8.2) oproti SQL:

  • dereferencovanie referenčných polí (odkazovanie jedného alebo viacerých bodov na detaily objektu);
  • práca s výsledkami je veľmi pohodlná;
  • schopnosť vytvárať virtuálne tabuľky;
  • žiadosť môže byť napísaná v angličtine aj ruštine;
  • schopnosť blokovať údaje, aby sa zabránilo zablokovaniu.

Nevýhody dopytovacieho jazyka v 1C:

  • na rozdiel od SQL, v 1C dotazy neumožňujú zmenu údajov;
  • nedostatok uložených procedúr;
  • nemožnosť prevodu reťazca na číslo.

Pozrime sa na náš mini tutoriál o základných konštrukciách dotazovacieho jazyka 1C.

Vzhľadom na skutočnosť, že dotazy v 1C vám umožňujú iba prijímať údaje, každý dotaz musí začínať slovom „SELECT“. Po tomto príkaze sú označené polia, z ktorých je potrebné získať údaje. Ak zadáte „*“, vyberú sa všetky dostupné polia. Miesto, z ktorého sa budú údaje vyberať (dokumenty, registre, adresáre atď.), je uvedené za slovom „OD“.

V nižšie uvedenom príklade sú názvy celej nomenklatúry vybrané z adresára „Nomenklatúra“. Za slovom „AKO“ sú uvedené aliasy (názvy) tabuliek a polí.

VYBERTE SI
Nomenklatúra Názov AS Názov nomenklatúry
OD
Adresár.Nomenklatúra AS Nomenklatúra

Vedľa príkazu „SELECT“ môžete zadať kľúčové slová:

  • RÔZNY. Dotaz vyberie iba riadky, ktoré sa líšia aspoň v jednom poli (bez duplikátov).
  • PRVÁ n, Kde n– počet riadkov od začiatku výsledku, ktoré je potrebné vybrať. Najčastejšie sa táto konštrukcia používa v spojení s triedením (ORDER BY). Napríklad, keď potrebujete vybrať určitý počet dokumentov, ktoré sú posledné podľa dátumu.
  • POVOLENÝ. Tento dizajn umožňuje vybrať z databázy len tie záznamy, ktoré sú dostupné aktuálnemu používateľovi. Na základe použitia tohto kľúčového slova sa používateľovi pri pokuse o vyhľadávanie záznamov, ku ktorým nemá prístup, zobrazí chybové hlásenie.

Tieto kľúčové slová je možné použiť spolu alebo samostatne.

PRE ZMENU

Tento návrh blokuje údaje, aby sa predišlo vzájomným konfliktom. Zamknuté údaje nebudú načítané z iného pripojenia, kým sa transakcia neskončí. V tejto klauzule môžete špecifikovať konkrétne tabuľky, ktoré je potrebné uzamknúť. V opačnom prípade budú všetci zablokovaní. Konštrukcia je relevantná len pre režim automatického uzamknutia.

Najčastejšie sa pri prijímaní zostatkov používa doložka „PRE ZMENU“. Keď totiž v programe pracuje viacero používateľov súčasne, pričom jeden dostáva zostatky, iný ich môže meniť. V tomto prípade výsledný zvyšok už nebude správny. Ak s týmto návrhom zablokujete údaje, potom kým prvý zamestnanec nedostane správny zostatok a nevykoná s ním všetky potrebné manipulácie, druhý zamestnanec bude nútený čakať.

VYBERTE SI
Vzájomné vyrovnanie, zamestnanec.
Vzájomné vyrovnania Výška vzájomných vyrovnaní Zostatok
OD
Register kumulácií Vzájomné zúčtovania so zamestnancami
PRE ZMENU

KDE

Návrh je potrebný na uloženie určitého druhu výberu na nahrávané údaje. V niektorých prípadoch získavania údajov z registrov je rozumnejšie špecifikovať podmienky výberu v parametroch virtuálnych tabuliek. Pri použití „WHERE“ sa najskôr načítajú všetky záznamy a až potom sa aplikuje selekcia, ktorá výrazne spomalí dopyt.

Nižšie je uvedený príklad žiadosti o získanie kontaktných osôb na konkrétnu pozíciu. Parameter výberu má formát: &Názov parametra (názov parametra je ľubovoľný).

VÝBER (prípad)

Návrh umožňuje špecifikovať podmienky priamo v tele požiadavky.

V nižšie uvedenom príklade bude „Doplnkové pole“ obsahovať text v závislosti od toho, či je dokument odoslaný alebo nie:

VYBERTE SI
AdmissionTiU.Link,
VOĽBA
KEDY PrijatieT&U.Vykonané
POTOM "Dokument bol schválený!"
ELSE „Dokument nebol odoslaný...“
KONIEC AKO doplnkové pole
OD
Dokument Príjem tovaru a služieb AKO Príjem T&C

PRIPOJTE SA

Spojenia spájajú dve tabuľky na základe konkrétnej podmienky vzťahu.

ĽAVÉ/PRAVÉ PRIPOJENIE

Podstatou LEFT joinu je, že prvá špecifikovaná tabuľka sa vezme celá a druhá sa k nej pripojí podľa podmienky pripojenia. Ak neexistujú žiadne záznamy zodpovedajúce prvej tabuľke v druhej tabuľke, potom sa ich hodnoty nahradí NULL. Jednoducho povedané, hlavná tabuľka je prvá špecifikovaná tabuľka a údaje druhej tabuľky (ak existujú) sú už nahradené jej údajmi.

Napríklad je potrebné získať položky položiek z dokladov „Príjem tovaru a služieb“ a ceny z informačného registra „Ceny položiek“. V tomto prípade, ak sa nenájde cena pre niektorú pozíciu, nahraďte namiesto nej hodnotu NULL. Vyberú sa všetky položky z dokladu bez ohľadu na to, či majú cenu alebo nie.

VYBERTE SI
Potvrdenie a nomenklatúra U.,
Ceny.Cena
OD
Dokument Prevzatie tovaru a služieb AKO Prevzatie tovaru a špecifikácie
INTERNAL JOIN RegisterInformation.CenyNomenklatúra.SliceLast AS Ceny
Príjem softvéru a nomenklatúra U = Ceny. Nomenklatúra

V PRÁVE je všetko presne naopak.

ÚPLNÉ PRIPOJENIE

Tento typ pripojenia sa líši od predchádzajúcich v tom, že v dôsledku toho sa vrátia všetky záznamy z prvej tabuľky aj z druhej. Ak sa v prvej alebo druhej tabuľke nenájdu žiadne záznamy na základe špecifikovanej podmienky prepojenia, namiesto toho sa vráti NULL.

Pri použití úplného pripojenia v predchádzajúcom príklade sa vyberú všetky položky položiek z dokladu „Príjem tovaru a služieb“ a všetky najnovšie ceny z evidencie „Ceny položiek“. Hodnoty nenájdených záznamov v prvej aj druhej tabuľke sa budú rovnať NULL.

VNÚTORNÉ SPOJENIE

Rozdiel medzi INNER JOIN a FULL JOIN je v tom, že ak sa záznam nenájde aspoň v jednej z tabuliek, dotaz ho vôbec nezobrazí. V dôsledku toho sa vyberú len tie položky položky z dokladu „Príjem tovaru a služieb“, pre ktoré existujú záznamy v informačnom registri „Ceny položiek“, ak v predchádzajúcom príklade nahradíme „PLNÉ“ za „INTERNÉ“.

GROUP BY

Zoskupovanie v dotazoch 1C vám umožňuje zbaliť riadky tabuľky (zoskupovacie polia) podľa určitej spoločnej charakteristiky (zoskupovacie polia). Zoskupovacie polia je možné zobraziť iba pomocou agregačných funkcií.

Výsledkom nasledujúceho dotazu bude zoznam typov produktov s maximálnymi cenami za ne.

VYBERTE SI
,
MAX(Cena.Cena) AS Cena
OD

GROUP BY
Ceny.Nomenklatúra.Typ nomenklatúry

VÝSLEDKY

Na rozdiel od zoskupovania sa pri použití súčtov zobrazia všetky záznamy a pridajú sa k nim riadky súčtov. Zoskupenie zobrazuje iba zovšeobecnené záznamy.

Výsledky možno zhrnúť pre celú tabuľku (pomocou kľúčového slova „VŠEOBECNÉ“), pre viaceré polia, pre polia s hierarchickou štruktúrou (kľúčové slová „HIERARCHIA“, „LEN HIERARCHIA“). Pri sumarizovaní výsledkov nie je potrebné používať agregačné funkcie.

Pozrime sa na príklad podobný vyššie uvedenému s použitím zoskupovania. V tomto prípade výsledok dotazu vráti nielen zoskupené polia, ale aj podrobné záznamy.

VYBERTE SI
Ceny.Nomenklatúra.Typ nomenklatúry AS Typ nomenklatúry,
Ceny. Cena AS Cena
OD
Register informácií o cenách nomenklatúry
VÝSLEDKY
MAXIMUM (cena)
BY
Typ nomenklatúry

MAJÚCE

Tento operátor je podobný operátoru WHERE, ale používa sa len pre agregačné funkcie. Zostávajúce polia, okrem tých, ktoré používa tento operátor, musia byť zoskupené. Operátor WHERE nie je použiteľný pre agregované funkcie.

V nižšie uvedenom príklade sú maximálne ceny položky vybrané, ak presahujú 1 000, zoskupené podľa typu položky.

VYBERTE SI

MAX(Cena.Cena) AS Cena
OD
Register informácií o cenách nomenklatúry
GROUP BY
Ceny.Nomenklatúra.Typ nomenklatúry
MAJÚCE
MAXIMUM(Ceny.Cena) > 1000

TRIEDIŤ PODĽA

Operátor ORDER BY zoradí výsledok dotazu. Aby sa zabezpečilo, že záznamy budú zobrazené v konzistentnom poradí, používa sa AUTOMATICKÉ ORDER. Primitívne typy sa triedia podľa zaužívaných pravidiel. Typy odkazov sú zoradené podľa GUID.

Príklad získania zoznamu zamestnancov zoradených podľa mena:

VYBERTE SI
Zamestnanci. Meno AS Meno
OD
Adresár.Zamestnanci AKO Zamestnanci
TRIEDIŤ PODĽA
názov
AUTO OBJEDNÁVKA

Ďalšie konštrukcie dotazovacieho jazyka 1C

  • SPOJOVAŤ– výsledky dvoch dopytov do jedného.
  • KOMBINUJTE VŠETKO– podobne ako COMBINE, ale bez zoskupovania rovnakých riadkov.
  • PRÁZDNY TABUĽ– niekedy sa používa pri spájaní dotazov na určenie prázdnej vnorenej tabuľky.
  • PLACE– vytvorí dočasnú tabuľku na optimalizáciu zložitých 1C dotazov. Takéto požiadavky sa nazývajú dávkové požiadavky.

Funkcie jazyka dopytov

  • SUBSTRING skráti reťazec zo zadanej pozície na zadaný počet znakov.
  • ROK...DRUHÝ umožňujú získať vybranú hodnotu číselného typu. Vstupným parametrom je dátum.
  • ZAČIATOK OBDOBIA a KONIEC OBDOBIA používa sa pri práci s dátumami. Typ obdobia (DEŇ, MESIAC, ROK atď.) sa uvádza ako dodatočný parameter.
  • ADDKDATE umožňuje pridať alebo odpočítať zadaný čas určitého typu od dátumu (SEKUND, MINÚTA, DEŇ atď.).
  • DIFFERENCEDATE určuje rozdiel medzi dvoma dátumami s uvedením typu výstupnej hodnoty (DEŇ, ROK, MESIAC atď.).
  • ISNULL nahradí chýbajúcu hodnotu zadaným výrazom.
  • REPREZENTÁCIA a REPREZENTAČNÉ ODKAZY získať reťazcovú reprezentáciu zadaného poľa. Použiť na akékoľvek hodnoty a iba referenčné hodnoty.
  • TYP, HODNOTY TYPU sa používajú na určenie typu vstupného parametra.
  • LINK je logický operátor porovnávania pre typ hodnoty atribútu.
  • EXPRESNÉ používa sa na prevod hodnoty na požadovaný typ.
  • DÁTUM ČAS získa hodnotu dátumu z číselných hodnôt (rok, mesiac, deň, hodina, minúta, sekunda).
  • VÝZNAM v požiadavke 1C sa používa na označenie preddefinovaných hodnôt - adresárov, enumerácií, plánov typov charakteristík. Príklad použitia: " Kde právnická osoba = hodnota (výčet. Právnická osoba. fyzická osoba)«.

Zostavovač dopytov

Na vytváranie dotazov s 1C existuje veľmi pohodlný vstavaný mechanizmus - návrhár dotazov. Obsahuje tieto hlavné karty:

  • "Tabuľky a polia" - obsahuje polia, ktoré je potrebné vybrať, a ich zdroje.
  • „Connections“ - popisuje podmienky pre štruktúru CONNECTION.
  • „Zoskupovanie“ – obsahuje popis štruktúr zoskupovania a na nich založených súčtových polí.
  • „Podmienky“ - zodpovedá za výber údajov v žiadosti.
  • „Rozšírené“ – ďalšie parametre dopytu, ako sú kľúčové slová pre príkaz „SELECT“ atď.
  • „Joins/Aliasy“ - sú uvedené možnosti spájania tabuliek a špecifikované aliasy (konštrukt „AKO“).
  • „Objednávka“ je zodpovedná za triedenie výsledkov dopytov.
  • „Totals“ – podobné karte „Grouping“, ale používa sa pre konštrukciu „TOTALS“.

Samotný text žiadosti je možné zobraziť kliknutím na tlačidlo „Žiadosť“ v ľavom dolnom rohu. V tomto formulári sa dá opraviť ručne alebo skopírovať.


Žiadosť o konzolu

Ak chcete rýchlo zobraziť výsledok dotazu v podnikovom režime alebo ladiť zložité dotazy, použite . Obsahuje text požiadavky, nastavuje parametre a zobrazuje výsledok.

Konzolu dotazov si môžete stiahnuť na disku ITS alebo cez .

Rozhodol som sa prispieť svojím príspevkom a opísať tie vlastnosti jazyka, o ktorých sa vo vyššie uvedených článkoch nehovorilo. Článok je určený pre začínajúcich vývojárov.

1. Dizajn „IZ“.

Na získanie údajov z databázy nie je vôbec potrebné použiť konštrukciu „FROM“.
Príklad: Potrebujeme vybrať všetky informácie o bankách z adresára bánk.
Žiadosť:

VYBERTE Adresár.Banky.*

Vyberie všetky polia z adresára Banky. A je podobná požiadavke:

SELECT Banks.* FROM Directory.Banks AS Banks

2. Objednávanie údajov podľa referenčného poľa

Keď potrebujeme usporiadať údaje dotazu podľa primitívnych typov: "Reťazec", "Číslo", "Dátum" atď., Všetko sa vyrieši pomocou konštrukcie "ORDER BY", ak potrebujete údaje zoradiť podľa referenčného poľa? Referenčné pole je odkaz, jedinečný identifikátor, t.j. Zhruba povedané, nejaká ľubovoľná množina znakov a bežné usporiadanie môže priniesť výsledok, ktorý nie je úplne očakávaný. Pre objednanie referenčných polí sa používa konštrukcia "AUTO ORDER". Aby ste to urobili, musíte si najskôr objednať údaje priamo podľa referenčného typu pomocou konštrukcie "ORDER BY" a potom konštrukcie "AUTO ORDER".

V tomto prípade pre dokumenty bude objednávanie prebiehať v poradí "Dátum->Číslo", pre referenčné knihy v "Hlavnom zobrazení". Ak sa objednávanie nevyskytuje podľa referenčných polí, použitie konštrukcie "AUTO OBJEDNÁVKA" sa neodporúča.

V niektorých prípadoch môže konštrukcia „AUTO OBJEDNÁVKA“ spomaliť proces výberu. Podobným spôsobom môžete prepísať dokumenty bez automatického objednávania:

3. Získanie textovej reprezentácie typu odkazu. "PREZENTAČNÝ" dizajn.

Keď potrebujete zobraziť pole referenčného typu, napríklad pole „Banka“, ktoré je odkazom na prvok adresára „Banks“, musíte pochopiť, že pri zobrazení tohto poľa sa zobrazí poddotaz na „ Automaticky sa spustí adresár Banky, aby sa získal pohľad na adresár. Tým sa spomalí výstup údajov. Aby ste tomu predišli, musíte v požiadavke použiť konštrukciu "PREPRESENTATION", aby ste okamžite získali zobrazenie objektu a následne ho zobrazili na prezeranie.

V systéme skladania údajov sa tento mechanizmus používa štandardne, ale pri vytváraní rozložení v bunkách by ste mali určiť reprezentáciu referenčného poľa a napríklad umiestniť samotný odkaz do prepisu.

4. Podmienka odberu údajov podľa šablóny.

Napríklad musíte získať mobilné telefóny zamestnancov formulára (8 -123- 456-78-912). Ak to chcete urobiť, musíte v žiadosti nastaviť nasledujúcu podmienku:

SELECT Employee.Meno, Employee.Phone AS Phone FROM Directory.Employees AS Zamestnanci WHERE Phone LIKE "_-___-___-__-__"

Znak "_" je servisný znak a nahrádza akýkoľvek znak.

5. Súčasné používanie súčtov a zoskupení.


Súčty sa často používajú v spojení so zoskupeniami, v tomto prípade nemusia byť v súčtoch uvedené súhrnné funkcie.

SELECT Poskytovanie služieb.Organizácia AS Organizácia, Poskytovanie služieb.Nomenklatúra AS Nomenklatúra, SUM(Poskytovanie služieb.Suma dokumentu) AKO Suma dokumentu Z dokumentu.Poskytovanie služieb AS Poskytovanie služieb SKUPINA BY Poskytovanie služieb.Organizácia, poskytovanie of Services.Nomenklatúra VÝSLEDKY PODĽA GENERÁLNEJ, Organizácie, nomenklatúry

V tomto prípade sa dotaz vráti takmer rovnako ako nasledujúci dotaz:

SELECT Poskytovanie služieb.Organizácia AS Organizácia, Poskytovanie služieb.Nomenklatúra AS Nomenklatúra, Poskytovanie služieb.Suma dokumentu AS Množstvo dokumentu Z dokumentu.Poskytovanie služieb AKO Poskytovanie služieb VÝSLEDKY SUMA (Suma dokumentu) PODĽA VŠEOBECNÝCH, Organizácia, Nomenklatúra

Iba prvý dotaz zbalí záznamy s rovnakou nomenklatúrou.

6. Dereferencovanie polí.

Odkazovanie na polia cez bodku sa nazýva operácia dereferencovania referenčného poľa. Napríklad Platobná.Organizácia.Administratívna jednotka. V tomto prípade v referenčnom poli „Organizácia“ dokladu „Platba“ odkazuje na inú tabuľku „Organizácie“, v ktorej sa získa hodnota atribútu „Administratívna jednotka“. Je dôležité pochopiť, že pri prístupe k poliam cez bodku platforma implicitne vytvorí poddotaz a spojí tieto tabuľky.

Žiadosť:

Môže byť reprezentovaný ako:

SELECT Payment.Link, Payment.Organization, Payment.Organization, Organizations. AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Organizations Software Payment.Organization = Organizations.Link

Pri dereferencovaní referenčných polí zloženého typu sa framework pokúša vytvoriť implicitné spojenia so všetkými tabuľkami, ktoré sú súčasťou typu daného poľa. V tomto prípade dotaz nebude optimálny Ak je jasne známe, o aký typ poľa ide, je potrebné takéto polia obmedziť podľa typu konštruktom EXPRESNÉ().

Napríklad existuje akumulačný register „Nerozložené platby“, kde môže ako registrátor pôsobiť niekoľko dokumentov. V tomto prípade je nesprávne získať hodnoty údajov registrátora týmto spôsobom:

SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

mali by ste obmedziť typ zloženého poľa na zapisovač:

SELECT EXPRESS(Nepriradené platby.Registrovať sa ako dokument.Platba).Dátum, ..... FROM RegisterAkumulácia.Nepriradené platby AKO nepriradené platby

7. Konštrukcia "KDE"

Pri ľavom spojení dvoch stolov, keď zadáte podmienku „KDE“ na pravý stôl, dostaneme výsledok podobný výsledku s vnútorným spojením stolov.

Príklad. Je potrebné vybrať všetkých klientov z Adresára klientov a pre tých klientov, ktorí majú platobný doklad s hodnotou atribútu "Organizácia" = &Organizácia, zobraziť doklad "Platba", pre tých, ktorí ho nemajú, nezobrazovať.

Výsledok dotazu vráti záznamy len pre tých klientov, ktorí mali v parametri platbu podľa organizácie a odfiltruje ostatných klientov. Preto musíte najskôr prijať všetky platby pre „takú a takúto“ organizáciu v dočasnej tabuľke a potom ju pripojiť k adresáru „Klienti“ pomocou ľavého spojenia.

SELECT Payment.Link AS Platba, Platba.Akcionár AKO Klient MIESTO doPlatby Z dokumentu.Platba AKO platba WHERE Platba.Pobočka = &Pobočka; ///////////////////////////////////////////////// /////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") AKO platba z adresára .Clients AS Klienti OPUSTILI PRIPOJENIE k platbám AKO k platbám SOFTVÉR Klienti.Odkaz = k platbám.Klient

Tento stav môžete obísť aj inak. Je potrebné uložiť podmienku "KDE" priamo na vzťah medzi dvoma tabuľkami. Príklad:

VYBERTE Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers LEFT CONECTION Document.Payment AS Payment Software (Clients.Link = Payment.Client AND Payment.Client.Name LIKE "Sugar Packet") GROUP BY Clients.Link, Payment. Link

8. Pripojí sa k vnoreným a virtuálnym stolom

Vnorené dopytyčasto potrebné na získanie údajov na základe určitých podmienok. Ak ich potom použijete v spojení s inými tabuľkami, môže to kriticky spomaliť vykonávanie dotazu.

Napríklad u niektorých klientov potrebujeme získať Čiastku zostatku k aktuálnemu dátumu.

SELECT UnallocatedPaymentsBalances.Customer, UnallocatedPaymentsBalances.AmountBalance FROM (SELECT Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT JOIN RegisterAccumulations.NeallocatedBYNepriradenéPay alokovanéPaymentsZostatky. Zákazník

Pri vykonávaní takéhoto dotazu môže optimalizátor DBMS urobiť chyby pri výbere plánu, čo povedie k neoptimálnemu vykonaniu dotazu. Pri spájaní dvoch tabuliek optimalizátor DBMS vyberie algoritmus spájania tabuliek na základe počtu záznamov v oboch tabuľkách. Ak existuje vnorený dopyt, je mimoriadne ťažké určiť počet záznamov, ktoré vnorený dopyt vráti. Preto by ste mali vždy používať dočasné tabuľky namiesto vnorených dotazov. Tak poďme prepísať žiadosť.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients WHERE
Clients.Link B (&Klienti) ; ///////////////////////////////////////////////// /////////////////////////// VYBERTE tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, Z tClients AS tClients LEFT PRIPOJTE SA RegisterAccumulations.UnallocatedPayments.Balances (, Client IN (SELECT tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

V tomto prípade bude optimalizátor schopný určiť, koľko záznamov používa dočasná tabuľka tClients a bude schopný vybrať optimálny algoritmus na spájanie tabuliek.

Virtuálne stoly , umožňujú získať prakticky hotové dáta pre väčšinu aplikovaných úloh (Slice of the First, Slice of the Last, Remains, Turnovers, Remains and Turnovers) Kľúčové slovo je tu virtuálne. Tieto tabuľky nie sú fyzické, ale zostavuje ich systém za chodu, t.j. Pri príjme údajov z virtuálnych tabuliek systém zbiera údaje z tabuliek finálnych registrov, zostavuje, zoskupuje a vydáva ich užívateľovi.

Tie. Pri pripájaní k virtuálnej tabuľke sa vytvorí pripojenie k poddotazu. V tomto prípade môže optimalizátor DBMS zvoliť aj neoptimálny plán pripojenia. Ak sa dotaz negeneruje dostatočne rýchlo a dotaz používa spojenia vo virtuálnych tabuľkách, potom sa odporúča presunúť prístup k virtuálnym tabuľkám do dočasnej tabuľky a potom vytvoriť spojenie medzi dvoma dočasnými tabuľkami. Prepíšme predchádzajúcu požiadavku.

SELECT Clients.Link AS PLACE Link tClients FROM Directory.Clients AS Clients INDEX BY Link WHERE
Clients.Link B (&Klienti) ; ///////////////////////////////////////////////// /////////////////////////// SELECT UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS zostatky MIESTO klienta Z RegisterAccumulations.UnallocatedPayments.Balances(, Client B ( SELECT tClients Link FROM tClients)) AS UnallocatedPaymentsZostatky; ///////////////////////////////////////////////// /////////////////////////// SELECT tClients.Link, toRemainders.AmountRemaining AS Suma Remaining FROM tClients AS tClients LEFT JOIN toRemainders AS Remains BY tClients.Link. = tRemainings.Client

9.Kontrola výsledku požiadavky.

Výsledok dotazu môže byť prázdny na kontrolu prázdnych hodnôt, použite nasledujúci konštrukt:

ResRequest = Request.Execute(); If resQuery.Empty() Then Return; koniec Ak;

Metóda Prázdne () by sa mali použiť pred metódami Vybrať () alebo Uvoľniť (), keďže načítanie zbierky si vyžaduje čas.

Pre nikoho nie je zjavné, že je extrémne nežiaduce používať dopyty v slučke. To môže kriticky ovplyvniť prevádzkový čas konkrétnej funkcie. Je veľmi žiaduce prijať všetky údaje v požiadavke a potom tieto údaje spracovať v slučke. Niekedy však existujú prípady, keď je nemožné presunúť požiadavku mimo slučku. V tomto prípade môžete kvôli optimalizácii presunúť vytváranie dotazu mimo slučku a v slučke nahradiť potrebné parametre a spustiť dotaz.

Žiadosť = Nová požiadavka; Query.Text = "SELECT | Clients.Link, | Clients.Birth Date |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; Pre každý riadok FROM TableClients slučka Query.SetParameter("Client", Client); Výsledok dotazu = Query.Execute().Select(); EndCycle;

Toto ušetrí systém od syntaxe kontroly požiadavky v slučke.

11. Konštrukcia „MAŤ“.

Dizajn, ktorý je v požiadavkách pomerne zriedkavý. Umožňuje nastaviť podmienky na hodnoty agregovaných funkcií (SUM, MINIMUM, AVERAGE atď.). Napríklad musíte vybrať iba tých klientov, ktorých výška platby v septembri bola viac ako 13 000 rubľov. Ak použijete podmienku „KDE“, budete musieť najskôr vytvoriť dočasnú tabuľku alebo vnorený dotaz, zoskupiť tam záznamy podľa sumy platby a potom použiť podmienku. Konštrukcia „HAVING“ tomu pomôže vyhnúť sa.

VYBERTE Platba.Zákazník, SUMA(Platba.Suma) AKO Suma Z dokumentu.Platba AKO platba KDE MESIAC (Dátum platby) = 9 SKUPINA PODĽA platby.Zákazník MÁ SUMU (Suma platby) > 13 000

Ak to chcete urobiť, v konštruktore prejdite na kartu „Podmienky“, pridajte novú podmienku a začiarknite políčko „Vlastné“. Potom stačí napísať Suma (suma platby) > 13 000


12. Hodnota NULL

Nebudem tu popisovať princípy trojhodnotovej logiky v databáze, článkov na túto tému je veľa. Len v skratke ako NULOVÝ môže ovplyvniť výsledok dotazu. Hodnota NULL v skutočnosti nie je hodnotou a skutočnosť, že hodnota nie je definovaná, nie je známa. Preto každá operácia s NULL vráti NULL, či už ide o sčítanie, odčítanie, delenie alebo porovnanie. Hodnotu NULL nemožno porovnávať s hodnotou NULL, pretože nevieme, čo porovnávať. Tie. obe tieto porovnania sú: NULL = NULL, NULL<>NULL nie je pravda ani nepravda, nie je známa.

Pozrime sa na príklad.

Pre tých klientov, ktorí nemajú platby, potrebujeme zobraziť pole „Podpísať“ s hodnotou „Žiadne platby“. Navyše s istotou vieme, že takýchto klientov máme. A aby sme odrážali podstatu toho, čo som napísal vyššie, urobme to takto.

VYBERTE AKO Atribút "Žiadne platby", NULL AKO MIESTO dokumentu k platbám; ///////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, Payment.Link AKO Platba ULOŽIŤ tClientPlatbu Z Directory.Clients AKO Klienti ĽAVÉ PRIPOJENIE Dokument. Platba AS Platobný softvér Clients.Link = Payment.Shareholder; ///////////////////////////////////////////////// /////////////////////////// VYBERTE tClientPayment.Client Z tClientPayment AKO tClientPayment INTERNÉ PRIPOJENIE tPlatba AKO tPlatba tClientPlatbou.Platba = tPlatba

Venujte pozornosť druhej dočasnej tabuľke tClientPayment. Ľavým spojením vyberiem všetkých klientov a všetky platby pre týchto klientov. Pre klientov, ktorí nemajú platby, bude pole „Platba“ NULL. Podľa logiky som v prvej dočasnej tabuľke „tPayments“ označil 2 polia, jedno z nich NULL, druhý riadok „Nemá platby“. V tretej tabuľke spájam tabuľky “tClientPlatba” a “tPlatba” pomocou polí “Platba” a “Doklad” s interným spojením. Vieme, že v prvej tabuľke je pole „Dokument“ NULL a v druhej tabuľke sú NULL aj tí, ktorí nemajú platby v poli „Platba“. Čo nám takéto spojenie vráti? Ale nič to nevráti. Pretože porovnanie NULL = NULL sa nevyhodnotí ako True.

Aby žiadosť vrátila očakávaný výsledok, prepíšme ju:

VYBERTE AKO Atribút "Žiadne platby", VALUE(Document.Payment.EmptyLink) AKO DOKUMENT PLACE toPayments; ///////////////////////////////////////////////// /////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) AKO Platba PUT tKlientPlatba Z Adresára.Klienti AKO Klienti ĽAVÉ SPOJENIE Dokument.Platba AKO platba Klientmi.Odkaz = Platba.Akcionár; ///////////////////////////////////////////////// /////////////////////////// VYBERTE tClientPayment.Client Z tClientPayment AKO tClientPayment INTERNÉ PRIPOJENIE tPlatba AKO tPlatba tClientPlatbou.Platba = tPlatba

Teraz sme v druhej dočasnej tabuľke uviedli, že ak je pole „Platba“ NULL, potom toto pole = prázdny odkaz na platobný doklad. V prvej tabuľke sme tiež nahradili NULL prázdnou referenciou. Teraz pripojenie zahŕňa polia bez NULL a požiadavka vráti očakávaný výsledok.

Všetky požiadavky obsiahnuté v článku odrážajú situácie, ktoré by som chcel zvážiť, a nič viac. O Nemusia byť klamné alebo suboptimálne, hlavné je, že odrážajú podstatu príkladu.

13. Nezdokumentovaná vlastnosť dizajnu „VOĽBA, KEĎ...VTEDY...KONIEC“.

V prípade, že je potrebné v požiadavke popísať konštrukciu „Podmienky“, použijeme štandardnú syntax:

VYBERTE VÝBER, KEĎ Users.Name = "Vasya Pupkin" THEN "Náš obľúbený zamestnanec" ELSE "Toto nevieme" KONIEC AKO Pole1 Z Adresára.Používatelia AKO Používatelia

Čo ak však napríklad potrebujeme v žiadosti získať názov mesiaca? Písanie obrovskej konštrukcie do žiadosti je škaredé a časovo náročné, takže táto forma písania vyššie nám môže pomôcť:

VYBERTE MESIAC(US_CalculationConsumption_TurnoverSchedule.CalculationPeriod) KEDY 1 POTOM „január“, KEĎ 2, POTOM „február“, KEĎ 3. POTOM „marec“, KEĎ 4, POTOM „apríl“, KEĎ 5. POTOM „máj“, KEĎ 6“ KEĎ 7. J. 8 POTOM "august" KEĎ 9 POTOM "september" KEĎ 10 POTOM "október" KEĎ 11 POTOM "november" KEĎ 12 POTOM KONČÍ "december" AKO mesiac

Teraz dizajn vyzerá menej ťažkopádne a je ľahko pochopiteľný.

14. Dávkové vykonanie požiadavky.


Aby sa požiadavky nemnožili, môžete vytvoriť jednu veľkú požiadavku, rozdeliť ju do balíkov a pracovať s ňou.
Napríklad potrebujem získať nasledujúce polia z adresára „Používatelia“: „Dátum narodenia“ a dostupné roly pre každého používateľa. nahrajte to do rôznych častí tabuľky vo formulári. Samozrejme, môžete to urobiť v jednej požiadavke, potom budete musieť prechádzať záznamy alebo ich zbaliť, alebo môžete urobiť toto:

SELECT Users.Link AS Celé meno, Users.Date of Birth, Users.Role PUT vtUsers FROM Directory.Users AS Users; ///////////////////////////////////////////////// /////////////////////////// VYBERTE tueUsers.Celé meno, tueUsers.Dátum narodenia OD tueUsers AKO tueUsers GROUP BY tueUsers.celé meno, tueUsers . Dátum narodenia; ///////////////////////////////////////////////// /////////////////////////// VYBERTE wUsers.Celé meno, wUsers.Role FROM wUsers AS wUsers GROUP BY wUsers.Celé meno, wUsers Dátum narodenia

tPackage = Request.ExecutePackage();

TP_Dátum narodenia = tPackage.Upload();
TP_Roles = tPackage.Unload();

Ako vidíme, dotaz môže byť vykonaný v dávke a výsledok môže byť spracovaný ako pole. V niektorých prípadoch je to veľmi pohodlné.

15. Podmienky v žiadosti o dávku

Napríklad máme dávkovú požiadavku, kde najskôr získame polia: „Meno, Dátum narodenia, Kód“ z adresára „Používatelia“ a chceme získať záznamy s podmienkami pre tieto polia z adresára „Jednotlivci“.

SELECT Users.Individual.Name AS Meno, Users.Individual.Date of Birth AS Dátum narodenia, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; ///////////////////////////////////////////////// ////////////////////////// SELECT Jednotlivci AKO Jednotlivci Z adresára

Môžete si stanoviť takéto podmienky:

WHERE Individuals.Code IN (SELECT tueUsers.Code FROM tueUsers) AND Individuals.Meno IN (SELECT tueUsers.Code FROM tueUsers) AND Individuals.BirthDate IN (SELECT tueUsers.DateBirth FROM tueUsers)

A môžete to urobiť takto:

WHERE (Individuals.Code, Individuals. Name, Individuals. Date of Birth) IN (SELECT tueUsers.Code, tueUsers.Name, tueUsers.Date of Birth FROM tueUsers)

Okrem toho je potrebné udržiavať poriadok.

16. Volanie tvorcu dotazov pre „stav“ v dávkovej požiadavke

Keď je potrebné zadať podmienku, ako v príklade vyššie, môžete zabudnúť na to, ako sa to alebo ono pole volá vo virtuálnej tabuľke.
Napríklad musíte zadať podmienku pre pole „Dátum narodenia“ a vo virtuálnej tabuľke sa toto pole nazýva „Dátum narodenia dlžníka“ a ak zabudnete meno, budete musieť ukončiť úpravu podmienky bez uložiť a pozrieť sa na názov poľa. Aby ste tomu zabránili, môžete použiť nasledujúcu techniku.

Za konštrukciou „B“ je potrebné vložiť zátvorky a medzi zátvorkami nechať prázdne miesto (medzeru), vybrať túto medzeru a zavolať konštruktor dotazu. Návrhár bude mať prístup ku všetkým tabuľkám dávkového dotazu. Táto technika funguje na tabuľkách virtuálnych registrov aj na karte „Podmienky“. V druhom prípade je potrebné zaškrtnúť políčko „P (ľubovoľná podmienka)“ a vstúpiť do režimu úprav „F4“.

Otázky boli často vymýšľané za chodu a slúžia len na ilustráciu „techniky“, o ktorej som uvažoval.

Chcel som sa pozrieť na použitie indexov v dotazoch, ale toto je veľmi široká téma. Dám to do samostatného článku, alebo to sem pridám neskôr.

upd1. Body 11,12
upd2. Body 13,14,15,16

Použité knihy:
Jazyk dopytu "1C:Enterprise 8" - E.Yu. Khrustaleva
Profesionálny rozvoj v systéme 1C:Enterprise 8."

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