V testovací konfiguraci v deníku dokumentů je nutné implementovat číslování řádků v dynamickém seznamu. Deník obsahuje tři dokumenty: „Žádost“, „Příjemka“ a „Vydat objednávku“. Zpočátku formulář seznamu deníku dokumentů vypadá takto:

Úkol by se v zásadě snadno vyřešil, kdybychom obdrželi seznam dokumentů ve zprávě. Ale tady jsou věci jiné.

Žádný problém v hlášeních!

Po vytvoření zprávy o systému složení dat se seznamem dokumentů bude úkol vyřešen velmi jednoduše. V polích sestavy by bylo nutné přidat pouze speciální pole „Číslo v pořadí“.

Ve výsledku se uživateli zobrazí podobný výsledek generování sestavy:

Ale co když potřebujete získat číslování přímo v žádosti? Můžete to například potřebovat k získání pořadového čísla záznamu v dynamickém seznamu.

Číslování v žádosti

Upravme dotaz pro dynamický seznam deníku dokumentů takto:

„VYBERTE | T ... ČísloObjednávka, | T ... Odkaz, | T ... Datum, | T ... Smazat značku, | T ... Pokoj, místnost, | T ... Držený, | T ... Typ |Z | (VYBRAT" + // Zjistěte počet připojených odkazů v poli „NumberOrder“ " MNOŽSTVÍ (JINÝ DOKUMENTOVÝ DENNÍ DOKUMENT. ODKAZ) JAKO číslo podle objednávky, | Deník dokumentů. Odkaz jako odkaz. | Deník dokumentů. Datum AS Datum, | Deník dokumentů. Označit smazání AS Označit smazání, | Deník dokumentů. Číslo AS číslo, | Deník dokumentů. Provedeno AS Provedeno, | Deník dokumentů. Typ AS Typ | Z | Deník dokumentů. Deník dokumentů AS Deník dokumentů | LEFT JOINT Journal of Documents. Časopis dokumentů AS Časopis dokumentů Časopis dokumentů" + // Propojte tabulku deníku dokumentů k sobě pomocí odkazu na dokument. Počet připojení // links je pořadové číslo " Softwarový deník dokumentů. Odkaz\u003e \u003d DocumentJournalDocumentJournal. Odkaz / | | ZATÍŽIT | Deník dokumentů. Odkaz, | Deník dokumentů. Datum, | Deník dokumentů. Smazat značku, | Deník dokumentů. Pokoj, místnost, | Deník dokumentů. Držený, | Deník dokumentů. Typ) AS T"

Při otevírání dynamického seznamu v režimu 1C: Enterprise získáme následující výsledek:

Poznámka: příklad ukazuje pouze princip číslování řádků přímo v dotazu. Pokud jste si na výše uvedeném snímku obrazovky všimli, dokumenty v seznamu, seřazené podle pořadového čísla řádku, „jdou“ v pořadí typů (první objednávky příjmu, potom výdaje atd.). K tomu dochází, protože při použití odkazu k propojení nemůžeme zaručit, že identifikátory GUID odkazů budou jedinečné. Rovněž nemůžete porovnávat odkazy různých typů dokumentů - to povede k nesprávnému výsledku. Můžete použít okamžik v čase nebo jiná pole, která určují konkrétní pozici dokumentu z obecného seznamu deníku.

Při použití podobného přístupu bychom samozřejmě zkomplikovali dotaz do databáze a navíc by některé funkce dynamického seznamu, které jsou důležité pro uživatelskou zkušenost, byly nedostupné (dynamické čtení dat, hlavní tabulka atd. .), ale příklad byl vytvořen pouze k prokázání možnosti číslování řádků v dotazech. Použitím tohoto principu k řešení dalších problémů, například u tiskových desek, takové problémy nenastanou.

Uvědomte si, že opětovné použití tabulky dokumentů nebo deníku dokumentů může negativně ovlivnit výkon. Optimální by bylo vytvořit dočasnou tabulku se všemi vybranými dokumenty a poté s ní pracovat. Opět vše záleží na konkrétním úkolu!


Klíčová slova: číslování řádků dotazu, FIRST, číslování řádků ve staviteli, číslo

Někdy je nutné do dotazu přidat sloupec s čísly řádků, například když potřebujete zobrazit čísla řádků v sestavě, ale použije se tvůrce sestav. Číslování řádků je také užitečné, když je nutné zobrazit omezený počet datových řádků pro určitá seskupení. Něco jako PRVNÍ 5 dokumentů pro každou protistranu.

Existuje tedy kód, který vybírá položku, seřazený podle názvu:
VYBRAT
Názvosloví. Ref.
Z

SEŘAZENO PODLE
Nomenklatura.
původní požadavek

Je nutné sem přidat sloupec s pořadovými čísly položky (v rámci tohoto třídění).
VYBRAT

Z
Odkaz. Nomenklatura AS nomenklatura
Softwarová nomenklatura.název\u003e \u003d Nomenklatura_1.název // Podmínka řazení pro číslování

SEŘAZENO PODLE
Nomenklatura.
dotaz s čísly řádků

Spojujeme stůl k sobě poměrně složitým způsobem. Na pravé tabulce spočítáme pomocí seskupení počet položek se jménem menším než aktuální vlevo.

Podobnou techniku \u200b\u200blze použít, pokud potřebujete určit číslování řádků s ohledem na seskupení podle některých polí.
VYBRAT
Nomenklatura.Ref AS Nomenklatura,
Nomenklatura. Rodič jako rodič,
MNOŽSTVÍ (Nomenklatura_1.reference) AS číslo
Z
Odkaz. Nomenklatura AS nomenklatura
INNER JOINT Reference.Nomenklatura AS Nomenclature_1
Nomenklatura softwaru. Název\u003e \u003d Nomenklatura_1.
A Nomenclature.Parent \u003d Nomenclature_1. Rodič

ZATÍŽIT
Názvosloví. Rodič,
Názvosloví. Ref.
dotaz s čísly řádků v rámci seskupení

Toto je stejný dotaz, pouze přidá seskupení podle pole „Nadřazený“, číslování pro každého rodiče je jiné.

Výkon:
Když mluvíme o výkonu, pak jsou požadavky tohoto druhu přirozeně náročné na zdroje (matematicky falešnost řádu N ^ 2). U většiny každodenních úkolů je jejich použití naprosto přijatelné.
Mimochodem, druhý dotaz je proveden o něco rychleji než první, je to kvůli menší velikosti pomocných tabulek.

Příklad skutečného použití:
Nyní něco o tom, proč se to všechno děje, to znamená výhoda, kterou lze odvodit z číslování řádků dotazu.

Stojíme například před úkolem získat pro každou protistranu posledních pět dokumentů o přijetí zboží a služeb:
VYBRAT
Příjem zboží a služeb. Dodavatel AS Protistrana,
Příchod zboží a služeb. Odkaz AS Odkaz.
MNOŽSTVÍ (Příjem zbožíServices_1.Ref) AS číslo
Z
Document.Arival of GoodsServices AS Receip of GoodsServices
DOKUMENT O DOMÁCÍM PŘIPOJENÍ. Příjem GoodsServices AS Příjem GoodsServices_1
ON Příjem zboží, služeb, datum<= ПоступлениеТоваровУслуг_1.Дата
And Receipt of GoodsServices.Contractor \u003d Příjem zbožíServices_1.Contractor

ZATÍŽIT
Příjem zboží a služeb. Odkaz,
Příjem zboží, služeb, dodavatel

MÁM
MNOŽSTVÍ (příjem zbožíServices_1.Link)<= 5

SEŘAZENO PODLE
Protistrana,
pokoj, místnost
dotaz s čísly řádků, pokud existují duplikáty pole zájmu (ten, ke kterému je počítadlo postaveno)
VYBRAT
ČÍSLO (Individuals_1.Name) JAKO číslo,
Jednotlivci. Reference AS celé jméno
Z
Directory.Persons AS jednotlivci
VNITŘNÍ PŘIPOJENÍ Directory.Persons AS Individuals_1
PO (Jednotlivci. Jméno + Jednotlivci. Kód\u003e \u003d Jednotlivci_1. Jméno + Jednotlivci_1 Kód)

SEŘAZENO PODLE
pokoj, místnost
Ve skutečnosti jde o to, co: použít „složené pole“ k získání vzestupného součtu (v tomto případě může jedno pole obsahovat duplikáty, zatímco druhé v tomto příkladu nikoli).
Narodil se v hlavě NECRON „a

Zvažme nyní zbytek.

Funkce pro práci s řetězci v 1C dotazech

Existuje několik funkcí a operátorů pro práci s daty řetězce v dotazech 1C.

Nejprve lze přidat řetězce v dotazech. K tomu použijte operátor „+“:

Žádost. Text \u003d "VYBRAT
"" Řádek: " "+ Zdroj. Název
;

Zadruhé můžete vybrat část řádku. K tomu použijte funkci PODKLAD.Funkce je podobná vestavěnému jazyku 1C. Má tři parametry:

  1. Zdrojový řetězec.
  2. Číslo znaku, kterým by měl vybraný řádek začínat.
  3. Postavy.

Žádost. Text \u003d "VYBRAT
PODKLAD ("
„Řádek:“ ", 4, 3) AS Výsledek"; // Výsledek: ok

Funkce JE NULL

NULL je speciální typ dat na platformě 1C: Enterprise. Je to také jediná možná hodnota tohoto typu. NULL může nastat v dotazech v několika případech: při připojení ke zdrojům dotazu, pokud nebyla odpovídající hodnota nalezena v jedné z tabulek; při přístupu k podrobnostem neexistujícího objektu; pokud byla v seznamu polí dotazu zadána hodnota NULL (například při kombinaci výsledků výběru z několika tabulek) atd.

Protože NULL není ani , ani prázdný řetězec, ani sudá hodnota Nedefinováno, často je užitečné jej nahradit nějakým užitečnějším datovým typem. K tomu je funkce určena. JE NULL.

Má dva parametry:

  1. Hodnota ke kontrole.
  2. Hodnota, kterou se má nahradit první parametr, pokud má hodnotu NULL.

Žádost. Text \u003d "VYBRAT
JE NULL (Source.Remains, 0) AS Remainder "
; // Pokud v důsledku požadavku bude zbývající pole \u003d NULL,
// pak bude nahrazen 0 a můžete s ním provádět matematické operace

Funkce REPREZENTACEa PŘEDKLÁDANÉ ODKAZY

Tyto funkce jsou navrženy tak, aby získaly řetězcové reprezentace různých hodnot. To znamená, že převádějí odkazy, čísla, booleovské hodnoty atd. na prostý text. Rozdíl mezi nimi spočívá v tom, že funkce REPREZENTACEpřevede libovolné datové typy na text (řetězec) a funkci PŘEDKLÁDANÉ ODKAZY- pouze odkazy a vrací zbytek hodnot tak, jak jsou, nepřevede se.

Žádost. Text \u003d "VYBRAT
ZASTOUPENÍ (SKUTEČNÉ) JAKO Boolean,
ZASTOUPENÍ (4) JAKO číslo,
PŘEDLOŽENÍ (Source.Link) AS Link,
ZASTOUPENÍ (DATETIME (2016,10,07)) JAKO datum "
;
// Boolean \u003d "Yes", Number \u003d "4", Link \u003d "Doklad Hotovostní faktura č ... od ..."
// Date \u003d "10/07/2016 0:00:00"

Žádost. Text \u003d "VYBRAT
ZASTOUPENÍ LINKY (SKUTEČNÉ) JAKO Boolean,
ZASTAVENÍ ODKAZU (4) JAKO ČÍSLO
PŘEDLOŽENÍ ODKAZU (Source.Link) JAKO Odkaz,
ZASTOUPENÍ ODKAZU (DATETIME (2016,10,07)) JAKO datum “
;
// Boolean \u003d TRUE, Number \u003d 4, Link \u003d "Číslo dokladu v hotovosti ... od ..."
// Datum \u003d 10/07/2016 0:00:00

Funkce TYPa TYP HODNOTY

Funkce TYPvrací datový typ platformy 1C: Enterprise.

Žádost. Text \u003d "VYBRAT
TYP (číslo),
TYP (řetězec),
TYP (hotovostní objednávka Document.Index) "
;

Funkce TYP HODNOTYvrací typ hodnoty, která mu byla předána.

Žádost. Text \u003d "VYBRAT
TYP (5) JAKO číslo
TYP ("
"Čára" ") AS řetězec,
TYP (Source.Link) AS Reference
Z reference. Zdroj AS Zdroj "
;
// Number \u003d Number, String \u003d String, Directory \u003d DirectoryRef.Source

Tyto funkce lze pohodlně použít, například když potřebujete zjistit, zda je pole přijaté v dotazu hodnotou nějakého typu. Například budeme dostávat kontaktní informace protistran z registru kontaktních informací (jsou zde uloženy kontakty nejen protistran, ale také organizací, jednotlivců atd.):

Žádost. Text \u003d "VYBRAT

Z

KDE
TYPE (ContactInformation.Object) \u003d TYPE (Directory.Contractors) "
;

Funkce HODNOTA

Funkce Hodnotaumožňuje použít konfigurační objekty 1C v požadavku přímo, bez použití.

Doplňme předchozí příklad o další podmínku. Musíte pouze získat telefonní čísla dodavatelů.

Žádost. Text \u003d "VYBRAT
Kontaktní informace.
Z
Registr informací. Kontaktní informace AS Kontaktní informace
KDE
TYPE (Contact Information.Object) \u003d TYPE (Directory.Contractors)
AND Contact Information.Type \u003d VALUE (Enumeration.Types of Contact Information.Phone) "
;

Je třeba poznamenat, že tuto funkci lze použít pouze s předdefinovanými hodnotami, tj. s hodnotami, ke kterým lze přistupovat přímo z konfigurátoru. To je funkce HODNOTA nelze použít s uživatelem vytvořenými položkami katalogu, ale může pracovat s výčty, s předdefinovanými položkami katalogu, s hodnotami EmptyLink.

Operátor ODKAZ

Operátor ODKAZje navržen tak, aby zkontroloval, zda hodnoty přijaté dotazem patří k určitému referenčnímu typu. Stejný úkol lze provést pomocí funkcí TYPa TYP HODNOTY (které mají širší rozsah a byly diskutovány výše).

Například úkol výběru kontaktních údajů pro dodavatele lze vyřešit takto:

Žádost. Text \u003d "VYBRAT
Kontaktní informace.
Z
Registr informací. Kontaktní informace AS Kontaktní informace
KDE
ContactInformation.Object LINK Directory.Contractors "
;

Operátor Vyjádřit

Operátor Vyjádřit použito v požadavcích 1C ve dvou případech:

  • když potřebujete změnit vlastnosti primitivního typu;
  • když potřebujete vytvořit pole s jediným typem z pole se složitým datovým typem.

Mezi primitivní datové typy patří: číslo, řetězec, datum, boolean.Některé z těchto datových typů mají další vlastnosti. Typ Číslo má délku a přesnost, typ Řádek -délka nebo neomezená.

Operátor Vyjádřit umožňuje změnit nikoli datový typ, ale spíše další charakteristiky. Může například změnit řetězec s neomezenou délkou na řetězec s omezenou délkou. To může být užitečné, pokud chcete seskupit výsledky dotazu podle takového pole. Nelze seskupovat podle polí s neomezenou délkou, proto jej převedeme na řetězec o délce 200 znaků.

Žádost. Text \u003d "VYBRAT
MNOŽSTVÍ (RŮZNÉ Příjezd zbožíServices.Link) AS Link
Z
Document.Arival of GoodsServices AS Receip of GoodsServices
ZATÍŽIT
EXPRESS (příjem servisních produktů. Komentář AS LINE (200)) "
;

V některých případech nemusí platforma 1C zpracovávat dotazy na pole s kompozitním datovým typem optimálně. Tím se zvyšuje doba provádění dotazu, takže může být užitečné předem převést složený typ na jeden typ.

Žádost. Text \u003d "VYBRAT
EXPRESS (obraty pohybu zboží. Objednávka jako dokument. Objednávka klienta). Datum jako datum objednávky,
Pohyb zbožíTurnovers.Nomenklatura
Z
Registr akumulace.Goods Movement.Turnovers AS Zboží MovementTurnovers
KDE
Pohyb zbožíTurnovers.Order LINK Dokument. Objednávka klienta "
;

Operátoři VÝBĚRa JE NULL

Operátor VÝBĚR podobný operátorovi LI ve vestavěném jazyce 1C, ale má poněkud zbavenou funkčnost.

Řekněme, že chceme získat kontaktní informace z registru Kontaktní informace a zároveň v samostatném poli požadavku označit, zda patří protistraně nebo jednotlivci.

Žádost. Text \u003d "VYBRAT
Kontaktní informace. Zastoupení,
VÝBĚR
KDY TYP (ContactInformation.Object) \u003d TYP (Directory.Contractors)
PAK "
Protistrana "
JINÁ VOLBA
KDY TYP (Contact Information.Object) \u003d TYPE (Directory.Persons)
PAK "
Individuální "
JINÉ „Někdo jiný "
KONEC
KONEC AS Majitel
Z
Informační registr. Kontaktní informace AS Kontaktní informace "
;

Jak můžete vidět na příkladu, v konstrukci VÝBĚR za slovem je vždy podmínka KDYŽ; hodnota, která se použije, pokud je podmínka splněna, za slovem PAK a hodnota, která se má použít, pokud podmínka není splněna, za slovem JINÝ.Všechny tři konstrukční prvky VÝBĚRjsou potřeba. Vynechat prvek JINÝ, stejně jako používání operátoru LIve vestavěném jazyce 1C je to nemožné. Také operátor VÝBĚR neexistuje žádný analogický vzor JINÉ IF, ale můžete dát jeden VÝBĚR v jiném, jak bylo provedeno v našem příkladu.

Operátor JE NULLpoužívá se ve stavebnictví VÝBĚRporovnat pole dotazu s typem NULL.

Žádost. Text \u003d "VYBRAT
VÝBĚR
KDY JE Hodnota NULL POTOM 0
JINÁ hodnota
KONEC"
;

Kromě toho provozovatel JE NULLlze použít v podmínkách dotazu, například ve větě KDE.