1s 8.3 struktura k tabulce hodnot

Za účelem účtování peněz a zboží se v podnikání široce používají různé tabulky. Téměř každý dokument je tabulka.

V jedné tabulce je uvedeno zboží k odeslání ze skladu. Další tabulka uvádí povinnosti platit za toto zboží.

Proto v 1C zaujímá práce s tabulkami přední místo.

Tabulky v 1C se také nazývají „tabulkové části“. Adresáře, dokumenty a další je mají.

Dotaz po provedení vrátí tabulku, ke které lze přistupovat dvěma různými způsoby.

První - rychlejší - výběr, získávání řádků z něj je možné pouze v pořádku. Druhým je nahrání výsledku dotazu do tabulky hodnot a poté k němu náhodný přístup.

//Možnost 1 – sekvenční přístup k výsledkům dotazu

//získejte stůl
Select = Query.Run().Select();
// projdeme postupně všechny řádky výsledku dotazu
Zatímco Select.Next() Loop
Zpráva(Výběr.Název);
EndCycle;

//Možnost 2 – nahrání do tabulky hodnot
Request = New Request("SELECT Name FROM Directory.Nomenclature");
//získejte stůl
Tabulka = Query.Run().Unload().
//dále můžeme také iterovat všechny řádky
Pro každý řádek z cyklu tabulky
Report(String.Name);
EndCycle;
//nebo libovolně přistupovat k řetězcům
Řádek = Stůl.Find("Lopata", "Jméno");

Důležitou vlastností je, že v tabulce, která se získá z výsledku dotazu, budou všechny sloupce striktně zapsány. To znamená, že vyžádáním pole Název z adresáře Nomenclature obdržíte sloupec typu String s povolenou délkou maximálně N znaků.

Tabulka na formuláři (tlustý klient)

Uživatel pracuje s tabulkou při jejím umístění na formulář.

Základní principy práce s formuláři jsme probrali v hodině na a v hodině na

Položme tedy tabulku na formulář. Chcete-li to provést, můžete tabulku přetáhnout z panelu Ovládací prvky. Podobně můžete z nabídky vybrat Form/Insert Control.

Data je možné uložit do konfigurace – pak je potřeba vybrat stávající (dříve přidanou) tabulkovou část konfiguračního objektu, jehož podobu upravujete.

Klikněte na tlačítko "..." ve vlastnosti Data. Chcete-li zobrazit seznam tabulkových částí, musíte rozbalit větev Objekt.

Když vyberete tabulkovou část, 1C sám přidá sloupce do tabulky ve formuláři. Řádky zadané uživatelem do takové tabulky se automaticky uloží spolu s referenční knihou/dokumentem.

Ve stejné vlastnosti Data můžete zadat libovolný název a vybrat typ Tabulka hodnot.

To znamená, že byla vybrána libovolná tabulka hodnot. Nebude automaticky přidávat sloupce, ani se automaticky neukládá, ale můžete si s ním dělat, co chcete.

Kliknutím pravým tlačítkem na tabulku můžete přidat sloupec. Ve vlastnostech sloupce můžete zadat jeho název (pro referenci v kódu 1C), záhlaví sloupce ve formuláři, spojení s atributem tabulkové části (druhé - pokud není vybrána libovolná tabulka, ale tabulková část).

Ve vlastnostech tabulky ve formuláři můžete určit, zda uživatel může přidávat/odstraňovat řádky. Pokročilejším formulářem je zaškrtávací políčko Pouze zobrazení. Tyto vlastnosti je vhodné použít pro organizování tabulek určených pro zobrazování informací, ale ne pro úpravy.

Chcete-li tabulku spravovat, musíte ve formuláři zobrazit panel příkazů. Vyberte položku nabídky Formulář/Vložit ovládací/Příkazový řádek.

Ve vlastnostech panelu příkazů zaškrtněte políčko Automatické vyplňování, aby se tlačítka na panelu zobrazovala automaticky.

Tabulka na formuláři (tenký/spravovaný klient)

Na spravovaném formuláři vypadají tyto akce trochu jinak. Pokud potřebujete umístit tabulkovou část na formulář, rozbalte větev Objekt a přetáhněte jednu z tabulkových částí doleva. To je vše!

Pokud potřebujete umístit tabulku hodnot, přidejte nový atribut formuláře a v jeho vlastnostech určete typ – tabulka hodnot.

Chcete-li přidat sloupce, použijte nabídku pravým tlačítkem myši na tento atribut formuláře, vyberte Přidat sloupec atributu.

Potom také přetáhněte tabulku doleva.

Aby tabulka měla panel příkazů, ve vlastnostech tabulky vyberte hodnoty v části Použití – Umístění panelu příkazů.

Nahrání tabulky do Excelu

Jakoukoli tabulku 1C umístěnou ve formuláři lze vytisknout nebo nahrát do Excelu.

Chcete-li to provést, klepněte pravým tlačítkem myši na prázdné místo v tabulce a vyberte Seznam.

Ve spravovaném (tenkém) klientovi lze podobné akce provádět pomocí položky nabídky Všechny akce/Zobrazit seznam.

Zdravím všechny čtenáře infostartu. Tento článek bude věnován problematice vytváření libovolné tabulky hodnot ve formě spravované aplikace programově.

Vlastnosti úkolu.

Každý, kdo programoval v běžné aplikaci, se často potýkal s úkolem získat na formuláři libovolnou tabulku hodnot. Libovolná tabulka hodnot je tabulka, jejíž počet a typ sloupců není předem znám. To znamená, že tam mohou být 3 sloupce nebo možná 6 nebo možná 8. V normální aplikaci je vše jednoduché: můžete umístit prvek „Tabulka hodnot“ na formulář pro zpracování a poté přenést vytvořenou tabulku hodnot ​k tomuto prvku programově. Poté pomocí jednoduchého příkazu:

Form Elements.TableField.CreateColumns();

získejte ve formuláři hotovou tabulku hodnot. Zdálo by se, že by to mohlo být jednodušší.

To vše bylo v běžné aplikaci. Ve spravované aplikaci se vše změnilo. Vytvořit libovolnou tabulku není tak snadné. Nyní musíte buď pevně parametrizovat tabulku hodnot ve formuláři, nebo ji vytvořit programově (pro popis, ve skutečnosti je to podstata samotné spravované aplikace). To je to, co se pokusíme udělat: programově vytvořit libovolnou tabulku hodnot na řízeném formuláři.

Řešení problému.

První věc, kterou musíme udělat, je určit, jak bude tabulka ve formuláři vypadat. Hlavní věc je, že při zpracování nemusíte vytvářet žádný formulářový prvek. Vytvoříme jej programově, jako celou tabulku. To znamená, že tabulka bude popsána a vytvořena v okamžiku otevření formuláře nebo pomocí tlačítka - podle toho, kdo to potřebuje.

K vytvoření tabulky ve formuláři dochází prostřednictvím popisu tabulky hodnot jako atributu:
SelectionTypeArray = Nové pole; Pole SelectionType.Add(Type("Tabulka hodnot")); ChoiceTypeDescription = New TypeDescription(ChoiceTypeArray); Pole detailů = Nové pole; Array of Attributes.Add(New Form Attributes("Schedule Table", Description of SelectionType, "", "TZN")); Nyní musíme vytvořit programovou tabulku hodnot, která obsahuje data. Pokud je tabulka hodnot získána z dotazu, pak je vše víceméně v pořádku. Pokud je tabulka vytvořena ručně, pak význam sloupců, které budou obsahovat čísla nebo data, lze vytvořit pomocí „Popis typů“. Jde o to, že sloupce v tabulce hodnot musí mít nějaký typ. Pokud se například očekává, že uživatel bude data v těchto sloupcích vyplňovat interaktivně, pak nelze přidat sloupec tabulky hodnot pouze s názvem, musí mít typ. Mějte na paměti - je to velmi důležité, protože... Tyto typy přeneseme do tabulky na formuláři.
Vytvoříme tabulku, která obsahuje několik sloupců:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Nové pole; ArrayCD.Add(Type("Datum")); DescriptionTypesTime = Nový DescriptionTypes(ArrayCD,CD); TZ = Nová tabulka hodnot;
TK.Columns.Add("S", DescriptionTypesTime);
TK.Columns.Add("Před", DescriptionTypesTime);
TK.Columns.Add("Jméno");
TK.Columns.Add("Note"); // Celé jméno a Poznámka - řádky Dále naplníme naši tabulku programu TK potřebnými údaji. Obdržíme tabulku TK, která obsahuje potřebné hodnoty a je připravena k přenosu do vytvořeného atributu formuláře. Pro každý sloupec z cyklu TK

Array of Attributes.Add(New Form Attributes(Column.Name, Column.ValueType,"ScheduleTable"));
EndCycle;
ChangeDetails(ArrayDetails);
SelectionFieldsTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldsTable.DataPath = "ScheduleTable";
SelectionFieldTable.Display = TableDisplay.List;

Toto je jednoduchá kombinace a náš stůl je připraven.

Pro každý sloupec z cyklu TK

NewElement = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "ScheduleTable." + Název sloupce;
NewElement.Width = 10;
EndCycle;

Podmíněný design, pokud jej potřebujeme, napíšeme jej také ručně, příkazové menu - ručně. Ručně jsou psány i stolní manipulátory. Chcete-li například přidat obslužnou rutinu události pro tabulku „Výběr“:

Table of SelectionFields.SetAction("Selection","TZNSelection");

Pro zpracování této události je předepsán samostatný postup ve formě postupu:

&OnClient
Postup TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//příkazy obsluhy EndProcedure

Všimněte si, že obslužné rutiny tabulek se spouštějí na klientovi, a proto musí mít příkaz ukazatele kompilátoru

&OnClient

No, poslední věc, kterou jsem chtěl dodat, je, že po všech těchto krocích nezapomeňte předat hotovou tabulku do atributu formuláře:

ValueВFormAttributes(ToR, "ScheduleTable");

Toto máme jako výsledek:


A zde je zpracování události "Výběr":



Doslov.

Doufám, že článek pomůže těm 1C programátorům, kteří začínají programově vytvářet tabulky na formuláři.

Můžete si stáhnout zpracování, které programově vytvoří tabulku hodnot a zobrazí ji ve spravovatelném formuláři s komentáři, které vám pomohou vytvořit si vlastní tabulky.

Zde je malý fakt pro začátek – jednoduché příklady práce s tabulkou hodnot:

1. Vytvořte tabulku hodnot

ValueTable = Nová tabulka hodnot;


2. Vytvořte sloupce pro tabulku hodnot:

ValueTable.Columns.Add("Name");
Tabulka hodnot.Columns.Add("Příjmení");


3. Přidejte nové řádky pomocí názvů sloupců:


NewLine.Name = "Vasily";
NewLine.LastName = "Pupkin";


4. Jak vyhledat hodnotu v tabulce hodnot:
Je nutné najít řádek tabulky obsahující požadovanou hodnotu.

FoundRow = ValueTable.Find(SearchValue);


5. Najděte první výskyt v určitých sloupcích tabulky hodnot

FoundRow = ValueTable.Find(SearchValue, "Dodavatel, Kupující");


6. Pokud potřebujete najít všechny výskyty v tabulce hodnot:
Používáme vyhledávací strukturu.

SearchStructure = Structure("Zaměstnanec", SearchValue);
Pole FoundRows = ValueTable.FindRows(SearchStructure);


Vytvořme vyhledávací strukturu, jejíž každý prvek bude obsahovat název sloupce jako klíč a požadovanou hodnotu v tomto sloupci jako hodnotu. Strukturu vyhledávání předáme jako parametr metodě FindLines(). V důsledku toho získáme řádky tabulky.
Pokud do vyhledávací struktury přidáte vyhledávání požadované hodnoty, například také ve sloupci Responsible, pak v důsledku aplikace metody FindLines() dostaneme všechny řádky, kde se zaměstnanec i odpovědný rovnají hledaná hodnota.

7. Jak iterovat tabulkou hodnot v náhodném pořadí

Pro každý aktuální řádek z tabulky hodnot smyčka
Report(CurrentRow.Name);
EndCycle;

Totéž pomocí indexů:

SeniorIndex = ValueTable.Quantity() - 1;
Pro účet = 0 do cyklu SeniorIndex
Report(ValueTable[Account].Name);
EndCycle;


8. Odstranění existujícího řádku tabulky hodnot

ValueTable.Delete(Řádek k odstranění);

podle indexu

ValueTable.Delete(0);


9. Odstranění existujícího sloupce tabulky hodnot

ValueTable.Columns.Delete(ColumnDeleted);


podle indexu

ValueTable.Columns.Delete(0);

Je třeba vzít v úvahu, že smazání řádku (nebo sloupce) „ze středu“ tabulky hodnot povede ke snížení o jeden index řádků umístěných „po“ smazaném

10. Jak vyplnit tabulku hodnot, pokud jsou názvy sloupců obsaženy v proměnných?

NewRow = ValueTable.Add();
NewRow[ColumnName] = Hodnota;


11. Jak vyplnit celý sloupec tabulky hodnot požadovanou hodnotou?
Sloupec Fiskální účetní příznak v tabulce hodnot tabulky hodnot musí být vyplněn hodnotou False

Tabulka hodnot Vyplňte hodnoty (False, "Příznak fiskálního účetnictví");


Pro tabulku hodnot používáme metodu FillValues(). První parametr je hodnota, která se má vyplnit. Druhý parametr je název sloupce, který se má vyplnit.

12. Jak naplnit tabulku hodnot „Tabulka přijímačů“ daty z tabulky hodnot „SourceTable“?

Pokud tabulka příjemců v době operace ještě neexistuje nebo její předchozí sloupce není třeba uložit, můžete ji vytvořit jako úplnou kopii originálu

Tabulka příjemců = Zdrojová tabulka.Copy();


Druhá možnost: tabulka ReceiverTable existuje a byla by škoda přijít o její sloupce a omezení na datové typy sloupců. Musíte ale vyplnit údaje pro sloupce, jejichž názvy se shodují s názvy zdrojové tabulky.

Částečný přenos dat pro sloupce s odpovídajícími názvy:

Pro každý řádek SourceTable Z cyklu SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Konec cyklu


Pro každý řádek zdrojové tabulky se do přijímající tabulky přidá nový řádek a hodnoty se vyplní do těch sloupců nové tabulky, jejichž názvy se shodují s názvy sloupců ve zdrojové tabulce.

Pokud tabulky nemají sloupce se stejnými názvy, bude cílová tabulka obsahovat tolik řádků s nulovými hodnotami, kolik bylo řádků ve zdrojové tabulce.
Pokud u některých sloupců stejného jména typ datové hodnoty ze zdrojové tabulky nespadá do pole povolených typů sloupců v cílové tabulce, dostaneme v takových polích prázdné hodnoty.
Podívejme se na třetí případ. V případě stejnojmenných sloupců musí být sloupec cílové tabulky plně v souladu se sloupcem zdrojové tabulky.

Úplné kopírování dat pro sloupce s odpovídajícími názvy

Stejné sloupce = Nové pole();

Pro každý sloupec z cyklu SourceTable.Columns
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Pokud je odpovídající sloupec<>Nedefinováno Potom

// Získání vlastností sloupce.
Name = Column.Name;
ValueType = Column.ValueType;
Hlavička = Column.Header;
Width = Column.Width;

// Nahrazení sloupců v cílové tabulce.
Index = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Index);
ReceiverTable.Columns.Insert(Index, Název, Typ hodnoty, Záhlaví, Šířka);

// Přidejte do pole další název odpovídajících sloupců.
Same Columns.Add(Column.Name);

endIf;

EndCycle;

// Procházet řádky zdrojové tabulky.
Pro každý řádek SourceTable z cyklu SourceTable

// Přidání nového řádku do cílové tabulky.
NewRow = TableReceiver.Add();

// Vyplňte hodnoty do odpovídajících buněk.
Pro každý název sloupce Ze sloupců se stejným názvem Cyklus
NewRow[ColumnName] = SourceTableRow[ColumnName];

EndCycle;

EndCycle;


Sloupec v cílové tabulce budeme muset nahradit novým, jehož vlastnosti budou plně odpovídat sloupci zdrojové tabulky.
Pokud je tedy v tabulce příjemců nalezen sloupec se stejným názvem, shromažďujeme všechny vlastnosti nového sloupce v proměnných. Dále odstraňte starý a vytvořte nový sloupec. Poté procházíme řádky zdrojové tabulky.
Ve smyčce přidáme nový řádek do přijímací tabulky a otevřeme smyčku nad názvy sloupců v poli odpovídajících sloupců.
Uvnitř této vnořené smyčky plníme buňky cílové tabulky daty buňky zdrojové tabulky.

13. Jak přidat sloupce do tabulky hodnot „ValueTable“ s omezením typu?

Při přidávání sloupce můžete jednoduše zadat jeho název a ponechat druhý parametr metody Add() nedotčený. V tomto případě je datový typ sloupce libovolný.

Přidání sloupce bez zadání datového typu

// Přidání sloupce bez omezení typu.
ValueTable.Columns.Add("Object");


Můžete vyplnit hodnotu druhého parametru. Tam musíte předat popis typu povoleného pro sloupec. Samotný popis lze získat pomocí konstruktoru předáním řetězce názvu typu (pokud existuje mnoho typů, oddělených čárkami) nebo pole platných typů jako parametru.

Přidání sloupce označujícího datový typ

// Omezení pro datové typy sloupců:
// Pouze prvky adresáře "Protistrany".
Table of Values.Columns.Add("Účet", Nový popis typů("DirectoryLink.Accounts"));


Pokud mezi typy povolenými pro vyplnění sloupcových dat existuje řetězec, můžete omezit jeho bitovou hloubku (délku), zadat použití proměnné nebo pevné délky. Toho všeho je dosaženo vytvořením objektu pomocí konstruktoru String Qualifiers. Dále bude tento objekt použit jako jeden z parametrů konstruktoru TypeDescription.

Použití kvalifikátorů k určení datového typu sloupce tabulky hodnot

// Příprava a nastavení omezení pro data typu String.
String Qualifiers = New String Qualifiers(20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Podobné akce lze provést s ohledem na kvalifikátory čísla a data.
Poznámka: popisy typů může konstruktér sestavit buď „od začátku“, nebo lze jako základ použít existující popis typu.

Použití existujících deklarací typu k určení datového typu sloupce tabulky hodnot

// Rozšíření dříve používaného popisu typu.
QualifiersNumbers = New QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, "Number, Date", Number Qualifiers, Date Qualifiers);

ValueTable.Columns.Add("Poznámka", ExtendedAcceptableTypes);

Pro vyhledávání v tabulce hodnot existují dvě speciální metody:

1. Najděte

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//můžeme také určit, ve kterých sloupcích se má prohledávat, aby se hledání urychlilo
FoundString = TZNomenclature.Find(TVHorizon, "Nomenklatura");

Tato metoda vrátí první nalezený řádek s požadovanou hodnotou nebo Undefined, pokud ji nenajde. Proto je vhodné jej používat pro hledání jedinečných hodnot, protože jinak, když je nalezena hodnota, budete ji muset odstranit z tabulky, abyste našli další.

Chcete-li se tomuto problému vyhnout, existuje následující metoda, která vám umožní najít pole odpovídajících řetězců:

2. FindStrings


Selection Structure.Insert("Nomenklatura", TVHorizon); // nejprve označte sloupec, kde hledat, a pak co hledat.

Tato metoda vždy vrací pole, ale pokud není nic nalezeno, může být prázdné. A tato metoda, stejně jako ta předchozí, vrací řádky tabulky hodnot samotné, nikoli samotné hodnoty v samostatném poli. Proto změnou hodnot v řetězci pole nebo jako v předchozí metodě pro nalezený řetězec změníte hodnotu ve zpracované tabulce hodnot.

Další dobrá věc na této metodě je, že dokáže prohledávat několik sloupců tabulky hodnot najednou:


SelectionStructure = Nová struktura;
Selection Structure.Insert("Nomenklatura", TVHorizon);
Selection Structure.Insert("Množství", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Jediným negativem, jak vidíte, je, že nemůžete použít jiné typy srovnání než „rovná se“