1s 8.3 štruktúra k tabuľke hodnôt

Na účtovanie peňazí a tovaru sa v podnikaní široko používajú rôzne tabuľky. Takmer každý dokument je tabuľka.

V jednej tabuľke je uvedený tovar na odoslanie zo skladu. V ďalšej tabuľke sú uvedené povinnosti platiť za tento tovar.

Preto v 1C práca s tabuľkami zaujíma popredné miesto.

Tabuľky v 1C sa tiež nazývajú „tabuľkové časti“. Adresáre, dokumenty a iné ich majú.

Dotaz po vykonaní vráti tabuľku, ku ktorej je možné pristupovať dvoma rôznymi spôsobmi.

Prvý - rýchlejší - výber, získavanie riadkov z neho je možné len v poradí. Druhým je nahranie výsledku dotazu do tabuľky hodnôt a následný náhodný prístup k nemu.

//Možnosť 1 – sekvenčný prístup k výsledkom dotazu

//získajte stôl
Select = Query.Run().Select();
// prejdeme postupne všetky riadky výsledku dotazu
Zatiaľ čo Select.Next() Loop
Správa(Výber.Názov);
EndCycle;

//Možnosť 2 – nahrávanie do tabuľky hodnôt
Request = New Request("SELECT Name FROM Directory.Nomenclature");
//získajte stôl
Tabuľka = Query.Run().Unload().
//ďalej môžeme tiež iterovať cez všetky riadky
Pre každý riadok z cyklu tabuľky
Report(String.Name);
EndCycle;
//alebo ľubovoľný prístup k reťazcom
Riadok = Table.Find("Lopata", "Nazov");

Dôležitou vlastnosťou je, že v tabuľke získanej z výsledku dotazu budú všetky stĺpce presne napísané. To znamená, že vyžiadaním poľa Názov z adresára Nomenklatúra získate stĺpec typu String s povolenou dĺžkou najviac N znakov.

Tabuľka vo formulári (hrubý klient)

Používateľ pracuje s tabuľkou, keď je umiestnená na formulári.

Základné princípy práce s formulármi sme rozoberali na hodine a na hodine

Položme teda tabuľku na formulár. Ak to chcete urobiť, potiahnite tabuľku z panela Ovládacie prvky. Podobne môžete z ponuky vybrať položku Form/Insert Control.

Dáta je možné uložiť do konfigurácie – vtedy je potrebné vybrať existujúcu (predtým pridanú) tabuľkovú časť konfiguračného objektu, ktorého formulár upravujete.

Kliknite na tlačidlo "..." vo vlastnosti Data. Aby ste videli zoznam tabuľkových častí, musíte rozbaliť vetvu Object.

Keď vyberiete tabuľkovú časť, 1C sám pridá stĺpce do tabuľky vo formulári. Riadky zadané používateľom do takejto tabuľky sa automaticky uložia spolu s referenčnou knihou/dokumentom.

V rovnakej vlastnosti Data môžete zadať ľubovoľný názov a vybrať typ Tabuľka hodnôt.

To znamená, že bola vybratá ľubovoľná tabuľka hodnôt. Nebude automaticky pridávať stĺpce, ani sa nebude automaticky ukladať, ale môžete si s ním robiť, čo chcete.

Kliknutím pravým tlačidlom myši na tabuľku môžete pridať stĺpec. Vo vlastnostiach stĺpca môžete zadať jeho názov (pre referenciu v kóde 1C), záhlavie stĺpca vo formulári, spojenie s atribútom tabuľkovej časti (druhá - ak nie je vybratá ľubovoľná tabuľka, ale tabuľková časť).

Vo vlastnostiach tabuľky vo formulári môžete určiť, či používateľ môže pridávať/odstraňovať riadky. Pokročilejším formulárom je začiarkavacie políčko View Only. Tieto vlastnosti je vhodné použiť na organizovanie tabuliek určených na zobrazovanie informácií, ale nie na úpravu.

Ak chcete spravovať tabuľku, musíte vo formulári zobraziť panel príkazov. Vyberte položku ponuky Formulár/Vložiť ovládací/Príkazový riadok.

Vo vlastnostiach panela príkazov začiarknite políčko Automatické dopĺňanie, aby sa tlačidlá na paneli zobrazovali automaticky.

Tabuľka vo formulári (tenký/spravovaný klient)

Na spravovanom formulári tieto akcie vyzerajú trochu inak. Ak potrebujete umiestniť tabuľkovú časť do formulára, rozbaľte vetvu Objekt a potiahnite jednu z tabuľkových častí doľava. To je všetko!

Ak potrebujete umiestniť tabuľku hodnôt, pridajte nový atribút formulára a v jeho vlastnostiach uveďte typ – tabuľka hodnôt.

Ak chcete pridať stĺpce, kliknite pravým tlačidlom myši na tento atribút formulára a vyberte Pridať stĺpec atribútu.

Potom tiež potiahnite tabuľku doľava.

Ak chcete, aby tabuľka mala panel príkazov, vo vlastnostiach tabuľky vyberte hodnoty v časti Použitie – Umiestnenie panela príkazov.

Nahrávanie tabuľky do Excelu

Akúkoľvek tabuľku 1C umiestnenú vo formulári je možné vytlačiť alebo nahrať do Excelu.

Ak to chcete urobiť, kliknite pravým tlačidlom myši na prázdne miesto v tabuľke a vyberte položku Zoznam.

V spravovanom (tenkom) klientovi je možné podobné akcie vykonávať pomocou položky ponuky Všetky akcie/Zobraziť zoznam.

Zdravím všetkých čitateľov infostartu. Tento článok bude venovaný problematike vytvárania ľubovoľnej tabuľky hodnôt vo forme spravovanej aplikácie programovo.

Vlastnosti úlohy.

Každý, kto programoval v bežnej aplikácii, často čelil úlohe získať ľubovoľnú tabuľku hodnôt vo formulári. Ľubovoľná tabuľka hodnôt je tabuľka, ktorej počet a typ stĺpcov nie sú vopred známe. To znamená, že tam môžu byť 3 stĺpce alebo možno 6 alebo možno 8. V bežnej aplikácii je všetko jednoduché: do formulára na spracovanie môžete umiestniť prvok „Tabuľka hodnôt“ a potom preniesť vytvorenú tabuľku hodnôt ​k tomuto prvku programovo. Potom pomocou jednoduchého príkazu:

Form Elements.TableField.CreateColumns();

získajte pripravenú tabuľku hodnôt vo formulári. Zdalo by sa, že by to mohlo byť jednoduchšie.

To všetko bolo v bežnej aplikácii. V spravovanej aplikácii sa všetko zmenilo. Nie je také ľahké vytvoriť ľubovoľnú tabuľku. Teraz musíte buď pevne parametrizovať tabuľku hodnôt vo formulári, alebo ju vytvoriť programovo (popíšte, no, toto je v skutočnosti podstatou samotnej spravovanej aplikácie). Toto sa pokúsime urobiť: programovo vytvorte ľubovoľnú tabuľku hodnôt v riadenom formulári.

Riešenie problému.

Prvá vec, ktorú musíme urobiť, je určiť, ako sa tabuľka zobrazí vo formulári. Hlavná vec je, že pri spracovaní nemusíte vytvárať žiadne prvky formulára. Vytvoríme ho programovo, ako celú tabuľku. To znamená, že tabuľka bude popísaná a vytvorená v momente otvorenia formulára alebo pomocou tlačidla - podľa toho, kto to potrebuje.

K vytvoreniu tabuľky vo formulári dochádza prostredníctvom popisu tabuľky hodnôt ako atribútu:
SelectionTypeArray = Nové pole; Pole SelectionType.Add(Type("Tabuľka hodnôt")); ChoiceTypeDescription = New TypeDescription(ChoiceTypeArray); Pole detailov = Nové pole; Array of Attributes.Add(New Form Attributes("Schedule Table", Description of SelectionType, "", "TZN")); Teraz musíme vytvoriť programovú tabuľku hodnôt, ktorá obsahuje údaje. Ak sa tabuľka hodnôt získa z dotazu, potom je všetko viac-menej v poriadku. Ak je tabuľka vytvorená ručne, význam stĺpcov, ktoré budú obsahovať čísla alebo dátumy, možno vytvoriť pomocou „Popis typov“. Ide o to, že stĺpce v tabuľke hodnôt musia mať nejaký typ. Ak sa napríklad očakáva, že používateľ vyplní údaje v týchto stĺpcoch interaktívne, potom nemôžete pridať stĺpec tabuľky hodnôt jednoducho s názvom, musí mať typ. Majte na pamäti - je to veľmi dôležité, pretože... Tieto druhy prenesieme do tabuľky na formulári.
Vytvoríme tabuľku, ktorá obsahuje niekoľko stĺpcov:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Nové pole; ArrayCD.Add(Type("Dátum")); DescriptionTypesTime = New DescriptionTypes(ArrayCD,CD); TZ = New ValueTable;
TK.Columns.Add("S", DescriptionTypesTime);
TK.Columns.Add("Pred", DescriptionTypesTime);
TK.Columns.Add("Názov");
TK.Columns.Add("Note"); // Celé meno a Poznámka - riadky Ďalej naplníme našu tabuľku programu TK potrebnými údajmi. Dostávame tabuľku TK, ktorá obsahuje potrebné hodnoty a je pripravená na prenos do vytvoreného atribútu formulára. Pre každý stĺpec 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á kombinácia a náš stôl je pripravený.

Pre každý stĺpec z cyklu TK

NewElement = Elements.Add(Názov stĺpca, Typ("Pole formulára"), Tabuľka poľa výberu);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "ScheduleTable." + Názov stĺpca;
NewElement.Width = 10;
EndCycle;

Podmienený dizajn, ak ho potrebujeme, napíšeme ho aj ručne, príkazové menu - ručne. Stolové manipulátory sú tiež písané ručne. Ak chcete napríklad pridať obsluhu udalosti pre tabuľku „Výber“:

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

Na spracovanie tejto udalosti je predpísaný samostatný postup vo forme postupu:

&OnClient
Procedúra TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//príkazy obsluhy EndProcedure

Všimnite si, že obslužné nástroje tabuliek sa spúšťajú na klientovi, a preto musia mať príkaz ukazovateľa kompilátora

&OnClient

Posledná vec, ktorú som chcel dodať, je, že po všetkých týchto krokoch nezabudnite odovzdať hotovú tabuľku do atribútu formulára:

ValueВFormAttributes(ToR, "ScheduleTable");

Výsledkom je toto:


A tu je spracovanie udalosti „Výber“:



Doslov.

Dúfam, že článok pomôže tým 1C programátorom, ktorí začínajú programovo vytvárať tabuľky na formulári.

Môžete si stiahnuť spracovanie, ktoré programovo vytvorí tabuľku hodnôt a zobrazí ju na spravovateľnom formulári s komentármi, ktoré vám pomôžu vytvoriť si vlastné tabuľky.

Tu je malý fakt na začiatok – jednoduché príklady práce s tabuľkou hodnôt:

1. Vytvorte tabuľku hodnôt

Tabuľka hodnôt = Nová tabuľka hodnôt;


2. Vytvorte stĺpce pre tabuľku hodnôt:

ValueTable.Columns.Add("Name");
Tabuľka hodnôt.Columns.Add("Priezvisko");


3. Pridajte nové riadky pomocou názvov stĺpcov:


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


4. Ako vyhľadať hodnotu v tabuľke hodnôt:
Je potrebné nájsť riadok tabuľky obsahujúci požadovanú hodnotu.

FoundRow = ValueTable.Find(SearchValue);


5. Nájdite prvý výskyt v určitých stĺpcoch tabuľky hodnôt

FoundRow = ValueTable.Find(SearchValue, "Dodávateľ, Kupujúci");


6. Ak potrebujete nájsť všetky výskyty v tabuľke hodnôt:
Používame štruktúru vyhľadávania.

SearchStructure = Structure("Zamestnanec", SearchValue);
Pole FoundRows = ValueTable.FindRows(SearchStructure);


Vytvorme štruktúru vyhľadávania, ktorej každý prvok bude obsahovať názov stĺpca ako kľúč a požadovanú hodnotu v tomto stĺpci ako hodnotu. Vyhľadávaciu štruktúru odovzdáme ako parameter metóde FindLines(). V dôsledku toho dostaneme riadky tabuľky.
Ak do vyhľadávacej štruktúry pridáte vyhľadávanie požadovanej hodnoty, napríklad aj v stĺpci Zodpovedný, potom v dôsledku aplikácie metódy FindLines() dostaneme všetky riadky, v ktorých sa Zamestnanec aj Zodpovedný rovnajú hľadanú hodnotu.

7. Ako iterovať cez tabuľku hodnôt v náhodnom poradí

Pre každý aktuálny riadok z tabuľky hodnôt slučka
Report(CurrentRow.Name);
EndCycle;

To isté pomocou indexov:

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


8. Odstránenie existujúceho riadka tabuľky hodnôt

ValueTable.Delete(Riadok na vymazanie);

podľa indexu

ValueTable.Delete(0);


9. Odstránenie existujúceho stĺpca tabuľky hodnôt

ValueTable.Columns.Delete(ColumnDeleted);


podľa indexu

ValueTable.Columns.Delete(0);

Je potrebné vziať do úvahy, že vymazanie riadku (alebo stĺpca) „zo stredu“ tabuľky hodnôt povedie k zníženiu o jeden index riadkov umiestnených „po“ vymazanom

10. Ako vyplniť tabuľku hodnôt, ak sú názvy stĺpcov obsiahnuté v premenných?

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


11. Ako vyplniť celý stĺpec tabuľky hodnôt požadovanou hodnotou?
Stĺpec Príznak fiškálneho účtovníctva v tabuľke hodnôt tabuľky hodnôt musí byť vyplnený hodnotou False

Tabuľka hodnôt Vyplňte hodnoty (nepravda, "Príznak fiškálneho účtovníctva");


Pre tabuľku hodnôt používame metódu FillValues(). Prvým parametrom je hodnota, ktorá sa má vyplniť. Druhý parameter je názov stĺpca, ktorý sa má vyplniť.

12. Ako vyplniť tabuľku hodnôt “Receiver Table” údajmi z tabuľky hodnôt “SourceTable”?

Ak tabuľka príjemcov v čase operácie ešte neexistuje alebo jej predchádzajúce stĺpce nie je potrebné uložiť, môžete ju vytvoriť ako úplnú kópiu originálu

Tabuľka príjemcov = Zdrojová tabuľka.Kopírovať();


Druhá možnosť: tabuľka ReceiverTable existuje a bola by škoda stratiť jej stĺpce a obmedzenia na dátové typy stĺpcov. Musíte však vyplniť údaje pre stĺpce, ktorých názvy sa zhodujú s názvami zdrojovej tabuľky.

Čiastočný prenos údajov pre stĺpce so zodpovedajúcimi názvami:

Pre každý riadok SourceTable Z cyklu SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Koniec cyklu


Pre každý riadok zdrojovej tabuľky sa do prijímacej tabuľky pridá nový riadok a hodnoty sa vyplnia do tých stĺpcov novej tabuľky, ktorých názvy sa zhodujú s názvami stĺpcov v zdrojovej tabuľke.

Ak tabuľky nemajú stĺpce s rovnakými názvami, cieľová tabuľka bude obsahovať toľko riadkov s nulovými hodnotami, koľko bolo riadkov v zdrojovej tabuľke.
Ak pre niektoré stĺpce s rovnakým názvom typ údajovej hodnoty zo zdrojovej tabuľky nespadá do poľa povolených typov stĺpcov v cieľovej tabuľke, dostaneme v takýchto poliach prázdne hodnoty.
Uvažujme o treťom prípade. V prípade stĺpcov s rovnakým názvom musí byť stĺpec cieľovej tabuľky úplne v súlade so stĺpcom zdrojovej tabuľky.

Úplné kopírovanie údajov pre stĺpce so zodpovedajúcimi názvami

Rovnaké stĺpce = Nové pole();

Pre každý stĺpec z cyklu SourceTable.Columns
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Ak Zhodný stĺpec<>Nedefinované Potom

// Získanie vlastností stĺpca.
Name = Column.Name;
ValueType = Column.ValueType;
Hlavička = Column.Header;
Width = Column.Width;

// Nahradenie stĺpcov v cieľovej tabuľke.
Index = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Index);
ReceiverTable.Columns.Insert(Index, Názov, Typ hodnoty, Hlavička, Šírka);

// Pridajte do poľa ďalší názov zodpovedajúcich stĺpcov.
Same Columns.Add(Column.Name);

koniec Ak;

EndCycle;

// Cyklicky prechádzajte medzi riadkami zdrojovej tabuľky.
Pre každý riadok SourceTable z cyklu SourceTable

// Pridajte nový riadok do cieľovej tabuľky.
NewRow = TableReceiver.Add();

// Vyplňte hodnoty do zodpovedajúcich buniek.
Pre každý názov stĺpce Zo stĺpcov s rovnakým názvom Cyklus
NewRow[ColumnName] = SourceTableRow[ColumnName];

EndCycle;

EndCycle;


Stĺpec v cieľovej tabuľke budeme musieť nahradiť novým, ktorého vlastnosti sa budú plne zhodovať so stĺpcom zdrojovej tabuľky.
Ak sa teda v tabuľke príjemcov nájde stĺpec s rovnakým názvom, zhromažďujeme všetky vlastnosti nového stĺpca v premenných. Potom odstráňte starý a vytvorte nový stĺpec. Potom prechádzame cez riadky zdrojovej tabuľky.
V slučke pridáme nový riadok do prijímacej tabuľky a otvoríme slučku nad názvami stĺpcov v poli zodpovedajúcich stĺpcov.
Vo vnútri tejto vnorenej slučky naplníme bunky cieľovej tabuľky údajmi bunky zdroja tabuľky.

13. Ako pridať stĺpce do tabuľky hodnôt „ValueTable“ s obmedzeniami typu?

Pri pridávaní stĺpca môžete jednoducho zadať jeho názov a ponechať druhý parameter metódy Add() nedotknutý. V tomto prípade je typ údajov stĺpca ľubovoľný.

Pridanie stĺpca bez zadania typu údajov

// Pridať stĺpec bez obmedzenia typu.
ValueTable.Columns.Add("Object");


Môžete vyplniť hodnotu druhého parametra. Tam musíte zadať popis typu povoleného pre stĺpec. Samotný popis je možné získať pomocou konštruktora zadaním reťazca názvu typu (ak existuje veľa typov, oddelených čiarkami) alebo poľa platných typov ako parametra.

Pridanie stĺpca označujúceho typ údajov

// Obmedzenia typov údajov stĺpcov:
// Iba prvky adresára "Protistrany".
Table of Values.Columns.Add("Account", New Description of Types("DirectoryLink.Accounts"));


Ak medzi typmi povolenými na vyplnenie údajov stĺpca existuje reťazec, môžete obmedziť jeho bitovú hĺbku (dĺžku), zadať použitie premennej alebo pevnej dĺžky. To všetko sa dosiahne vytvorením objektu pomocou konštruktora String Qualifiers. Ďalej sa tento objekt použije ako jeden z parametrov konštruktora TypeDescription.

Použitie kvalifikátorov na určenie typu údajov stĺpca tabuľky hodnôt

// Príprava a nastavenie obmedzení pre údaje typu String.
String Qualifiers = New String Qualifiers(20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Podobné akcie možno vykonať s ohľadom na kvalifikátory čísla a dátumu.
Poznámka: popisy typov môže zostaviť konštruktér buď „od začiatku“, alebo sa ako základ môže použiť existujúci popis typu.

Použitie existujúcich deklarácií typu na určenie typu údajov stĺpca tabuľky hodnôt

// Rozšírenie predtým používaného popisu typu.
QualifiersNumbers = New QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, "Číslo, Dátum", Kvalifikátory čísel, Kvalifikátory dátumu);

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

Existujú dva špeciálne spôsoby vyhľadávania v tabuľke hodnôt:

1. Nájdite

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//môžeme tiež určiť, v ktorých stĺpcoch sa má vyhľadávať, aby sa vyhľadávanie urýchlilo
FoundString = TZNomenclature.Find(TVHorizon, "Nomenklatúra");

Táto metóda vráti prvý nájdený riadok s požadovanou hodnotou alebo Nedefinovaný, ak ho nenájde. Preto je vhodné ho použiť na vyhľadávanie jedinečných hodnôt, pretože v opačnom prípade, keď sa nájde hodnota, budete ju musieť odstrániť z tabuľky, aby ste našli ďalšiu.

Aby ste sa vyhli týmto problémom, existuje nasledujúca metóda, ktorá vám umožní nájsť pole zodpovedajúcich reťazcov:

2. FindStrings


Selection Structure.Insert("Nomenklatúra", TVHorizon); // najprv uveďte stĺpec, kde hľadať, a potom čo hľadať.

Táto metóda vždy vráti pole, ale ak sa nič nenájde, môže byť prázdne. A táto metóda, rovnako ako predchádzajúca, vracia riadky tabuľky hodnôt samotné, a nie samotné hodnoty v samostatnom poli. Preto zmenou hodnôt v reťazci poľa alebo, ako v predchádzajúcej metóde, pre nájdený reťazec, zmeníte hodnotu v spracovanej tabuľke hodnôt.

Ďalšou dobrou vecou tejto metódy je, že dokáže prehľadávať niekoľko stĺpcov tabuľky hodnôt naraz:


SelectionStructure = Nová štruktúra;
Selection Structure.Insert("Nomenklatúra", TVHorizon);
Selection Structure.Insert("Množstvo", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Jediným negatívom, ako vidíte, je, že nemôžete použiť iné typy porovnávania ako „rovná sa“