Hodnoty null (je null a je null()). Použití funkce isnull() Rozdíly mezi funkcí isnull() a isnull

💖 Líbí se vám? Sdílejte odkaz se svými přáteli

V procesu vývoje zpráv o SKD v 1C Enterprise často vyvstává úkol zobrazovat nuly v prázdných polích zprávy. Faktem je, že pokud nejsou potřebná data v databázi, dotaz nevrací číslo 0, ale speciální hodnotu NULL, kterou je pak nutné převést na číslo. Například když píšeme

a informační registr je prázdný, pak výsledkem požadavku v poli „Cena“ budou hodnoty NULL. A pokud podle podmínek úlohy potřebujeme v sestavě zobrazit nuly, pak musíme dotaz sestavit následovně:

Máte dotaz nebo potřebujete pomoc od konzultanta?

Představte si ale, že používáme spojení 2 datových sad v systému řízení přístupu a výsledek jedné z nich se ukáže jako prázdný. V tomto případě nám konstrukce ISNULL v textu požadavku této sady nepomůže, protože vrátí prázdný výběr. Nebudou existovat žádné hodnoty NULL, které lze převést na 0, nebude tam vůbec nic. NULL se objeví až po připojení datových sad a za to je zodpovědný systém rozložení. Zbývajícím řešením je použití vypočítaných polí. V našem příkladu budeme muset vytvořit počítané pole „Cena“ a do jeho výrazu zadat výraz ISNULL(Cena,0). V době, kdy se spustí výrazy vypočítaného pole, jsou dotazy již spojeny, takže již budeme mít pole "Cena" a bude obsahovat NULL. Vytvořením počítaného pole se stejným názvem v podstatě přepíšeme pole, které nám vrátily datové sady.

Dotazovací jazyk 1C je jedním z hlavních rozdílů mezi verzemi 7.7 a 8. Jedním z nejdůležitějších bodů při učení programování 1C je dotazovací jazyk. V 1C 8.3 jsou dotazy nejmocnějším a nejefektivnějším nástrojem pro získávání dat. Dotazovací jazyk umožňuje získat informace z databáze pohodlným způsobem.

Samotná syntaxe velmi připomíná klasické T-SQL, až na to, že v 1C pomocí dotazovacího jazyka můžete přijímat data pouze pomocí konstrukce Select. Jazyk také podporuje složitější konstrukce, například (požadavek v požadavku). Dotazy v 1C 8 lze psát jak v azbuce, tak v latince.

V tomto článku se pokusím mluvit o hlavních klíčových slovech v dotazovacím jazyce 1C:

  • Vybrat
  • povoleno
  • rozličný
  • vyjádřit
  • První
  • pro změnu
  • význam
  • typ hodnoty (a operátor REFERENCE)
  • výběr
  • skupina vytvořená
  • mít
  • ISNULL
  • Ano NULL
  • přípojky - pravé, levé, vnitřní, plné.

Stejně jako některé drobné triky jazyka 1C, pomocí kterých můžete optimálně sestavit text požadavku.

Pro ladění dotazů v systému 1C 8.2 je k dispozici speciální nástroj - konzola dotazů. Popis si můžete prohlédnout a stáhnout pomocí odkazu -.

Podívejme se na nejdůležitější a nejzajímavější operátory dotazovacího jazyka 1C.

VYBRAT

V dotazovacím jazyce 1C Enterprise 8 každý dotaz začíná klíčovým slovem VYBRAT. V jazyce 1C nejsou žádné konstrukty UPDATE, DELETE, CREATE TABLE, INSERT, tyto manipulace se provádějí v objektové technologii. Jeho účelem je pouze čtení dat.

Například:

VYBRAT
Aktuální Directory.Name
Z
Directory.Nomenclature AS Current Directory

Dotaz vrátí tabulku s názvy položek.

V blízkosti konstrukce VYBRAT můžete najít klíčová slova PRO ZMĚNU, POVOLENO, ROZLIČNÝ, PRVNÍ

POVOLENO— vybere z tabulky pouze záznamy, ke kterým má aktuální uživatel práva.

ROZLIČNÝ— znamená, že výsledek nebude obsahovat duplicitní řádky.

VÝBĚR (PŘÍPAD)

Velmi často je tento design programátory podceňován. Příklad jeho použití:

Aktuální název adresáře,

KDYŽ Aktuální Directory.Service PAK

"Servis"

KONEC ZOBRAZENÍ Nomenklatury

Directory.Nomenclature AS Current Directory

Příklad vrátí textovou hodnotu v poli „Typ položky“ – „Produkt“ nebo „Služba“.

KDE

Návrh dotazovacího jazyka 1C, který umožňuje uložit výběr na přijatá data. Vezměte prosím na vědomí, že systém přijímá všechna data ze serveru a teprve poté je vybrán na základě tohoto parametru.

VYBRAT
Adresář.Jméno
Z
Current Directory.Nomenclature AS Current Directory
WHERE CurrentDirectory.Service = TRUE

V příkladu vybereme záznamy, u kterých je hodnota atributu „Service“ nastavena na „True“. V tomto příkladu bychom si mohli vystačit s následující podmínkou:

"KDE JE SLUŽBA"

V zásadě vybíráme řádky, kde se výraz za klíčovým slovem rovná "True".

Přímé podmínky můžete použít ve výrazech:

WHERE kód = "005215"

Pomocí operátoru „VALUE()“ v podmínkách použijte přístup k předdefinovaným prvkům a výčtům v požadavku 1C:

WHERE Typ položky = Hodnota (Výčet. Typy položek. Produkt)

Časové hodnoty lze zadat následovně:

KDE Datum přijetí > DATUM ČAS (01.01.2012):

Nejčastěji jsou podmínky specifikovány jako parametry předávané požadavku:

Získejte 267 videolekcí na 1C zdarma:

WHERE NomenclatureGroup= &NomenclatureGroup

Na typ atributu lze uložit podmínku, pokud je složeného typu:

Pokud potřebujete omezit výběr ze seznamu hodnot nebo pole, můžete provést následující:

KDE je Registr akumulace B (&Seznam dokumentů pro výběr)

Stav může být také složitý, skládající se z několika podmínek:

WHERE Datum přijetí > DATETIME(2012,01,01) AND NomenclatureGroup= &NomenclatureGroup AND NOT Service

SKUPINA VYTVOŘENÁ

Návrh dotazovacího jazyka 1C 8.2 použitého k seskupení výsledku.

Například:

VYBRAT
Příjem zboží a služeb Zboží,
SUM(Příjem zbožíSlužbyZboží.Množství) AS Množství,
SUM(Receipt of GoodsServicesGoods.Amount) AS Částka
Z
Dokument Příjem zboží a služeb JAK Příjem zboží a služeb Zboží

SKUPINA VYTVOŘENÁ
Příjem zbožíSlužbyZboží.Zboží

Tento požadavek shrnuje všechny příjmy podle množství a množství podle položky.

Kromě klíčového slova SOUČET Můžete použít další agregační funkce: MNOŽSTVÍ, POČET RŮZNÝCH, MAXIMUM, MINIMÁLNÍ, PRŮMĚRNÝ.

MÍT

Design, na který se často zapomíná, ale je velmi důležitý a užitečný. Umožňuje zadat výběr ve formě agregační funkce, to nelze v návrhu provést KDE.

Příklad použití HAVING v požadavku 1C:

VYBRAT
Příjem zboží a služeb Zboží,
SUM(Příjem zbožíSlužbyZboží.Množství) AS Množství,
SUM(Receipt of GoodsServicesGoods.Amount) AS Částka
Z
Dokument Příjem zboží a služeb JAK Příjem zboží a služeb Zboží

SKUPINA VYTVOŘENÁ
Příjem zboží a služeb zboží

SUM(Příjem zbožíSlužbyZboží.Množství) > 5

Vybereme tedy počet produktů, kterých dorazilo více než 5 kusů.

VÝZNAM()

Například:

KDE Banka = Hodnota (Adresář.Banky.Prázdný odkaz)

WHERE Typ nomenklatury = Hodnota (Adresář. Typy nomenklatury. Produkt)

WHERE Typ položky = Hodnota (Výčet. Typy položek. Služba)

TYPE v požadavku

Datový typ lze zkontrolovat pomocí funkcí TYPE() a VALUETYPE() nebo pomocí logického operátoru REFERENCE.

VYJÁDŘIT()

Operátor Express v dotazech 1C se používá k převodu datových typů.

Syntax: VYJÁDŘIT(<Выражение>JAK<Тип значения>)

Pomocí něj můžete převést hodnoty řetězce na datum nebo referenční hodnoty na data řetězce a tak dále.

V praktických aplikacích se operátor Express() velmi často používá pro převod polí neomezené délky, protože pole neomezené délky nelze vybírat, seskupovat atp. Pokud taková pole nebudou převedena, zobrazí se chyba Nelze porovnávat pole neomezené délky a pole nekompatibilních typů.

VYBRAT
ContactInformation.Object,
EXPRESS(ContactInfo.View AS ROW(150)) AS View
Z
Registr kontaktních informací JAK Kontaktní informace

SKUPINA VYTVOŘENÁ
EXPRESS(ContactInfo.Representation AS ROW(150)),
ContactInformation.Object

ISNULL (ISNULL)

Docela užitečná funkce dotazovacího jazyka 1C, která kontroluje hodnotu v záznamu a zda je rovna NULA, To vám umožní nahradit ji vlastní hodnotou. Nejčastěji se používá při získávání virtuálních tabulek zůstatků a obratů za účelem skrytí NULA a vložte čistou 0 (nulu).

ISNULL(Předměsíční daně. Benefit AppliedFSS, 0)

Taková funkce dotazovacího jazyka 1C ISNULL vrátí nulu, pokud neexistuje žádná hodnota, čímž se zabrání chybě.

PŘIPOJIT

Existují 4 typy připojení: VLEVO, ODJET, ŽE JO, KOMPLETNÍ, VNITŘNÍ.

LEVÉ a PRAVÉ PŘIPOJENÍ

Spojení se používají k propojení dvou tabulek na základě konkrétní podmínky. Funkce kdy PŘIPOJIT SE VLEVO spočívá v tom, že vezmeme první zadanou tabulku celou a podmíněně svážeme druhou tabulku. Pole druhé tabulky, která nemohla být svázána podmínkou, jsou vyplněna hodnotou NULA.

Příklad levého spojení v požadavku 1C:

Vrátí celou tabulku a pole „Banka“ vyplní pouze v těch místech, kde je splněna podmínka „Protistrany.Jméno = Banky.Jméno“. Není-li podmínka splněna, pole Banka bude nastaveno na NULA.

RIGHT JOIN v jazyce 1C 8.3 naprosto podobný LEVÉ připojení, s výjimkou jednoho rozdílu: v PRÁVO PŘIPOJENÍ"Hlavní" tabulka je druhá, nikoli první.

PLNÉ PŘIPOJENÍ

PLNÉ PŘIPOJENÍ se od levé a pravé liší tím, že zobrazuje všechny záznamy ze dvou tabulek a spojuje pouze ty, které dokáže spojit podle podmínky.

Například:

PLNÉ PŘIPOJENÍ
Adresář.Banky JAK Banky

PODLE

Jazyk dotazu vrátí obě tabulky úplně, pouze pokud je splněna podmínka Join records. Na rozdíl od levého/pravého spojení je možné, aby se NULL objevila ve dvou polích.

VNITŘNÍ SPOJENÍ

VNITŘNÍ SPOJENÍ se od plného liší tím, že zobrazuje pouze ty záznamy, které bylo možné podle dané podmínky propojit.

Například:

Z
Adresář Klientů protistran

VNITŘNÍ SPOJENÍ
Adresář.Banky JAK Banky

PODLE
Clients.Name = Banks.Name

Tento dotaz vrátí pouze řádky, ve kterých mají banka a protistrana stejný název.

Závěr

Toto je jen malá část syntaxe z dotazovacího jazyka 1C 8 v budoucnu se pokusím podrobněji zvážit některé body, ukázat a mnohem více!

NULA– chybějící hodnoty.
Nezaměňovat s nulovou hodnotou! NULL není číslo, nerovná se mezera, prázdný odkaz nebo Nedefinováno.

NULL je typotvorná hodnota, tzn. existuje typ NULL a jedna hodnota tohoto typu.

Hodnoty NULL se v dotazu objevují v následujících situacích:
a) Externí spojení, ve kterém nebyl nalezen žádný odpovídající záznam v jiné tabulce (s levým - ve druhé tabulce, s pravým - v první, s úplným - v obou)
b) Přístup k detailům prvků pro skupinu a naopak.
c) NULL v seznamu polí výběru (SELECT)
d) Přístup k podrobnostem nefunkčního odkazu

JE NULL používá se v operátoru SELECT (jako když kontrolujete, zda je hodnota prázdná (Value IS NULL)):
Kód 1C v 8.x
VÝBĚR
KDYŽ je hodnota NULL, TAK ResultIfNULL
ELSE Význam
KONEC

další příklad:
Kód 1C v 8.x SELECT

VÝBĚR, KDYŽ Účetní položkyZbývající. Zbývající množství JE NULL PAK 0
JINAK Účtování pro Nomenklaturu Zbývající množství AS Zbývající množství
Z



KDE

Funkce ISNULL(hodnota; VýsledekIfNULL) vrátí hodnotu svého prvního parametru, pokud není NULL, a jinak hodnotu druhého parametru
Je sbaleno SELECT...END, ale preferováno je ISNULL.
Kód 1C v 8.x
VYBRAT
ISNULL(Directory.Nomenclature.Article, "---") JAKO článek,
Adresář.Nomenklatura.Prezentace AS Nomenklatura

další příklad:
Kód 1C v 8.x
VYBRAT
Adresář nomenklatury,
ISNULL(AccountingItemRemaining.QuantityRemaining, 0) AS QuantityRemaining
Z
Directory.Nomenclature AS DirectoryNomenclature
LEVÉ SPOJENÍ Registrovat Akumulace
Softwarová položka AccountingRemains.Nomenclature = Nomenclature Directory.Link
KDE
Nomenclature Directory.ThisGroup = FALSE
V tomto příkladu jsou získány všechny prvky adresáře položek, poté jsou pro každou položku získány aktuální zůstatky z registru akumulace. Protože pro položku, pro kterou nejsou žádné zůstatky, virtuální tabulka zůstatků nevrátí záznam, pak v důsledku spojení v poli "Položka AccountingRemaining.QuantityRemaining" budou hodnoty NULL pro položku, pro kterou existuje nebyly žádné zůstatky. Abychom zajistili, že místo hodnoty NULL bude výsledek požadavku obsahovat hodnotu 0, použili jsme funkci ISNULL(), která požadovanou náhradu provede.

ISNULL se liší od CHOICE z následujících důvodů:
a) Pokud ISNULL, dotaz je lépe čitelný (jednodušší)
b) Je-li ISNULL, pokud je zaškrtnut komplexní výraz, funguje rychleji, protože se počítá jednou
c) Je-li ISNULL, nahrazující výraz se převede na typ testovaného výrazu, pokud je typu String (délka) nebo Číslo (bitová hloubka).

Hodnoty pro NULL nemůžete zkontrolovat pomocí obvyklé rovnosti, protože SQL používá logiku se třemi hodnotami - True, False, NULL a výsledek takového srovnání bude NEZNÁMÝ, což je v 1C 8.0 podobné FALSE.
NULA<>0, takže pro levá vnější spojení viz. Nomenklatura s tabulkami zůstatků, cen, Protistrany se vzájemným zúčtováním, při absenci takových záznamů bude NULL, což se nerovná 0. Nejlepší řešení je ISNULL

Při práci s dotazovacím jazykem někdy nastane situace, kdy potřebujete nahradit hodnotu NULL nějakou jinou hodnotou. Potřeba takové operace může vzniknout například při příjmu stavů zásob pro celý sortiment. Tento článek popisuje použití funkce dotazovacího jazyka ISNULL() k řešení takových problémů a také popisuje další možnosti řešení.

Funkce ISNULL

Dotazovací jazyk implementuje funkci ISNULL(), jejímž účelem je nahradit výraz jiným výrazem, pokud měl výraz hodnotu NULL. Schéma syntaxe této funkce vypadá takto:

ISNULL(<Проверяемое выражение>, <Выражение замены>)

Tato funkce vrátí hodnotu prvního parametru, pokud není NULL, a hodnotu druhého výrazu, jinak.


VYBRAT
ISNULL(AccountingItemRemaining.QuantityRemaining, 0) AS QuantityRemaining
Z

KDE

V tomto příkladu jsou získány všechny prvky adresáře položek, poté jsou pro každou položku získány aktuální zůstatky z registru akumulace. Protože pro položku, pro kterou nejsou žádné zůstatky, virtuální tabulka zůstatků nevrátí záznam, pak v důsledku spojení v poli "Položka AccountingRemaining.QuantityRemaining" budou hodnoty NULL pro položku, pro kterou existuje nebyly žádné zůstatky. Abychom zajistili, že místo hodnoty NULL bude výsledek požadavku obsahovat hodnotu 0, použili jsme funkci ISNULL(), která požadovanou náhradu provede.

Pomocí operace SELECT

K vyřešení výše popsaného problému můžete použít operaci SELECT dotazovacího jazyka. Příklad, jak by vypadal požadavek podobný předchozímu, by vypadal takto:


VYBRAT
Adresář nomenklatury,
VÝBĚR, KDYŽ Účetní položkyZbývající. Zbývající množství JE NULL PAK 0
JINAK Účtování pro Nomenklaturu Zbývající množství AS Zbývající množství
Z
Directory.Nomenclature AS DirectoryNomenclature
LEVÉ SPOJENÍ Registrovat Akumulace
Softwarová položka AccountingRemains.Nomenclature = Nomenclature Directory.Link
KDE
Nomenclature Directory.ThisGroup = FALSE

Výsledek tohoto dotazu bude shodný s výsledkem dotazu uvedeného v předchozí části.

Použití funkce ISNULL() je vhodnější než použití operace SELECT z následujících důvodů: zápis pomocí ISNULL() je poněkud kompaktnější, což zvyšuje čitelnost dotazu. Navíc v případě, kdy je testovaný výraz komplexní funkcí, včetně agregační funkce, lze výpočet funkce ISNULL() provést rychleji než její protějšek zapsaný pomocí funkce SELECT.

Vlastnosti funkce ISNULL

Funkce ISNULL() je sice obdobou operace SELECT s kontrolou hodnoty pro NULL, přesto má rozdíl. Rozdíl je v tom, že pokud je funkční výraz řetězcového nebo číselného typu, nahrazující výraz bude převeden na typ testovaného výrazu.

Takže například v případě, kdy je testovaný výraz typu String(5) a nahrazující výraz je typu String(10), bude typ výsledku převeden na typ String(5). Výsledkem je, že když funkce vrátí náhradní výraz, hodnota bude zkrácena na pět znaků.

U číselných výrazů je situace podobná: hodnota nahrazovaného výrazu se převede na typ kontrolovaného, ​​tzn. nahrazovaný výraz může být zkrácen. Pokud hodnotu nelze převést, dotazovací jazyk dotaz nezdaří. Například pokus o převod čísla 1000 na typ Number(2) selže s chybou.

Při práci s dotazy musí každý programátor tak či onak interagovat s prázdnými hodnotami. Co rozumíme prázdnou hodnotou?

Hodnota null je buď žádná hodnota, nebo výchozí hodnota pro datový typ. U primitivních typů je vše docela jednoduché: výchozí hodnota je nějaká počáteční hodnota, která slouží jako výchozí bod.

Typy hodnot Null

Podívejme se na typy prázdných hodnot, se kterými se lze setkat nebo které mohou být vyžadovány v dotazu.

  • U typu Číslo je prázdná hodnota nula – 0.
  • Pro typ String – prázdný řetězec – „“.
  • Pro typ Datum – 1. leden prvního roku – 01/01/0001 00:00:00. Od tohoto data se čas počítá v 1C.*
  • U typu Boolean je výchozí hodnota technicky False, ale logicky jsou vyplněny obě hodnoty typu. Rozhodování, zda je prázdná hodnota False nebo ne, je tedy založeno na logice konkrétního algoritmu.

*Buďte opatrní, mimo 1C existují různé systémy počítání dat s různými výchozími body.

Chybějící hodnota plně odpovídá pouze typu Nula. Tento typ obsahuje pouze jednu hodnotu, která neoznačuje žádnou hodnotu.

Podobný typ Nedefinováno obsahuje také pouze jednu hodnotu, ale Nedefinováno neznamená absenci dat, ale pouze nemožnost určit výchozí hodnotu pro daný typ. Nedefinováno je výchozí hodnota pro složené typy, včetně těch, které nejsou explicitně definovány. Například hodnota v novém řádku tabulky hodnot ve sloupci, pro který není explicitně definován typ.

spol odkaz typů je mnohem menší nejistota. Všechny typy odkazů poskytují hodnotu null. Prázdná hodnota je stejný odkaz označující datový typ, ale bez jedinečného identifikátoru pro konkrétní hodnotu. Díky tomu můžeme s prázdným odkazem zacházet jako s běžným a aplikovat na něj všechny metody, které platforma poskytuje, pracovat s ním jako s plnohodnotnou hodnotou.

Práce s hodnotami Null v dotazu

Ať už potřebujete explicitně zadat hodnotu null do výsledku dotazu nebo porovnat existující hodnoty s hodnotou null, musíte vědět, jak ve svém dotazu popsat hodnoty null.

Typy Číslo, řetězec, logická hodnota jsou v požadavku popsány jako ve vestavěném jazyce:

SELECT 0 AS ExampleTypeNumber, "Ahoj světe" AS ExampleTypeString, True AS ExampleTypeBoolean

Nedefinovaný, který je v podstatě primitivním typem, je popsán podobně:

Vyberte Batch.Period From Accumulation Register.Batch As Batch Where Remains.DocumentBatch = Undefined

Prázdné referenční hodnoty se definují trochu obtížněji. Všechny referenční objekty mají předdefinovanou servisní hodnotu EmptyReference. Díky tomu je možné vybrat prázdný odkaz jediným způsobem - prostřednictvím funkce Value:

Vyberte hodnotu(Directory.Nomenclature.EmptyLink) Jak vyprázdnit nomenklaturu

Možnosti práce s hodnotami Null jsou poněkud bohatší. Stejně jako ostatní primitivní typy je Null popsán stejným způsobem jako ve vestavěném jazyce. Kromě toho existuje speciální operátor Is Null a funkce IsNull.

  • Operátor Is Null umožňuje vytvořit logický výraz, který porovnává vybranou hodnotu s hodnotou Null.
  • Funkce IsNull vrátí první argument, pokud není Null, a druhý argument jinak.

Výrazy, které definují prázdné hodnoty, lze použít v libovolných sekcích dotazu, které podporují výrazy. Můžete například přidat prázdný odkaz do sekce Vybrat nebo zaškrtnutí Null do podmínky.

Praktické příklady

Pomocí funkce Hodnota

Vyberte Products.Link jako nomenklaturu, Products.Link = Value(Directory.Nomenclature.EmptyLink) To se mi líbíLinkEmpty From TueProducts As TueProducts

Použití operátoru Is Null

Vyberte Products.Link jako nomenklaturu, Products.Link je nulový jako tento LinkPrázdný z TueProducts as TueProducts

Null vlevo nebo úplné spojení

Nulová kontrola

Příklad ukazuje běžnou praktickou situaci, kdy s levým spojením neexistuje shoda pro první stůl ve druhém. V tomto případě budou všechna pole druhé tabulky Null.

Vyberte TueProducts.Link jako nomenklaturu, Remains.QuantityRemaining jako množství, Remains.QuantityRemaining je null as NoRemaining Z TueProducts jako TueProducts Levé připojení RegisterAccumulations.ProductsInWarehouses.Remains As Remains By TueProducts.Link = Remains.Nomenclature

Práce s nulovými hodnotami

Úprava předchozího dotazu pro demonstraci běžné techniky pro získání některých výchozích hodnot pro nahrazení chybějících. V tomto příkladu pomocí funkce IsNull je chybějící hodnota zbytku nahrazena logicky správnou 0.

Vyberte TueProducts.Link jako nomenklaturu, IsNull (Remaining.QuantityRemaining, 0) jako množství z TueProducts jako TueProducts Levé připojení RegisterAccumulations.ProductsInWarehouses.Remains As Remains By ÚtProducts.Link = Remains.Nomenklatura

V tomto článku jsme se podívali na různé typy prázdných hodnot a jejich vlastnosti, studovali způsoby, jak definovat různé typy prázdných hodnot v dotazech, a v praktické části jsme se přesvědčili o snadnosti aplikace probíraného materiálu.

říct přátelům