Co je sloupcový strom?
Strom hodnot v 1C (typ hodnoty „Strom hodnot“) je univerzální sbírka hodnot v systému 1C, kde jsou prvky seřazeny podle indexu (číslování začíná od 0). Každá hodnota prvku obsahuje kolekci podřízených řádků, kde každý řádek kolekce má nadřazeného prvku – prvek umístěný o úroveň výše. Kořenový prvek (prvek první úrovně) nemá nadřazeného prvku. Přístup k prvkům se provádí prostřednictvím Indexu, jehož číslem můžete přistupovat k hodnotě prvku a jemu podřízené kolekci Řádků. Popis z Asistenta syntaxe: používá se pro přístup k vlastnostem a metodám stromu hodnot 1C jako celku. Objekt stromu má podobnou funkci jako tabulka hodnot a má také možnost přidávat podřízené řádky do libovolného řádku ve stromu. Pozor! V tlustém klientovi (běžná aplikace) předávání hodnot tohoto typu z klienta na server a zpět vede k výjimce. Dostupnost: server, tlustý klient, externí připojení, mobilní aplikace (server), mobilní samostatný server. Serializovatelný: Tento objekt lze serializovat do/z XDTO. Typ XDTO odpovídající danému objektu je definován ve jmenném prostoru. Název typu XDTO: ValueTree.
2. Jak vytvořit strom hodnot v 1C 8.3

Vzhledem k tomu, že strom hodnot v 1C 8.3 je komplikovaný návrh z hlediska implementace softwaru a poměrně náročný na zdroje, není často používán ve vývoji. Je však velmi vhodný pro implementaci nestandardních úkolů, včetně případů, kdy potřebujete zobrazit mnoho hodnot s možností seskupování podle nadřazeného prvku. Je nutné jednoznačně oddělit Strom hodnot jako deklarovanou proměnnou (prostřednictvím konstruktoru „Nový strom hodnot“) a jako atribut formuláře 1C 8.3 (všimněte si, že DM nelze vybrat jako datový typ Atribut objektu). Pokud lze deklarované (dále jen OP) DZ přečíst na Klientovi, přenést na Server ke zpracování a vrátit zpět, pak bude DZ jako atribut formuláře 1C 8.3 (dále jen RF) čitelný pouze na klienta. Na Serveru i při pokusu o čtení strom vyhodí výjimku a samozřejmě vůbec nedovolí měnit data. Dále se budeme zabývat chováním identických akcí za podmínky deklarace proměnné (v rámci jedné procedury/funkce) a podmínek přidaného atributu formuláře 1C 8.3. Nebudeme zvažovat možnosti práce s globálními proměnnými, exportními nebo neexportními modulovými proměnnými, protože aplikace závisí na kontextu úkolu a vaší víře v deklaraci globálních a nekontextových proměnných. DZ jako RF má svou výhodu: sloupce a datový typ můžete nastavit v samotném RF a programově přistupovat k datům z libovolné procedury nebo funkce modulu formuláře (nezapomeňte na kompilační příkazy). Pro RP jako OP je nutné popsat všechny potřebné sloupce (pro začátečníky to může být problematické, pokud není jasná představa, o jaký druh „šelmy“ se jedná), a také to pochopit na konci procedury/funkce životní cyklus proměnné končí (samozřejmě, pokud jsme ji nedeklarovali jako globální, ale to je úplně jiný příběh). Příklad popisu dálkového ovládání pro program 1C Enterprise 8:

Jak je vidět z příkladu, DB specifikuje sloupce, do kterých budou data umístěna, ale pro přidání těchto dat potřebujete přístup k Row Collection: DataTree.Rows.Add(). Tímto způsobem se přidávají řádky první úrovně, poté přidáme kolekci řádků do řádku první úrovně a tak dále. V tomto případě je pomocí metody Add() Parent přiřazen automaticky, ale lze jej samozřejmě změnit. Takto se staví strom, ale nezapomínejte, že čím více dat, tím větší spotřeba zdrojů. Příklad dálkového průzkumu jako RF:

Přidávání dat probíhá v podstatě stejným způsobem, jak je popsáno, ale existují programové rozdíly. Pojďme si popsat ty hlavní:


** Příklad operace „převést-zapsat-převést“:

Rozšířený strom hodnot v podstatě připomíná výsledek dotazu se seskupeními, kde čím více seskupení, tím větší celkový počet řádků. Pokud tedy potřebujete načíst výsledek dotazu (kde jsou data seskupena) do dálkového ovládání, musíte:
1. (nepovinné) převod z formulářových rekvizit; 2. stáhnout výsledek; 3. převést na formulářové atributy.

Pokud potřebujete načíst data do dálkového ovládání z tabulkové části 1C, můžete použít několik metod:
1. Záznam pomocí cyklů: zde si musíte pamatovat, že existují „kořenové“ čáry a musíte je nějak najít, abyste správně vytvořili vztah kořen-podřízený.
2. Nahrajte pomocí požadavku (tady jsou dvě možnosti):
A. uvolnit tabulkovou část 1C do dočasné proměnné, předat ji jako parametr, vygenerovat výsledek pomocí hierarchie a načíst výsledek do stromu;

b. vygenerovat požadavek, kterému předáme jako parametr odkaz dokumentu přijatého ke zpracování v 1C 8.3, načež vygenerujeme výsledek pomocí hierarchie a načteme do stromu.
*Možnosti 2a a 2b vypadají podobně. Je mezi nimi však rozdíl. Spočívá ve výkonu, který závisí na kontextu použití (množství dat, počet uživatelů, zatížení serveru atd.). Na jedné straně při použití direktivy OnServer již máme tabulkovou část 1C (samozřejmě na straně serveru, ale ta je již načtená), kterou můžeme přenést do Requestu a provést jej bez ztrát či jiných akcí. Na druhou stranu, při přístupu k odkazu v důsledku provedení Požadavku systém znovu přistoupí k databázi, ale možná to udělá rychleji než v prvním případě. Tento bod vyžaduje výzkum v konkrétní databázi. Chcete-li zapsat data do tabulkové části 1C nebo do tabulky hodnot, budete muset vytvořit cyklus, který bude zapisovat do přijímače podle následujících pravidel:
1. strom je překročen od kořene k podřízeným do poslední úrovně vnoření;
2. pokud má kořen podřízené prvky, pak se počet výsledných řádků v tabulce vypočítá pomocí vzorce:
, kde n je počet prvků na dané úrovni, m je počet úrovní (hloubka vnoření stromu);
3. Doporučuje se psát Root – Subordinate element, proto je vyžadován záznam pomocí rekurzivní metody. Příklad rekurzivního záznamu z datového záznamu do tabulkové části Produkty: 

Pro čtení dat je vše trochu jednodušší: číst můžete jak na Klientovi, tak na Serveru. Jediný rozdíl je v tom, že pro direktivu OnClient budete muset nejprve zavolat metodu GetElement(), která není vyžadována pro direktivu server. Pozor! Nezapomeňte, že čtení v proceduře/funkci s direktivou OnClientOnServerWithoutContext se kompiluje současně na klientovi i na serveru, což znamená, že popisem čtení jako pro klienta při volání provádění z procedury/funkce s direktivou serveru, program vyvolá výjimku (a naopak). Pokud je nutné volat čtení na Klientovi i na Serveru, doporučuje se vytvořit handlery s příslušnými direktivami. Dálkový průzkum Země lze mimo jiné využít zvláště sofistikovaným způsobem práce. Řekněme, že zadáme úkol, že je potřeba mít na formuláři dvě tabulky, tabulka vlevo je strom, ve kterém jsou všechny úrovně kromě poslední; vpravo je tabulka, která zobrazuje data poslední úrovně vnoření. Aktivací řádku ve Stromu se tedy zobrazí všechny jeho podřízené prvky.
Implementovaný příklad takového úkolu:
*Samozřejmě, že aktuální data jsou testovací data. Úloha předpokládala, že může existovat až 15 kořenových úrovní, druhá úroveň – přibližně stejně, ale poslední úroveň může mít až 50 řádků. V tomto rozložení je vhodné vidět všechny prvky nižší úrovně při přepínání mezi rodiči. Použití Stromu hodnot je poměrně netriviální a sofistikovaná metoda, která má své výhody (zejména když lze skupiny produktů sbalit). Je možné jej použít pro velké tabulky (s více než 100 řádky), ale je důležité zkoumat výkon v každém konkrétním případě.
Specialista Coderline LLC Kaplin Ivan Aleksandrovich
Obrázek 4.48. Stromová tabulka s hlavičkou

4.12.1. Obecné parametry stromové tabulky
- výška záhlaví 40 px
- volitelně je v záhlaví umístěno tlačítko o výšce 32 px (podle toho jsou odrážky nad a pod tlačítkem každé 4 px)
- výška záhlaví 32 px
- výška řádku 26 px (bez tečkovaných okrajů)
- vodorovné odsazení textu od okraje buňky je 12 px
- Obsah v buňkách tabulky je zarovnán vodorovně vlevo a svisle na střed. Výjimkou je stromový sloupec
- Hlava stromu tabulky s názvem může chybět. Záleží na kontextu použití a designovém rozvržení
- Ikony uzlů jsou stejné jako v komponentě „Strom“.
- Styl písma nadpisu je BigText, styl záhlaví tabulky a hlavního textu je MainText. Styl vybrané položky stromu je MainTextBold.
- Znaky, které se nevejdou do buněk, je nutné skrýt nebo sloupec roztáhnout tak, aby se nápis úplně vešel. Pokud je strom tabulky roztažen tak, že se vizuálně nevejde do viditelné části rozhraní, je nutné zobrazit posuvníky a ponechat velikost tabulky stejnou.
- Text, který se nevejde do nadpisu, musí být oříznut tak, aby byly poslední znaky nápisu skryty pod přechodem.
Přechod začíná od pravého okraje buňky záhlaví.
Šířka přechodu je 20 % šířky titulku, ale ne více než 25 px. Počáteční (pravý) bod přechodu má stejnou barvu jako pozadí tlačítka a jeho průhlednost je 0 %. Koncový bod (vlevo) má také barvu pozadí, avšak neprůhlednost koncového bodu je 100 %.
Šířka stolu závisí na kontextu použití a je omezena maximální šířkou pracovní plochy rozhraní.
4.12.2. Barvy na stromeček
Ohraničení stromové tabulky: ButtonPressed
Dělící tečkované čáry: ButtonBg
Pozadí stromové tabulky: WhiteBg
Pozadí řady č. 1: WhiteBg
Pozadí řádku č. 2: TableString2
Pozadí vybraného řádku: SelectColor
Pozadí vznášející se řady: béžové
Text v záhlaví stromové tabulky: TextColor2
Text v buňkách stromové tabulky: TextColor1
Uzel stromové tabulky (text): TextColor1
Ohraničení ikony uzavřeného uzlu (trojúhelník): TextColor1
Pozadí ikony uzavřeného uzlu (trojúhelník): WhiteBg
Ohraničení ikony otevřeného uzlu (černý trojúhelník): Border2
Pozadí ikony otevřeného uzlu (černý trojúhelník): Černá
4.12.3. Chování komponenty Tree-Table
Klikněte levým tlačítkem myši na buňku tabulky
Kliknutím na LMB vyberete řádek, ve kterém se tato buňka nachází, nebo vyberete buňku samotnou. Pozadí řádku je obarveno barvou SelectColor.
Klikněte pravým tlačítkem na název
Vyvolá rozbalovací nabídku stromové tabulky. Obsah rozbalovací nabídky je určen účelem tabulky a jejími funkcemi.
Klikněte pravým tlačítkem na buňku tabulky
Vyvolá rozevírací nabídku související s řádkem/buňkou stromu tabulky. Obsah rozbalovací nabídky je určen účelem stromové tabulky a jejími funkcemi. Pozadí řádku je obarveno barvou SelectColor.
Stiskněte Enter / F2 / dvakrát klikněte na LMB s vybranou buňkou
Výše uvedené akce převedou tuto buňku tabulky do režimu úprav (pokud lze tabulku upravovat).
Stisknutím klávesy Tab přesunete fokus ve stromové tabulce na první buňku prvního sloupce, pokud není vybrána žádná jiná buňka. Pokud je vybraná konkrétní buňka v tabulce, pak stisknutím klávesy Tab přesunete fokus v tabulce na další buňku v daném řádku. Pokud je fokus stromové tabulky na poslední buňce řádku, pak stisknutím Tab přesunete fokus na první buňku dalšího řádku. Pokud je vybrána poslední buňka ve stromu tabulky, pak stisknutím klávesy Tab přesunete zaměření stromu tabulky na první buňku prvního sloupce stromu tabulky. Pokud byla vybraná buňka v režimu úprav, po stisknutí Tab se automaticky přepne do režimu čtení.
Pohyb po buňkách tabulky pomocí kurzorových tlačítek
Ve stromu tabulky můžete také přesunout fokus pomocí kurzorových tlačítek na klávesnici: “↑” “↓” “←” “→”.
Změna šířky sloupců pomocí přetažení
Ve stromu tabulky můžete změnit šířku sloupce najetím kurzoru myši na okraj sloupce a kliknutím a podržením LMB okraj přesunete. Když je vybrána požadovaná šířka sloupce, jednoduše uvolněte LMB. Obsah v buňkách sloupce neomezuje pohyb jeho ohraničení.
Klikněte levým tlačítkem myši na položku ve stromové tabulce
Řádek, ve kterém se nachází položka stromové tabulky, je obarven barvou SelectColor.
Klikněte levým tlačítkem myši na uzavřený uzel stromu (uzel)
Ikona uzlu je vymalována barvami popsanými v části „12.2 Barvy“ v odstavcích „Hranice ikony otevřeného uzlu (černý trojúhelník)“ a „Pozadí ikony otevřeného uzlu (černý trojúhelník)“. Při načítání obsahu se místo ikony uzlu zobrazí animace načítání.
Klikněte levým tlačítkem na otevřený uzel stromu (uzel)
Ikona uzlu je vymalována barvami popsanými v části „12.2 Barvy“ v odstavcích „Hranice ikony uzavřeného uzlu (bílý trojúhelník)“ a „Pozadí ikony uzavřeného uzlu (bílý trojúhelník)“.
Stisk jiných tlačítek myši/klávesnic by neměl být zpracováván.
| Předch | nahoře | Další |
| 4.11. Posuvník | začátek | 4.13. Paginátor |