1s 8.3 struktūra į verčių lentelę

Norint apskaityti pinigus ir prekes, versle plačiai naudojamos įvairios lentelės. Beveik kiekvienas dokumentas yra lentelė.

Vienoje lentelėje nurodytos prekės, kurias reikia išsiųsti iš sandėlio. Kitoje lentelėje pateikiami įsipareigojimai mokėti už šias prekes.

Todėl 1C darbas su stalais užima svarbią vietą.

1C lentelės taip pat vadinamos „lentelių dalimis“. Juos turi katalogai, dokumentai ir kiti.

Užklausa, kai ji vykdoma, grąžina lentelę, kurią galima pasiekti dviem skirtingais būdais.

Pirmasis – greitesnis – pasirinkimas, iš jo gauti eilutes galima tik eilės tvarka. Antrasis yra užklausos rezultato įkėlimas į verčių lentelę ir atsitiktinė prieiga prie jos.

//1 variantas – nuosekli prieiga prie užklausos rezultatų

//gauti lentelę
Select = Query.Run().Select();
// eilės tvarka einame per visas užklausos rezultato eilutes
Nors Select.Next() Loop
Ataskaita(Pasirinkimas.Vardas);
EndCycle;

//2 variantas – įkėlimas į reikšmių lentelę
Užklausa = New Request("SELECT Vardas IŠ Katalogo. Nomenklatūra");
//gauti lentelę
Lentelė = Query.Run().Iškrauti().
//toliau taip pat galime kartoti visas eilutes
Kiekvienai lentelės ciklo eilutei
Report(String.Name);
EndCycle;
//arba savavališkai pasiekti eilutes
Eilutė = Lentelė.Rasti("Kastuvas", "Vardas");

Svarbi savybė yra ta, kad lentelėje, kuri gaunama iš užklausos rezultato, visi stulpeliai bus griežtai įvesti. Tai reiškia, kad užklausę Pavadinimas iš katalogo Nomenklatūra, gausite String tipo stulpelį, kurio leistinas ilgis yra ne didesnis nei N simbolių.

Lentelė ant formos (storas klientas)

Vartotojas dirba su lentele, kai ji dedama į formą.

Pamokoje ir pamokoje aptarėme pagrindinius darbo su formomis principus

Taigi, padėkite lentelę ant formos. Norėdami tai padaryti, galite nuvilkti lentelę iš valdymo skydelio. Panašiai meniu galite pasirinkti Form/Insert Control.

Duomenys gali būti saugomi konfigūracijoje – tuomet reikia pasirinkti esamą (anksčiau pridėtą) konfigūracijos objekto lentelę, kurios formą redaguojate.

Duomenų ypatybėje spustelėkite mygtuką „...“. Norėdami pamatyti lentelės dalių sąrašą, turite išplėsti objekto šaką.

Kai pasirenkate lentelės dalį, 1C pati pridės stulpelius į formos lentelę. Eilutės, kurias naudotojas įvedė į tokią lentelę, bus automatiškai išsaugomos kartu su žinynu/dokumentu.

Toje pačioje duomenų ypatybėje galite įvesti savavališką pavadinimą ir pasirinkti verčių lentelės tipą.

Tai reiškia, kad pasirinkta savavališka verčių lentelė. Jis automatiškai nepridės stulpelių ir nebus automatiškai išsaugotas, bet su juo galite daryti ką norite.

Dešiniuoju pelės mygtuku spustelėję lentelę galite pridėti stulpelį. Stulpelio ypatybėse galite nurodyti jo pavadinimą (nuorodai 1C kode), formos stulpelio antraštę, ryšį su lentelės dalies atributu (pastaroji - jei pasirinkta ne savavališka lentelė, o lentelės dalis).

Formos lentelės ypatybėse galite nurodyti, ar vartotojas gali pridėti / ištrinti eilutes. Išplėstesnė forma yra žymės langelis Tik peržiūrėti. Šias savybes patogu naudoti tvarkant lenteles, skirtas informacijai rodyti, bet ne redaguoti.

Norėdami valdyti lentelę, formoje turite parodyti komandų skydelį. Pasirinkite meniu elementą Forma/Įterpti valdiklį/Komandų juostą.

Komandų juostos ypatybėse pažymėkite žymės langelį Automatinis pildymas, kad mygtukai skydelyje būtų rodomi automatiškai.

Lentelė formoje (plonas / valdomas klientas)

Tvarkomoje formoje šie veiksmai atrodo šiek tiek kitaip. Jei formoje reikia įdėti lentelės dalį, išplėskite šaką Objektas ir vilkite vieną iš lentelės dalių į kairę. Tai viskas!

Jei reikia įdėti reikšmių lentelę, pridėkite naują formos atributą ir jo savybėse nurodykite tipą – reikšmių lentelė.

Norėdami pridėti stulpelių, dešiniuoju pelės mygtuku spustelėkite šio formos atributo meniu, pasirinkite Pridėti atributo stulpelį.

Tada taip pat vilkite lentelę į kairę.

Kad lentelė turėtų komandų juostą, lentelės ypatybėse pasirinkite reikšmes skyriuje Naudojimas – Komandų juostos padėtis.

Lentelės įkėlimas į Excel

Bet kurią formoje esančią 1C lentelę galima atspausdinti arba įkelti į „Excel“.

Norėdami tai padaryti, dešiniuoju pelės mygtuku spustelėkite tuščią vietą lentelėje ir pasirinkite Sąrašas.

Valdomame (ploname) kliente panašius veiksmus galima atlikti naudojant meniu punktą Visi veiksmai/Rodymo sąrašas.

Sveikiname visus infostarto skaitytojus. Šis straipsnis bus skirtas savavališkos reikšmių lentelės sukūrimui programiškai valdomos programos formoje.

Užduoties ypatybės.

Kiekvienas, kuris programavo įprastoje programoje, dažnai susiduria su užduotimi gauti savavališką verčių lentelę formoje. Savavališka verčių lentelė yra lentelė, kurios stulpelių skaičius ir tipas iš anksto nežinomi. Tai yra, gali būti 3 stulpeliai, o gal 6, o gal 8. Įprastoje programoje viskas paprasta: galite įdėti elementą „Verčių lentelė“ apdorojimo formoje, o tada perkelti sukurtą verčių lentelę ​prie šio elemento programiškai. Tada su paprasta komanda:

Formos elementai.Lentelėslaukas.SukurtiStulpelius();

formoje gaukite paruoštą verčių lentelę. Atrodytų, gali būti paprasčiau.

Visa tai buvo įprastoje programoje. Valdomoje programoje viskas pasikeitė. Sukurti savavališką lentelę nėra taip paprasta. Dabar reikia arba griežtai parametruoti formos verčių lentelę, arba sukurti ją programiškai (apibūdinkite, na, tai iš tikrųjų yra pačios valdomos programos esmė). Tai mes stengsimės padaryti: programiškai sukurti savavališką reikšmių lentelę valdomoje formoje.

Problemos sprendimas.

Pirmas dalykas, kurį turime padaryti, yra nustatyti, kaip lentelė bus rodoma formoje. Svarbiausia, kad apdorojant nereikia kurti jokio formos elemento. Sukursime ją programiškai, kaip ir visą lentelę. Tai yra, lentelė bus aprašyta ir sukurta atidarant formą arba naudojant mygtuką - priklausomai nuo to, kam to reikia.

Lentelė formoje sukuriama aprašant reikšmių lentelę kaip atributą:
SelectionTypeArray = naujas masyvas; Array of SelectionType.Add(Type("Verčių lentelė")); ChoiceTypeDescription = Naujas tipo aprašymas(ChoiceTypeArray); Array of Details = naujas masyvas; Atributų masyvas.Add(New Form Attributes("Tvarkaraščio lentelė", Pasirinkimo tipo aprašymas, "", "TZN")); Dabar turime sukurti programinę verčių lentelę, kurioje būtų duomenys. Jei verčių lentelė gaunama iš užklausos, tada viskas yra daugiau ar mažiau tvarkoje. Jei lentelė kuriama rankiniu būdu, stulpelių, kuriuose bus skaičiai arba datos, reikšmę galima sukurti per „Tipų aprašą“. Esmė ta, kad verčių lentelės stulpeliai turi būti tam tikro tipo. Jei, pavyzdžiui, tikimasi, kad vartotojas šiuose stulpeliuose duomenis užpildys interaktyviai, tada negalima pridėti verčių lentelės stulpelio tiesiog pavadinimu, jis turi turėti tipą. Atminkite – tai labai svarbu, nes... Šiuos tipus perkelsime į formoje esančią lentelę.
Sukuriame lentelę, kurioje yra keli stulpeliai:
CD = NewDateQualifers(DataParts.Time); ArrayKD = naujas masyvas; ArrayCD.Add(Tipas("Data")); DescriptionTypesTime = Naujas aprašymasTypai(ArrayCD,CD); TZ = nauja verčių lentelė;
TK.Columns.Add("Su", AprašymasTypaiLaikas);
TK.Columns.Add("Prieš", AprašymasTypaiLaikas);
TK.Columns.Add("Vardas");
TK.Columns.Add("Pastaba"); // Visas pavadinimas ir pastaba - eilutės Toliau užpildysime savo TK programos lentelę reikalingais duomenimis. Gauname TK lentelę, kurioje yra reikiamos reikšmės ir kuri yra paruošta perkelti į sukurtą formos atributą. Kiekvienam stulpeliui iš TK. Stulpelių ciklas

Atributų masyvas.Add(Naujos formos atributai(Stulpelis.Pavadinimas, Stulpelis.Vertės tipas,"Tvarkaraščio lentelė"));
EndCycle;
ChangeDetails(ArrayDetails);
SelectionFieldsTable = Elements.Add("TZN", Tipas("FormTable"));
SelectionFieldsTable.DataPath = "Tvarkaraščio lentelė";
SelectionFieldTable.Display = TableDisplay.List;

Tai paprastas derinys ir mūsų stalas yra paruoštas.

Kiekvienam stulpeliui iš TK. Stulpelių ciklas

NewElement = Elements.Add(Stulpelis.Pavadinimas, Tipas("Formos laukas"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "Tvarkaraščio lentelė." + Stulpelis.Pavadinimas;
NaujasElementas.Plotis = 10;
EndCycle;

Sąlyginis dizainas, jei reikia, rašome ir rankiniu būdu, komandų meniu – rankiniu būdu. Stalo tvarkyklės taip pat rašomos ranka. Pavyzdžiui, norėdami pridėti įvykių tvarkyklę prie „Pasirinkimo“ lentelės:

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

Šiam įvykiui apdoroti yra nustatyta atskira procedūra procedūros forma:

&OnClient
Procedūra TKNSelect (TK, pasirinkta eilutė, laukas, standartinis apdorojimas)
//tvarkytojas komandos EndProcedure

Atminkite, kad lentelių tvarkyklės suaktyvina klientą, todėl turi turėti kompiliatoriaus rodyklės komandą

&OnClient

Na, paskutinis dalykas, kurį norėjau pridurti, yra tai, kad atlikę visus šiuos veiksmus nepamirškite perduoti baigtos lentelės formos atributui:

ValueВFormAttributes(ToR, "Tvarkaraščio lentelė");

Štai ką mes turime kaip rezultatą:


O štai renginio „Atranka“ tvarkymas:



Pokalbis.

Tikiuosi, kad straipsnis padės tiems 1C programuotojams, kurie programiškai pradeda kurti lenteles formoje.

Galite atsisiųsti apdorojimą, kuris programiškai sukuria verčių lentelę ir rodo ją valdomoje formoje su komentarais, kurie padės sukurti savo lenteles.

Pradedantiesiems pateikiamas nedidelis faktas – paprasti darbo su verčių lentele pavyzdžiai:

1. Sukurkite verčių lentelę

ValueTable = nauja ValueTable;


2. Sukurkite verčių lentelės stulpelius:

ValueTable.Columns.Add("Vardas");
Reikšmių lentelė.Stulpeliai.Pridėti("Pavardė");


3. Pridėkite naujų eilučių naudodami stulpelių pavadinimus:


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


4. Kaip ieškoti vertės verčių lentelėje:
Būtina rasti lentelės eilutę, kurioje yra norima reikšmė.

FoundRow = ValueTable.Find(SearchValue);


5. Tam tikruose reikšmių lentelės stulpeliuose suraskite pirmąjį įvykį

FoundRow = ValueTable.Find(SearchValue, "Tiekėjas, pirkėjas");


6. Jei reikšmių lentelėje reikia rasti visus įvykius:
Mes naudojame paieškos struktūrą.

SearchStructure = Structure("Darbuotojas", SearchValue);
Rastų eilučių masyvas = ValueTable.FindRows(SearchStructure);


Sukurkime paieškos struktūrą, kurios kiekviename elemente kaip raktas bus nurodytas stulpelio pavadinimas, o kaip reikšmė – norima reikšmė šiame stulpelyje. Paieškos struktūrą perduodame kaip parametrą FindLines() metodui. Dėl to gauname lentelės eilutes.
Jei į paieškos struktūrą įtrauksite norimos reikšmės paiešką, pavyzdžiui, taip pat stulpelyje Atsakingas, tai pritaikę FindLines() metodą gausime visas eilutes, kuriose ir Darbuotojas, ir Atsakingas yra lygūs ieškoma vertė.

7. Kaip kartoti reikšmių lentelę atsitiktine tvarka

Kiekvienai esamai eilutei iš verčių lentelės kilpos
Ataskaita(Dabartinė eilė.Pavadinimas);
EndCycle;

Tas pats naudojant indeksus:

SeniorIndex = ValueTable.Quantity() - 1;
Sąskaitai = 0 iki SeniorIndex ciklo
Ataskaita(Lentelės Vertės[Paskyra].Vardas);
EndCycle;


8. Esamos verčių lentelės eilutės ištrynimas

ValueTable.Delete(Trintina eilutė);

pagal indeksą

ValueTable.Delete(0);


9. Esamo verčių lentelės stulpelio ištrynimas

ValueTable.Columns.Delete(StulpelisIštrinta);


pagal indeksą

ValueTable.Columns.Delete(0);

Būtina atsižvelgti į tai, kad ištrynus reikšmių lentelės eilutę (ar stulpelį) „iš vidurio“, eilučių, esančių „po“ ištrynimo, indeksai sumažės vienu.

10. Kaip užpildyti reikšmių lentelę, jei stulpelių pavadinimai yra kintamuosiuose?

NewRow = ValueTable.Add();
NewRow[StulpelioPavadinimas] = Reikšmė;


11. Kaip užpildyti visą verčių lentelės stulpelį norima reikšme?
Stulpelis „Fiskalinės apskaitos vėliavėlė“ verčių lentelės verčių lentelėje turi būti užpildytas reikšme False

Vertybių lentelė. Užpildykite reikšmes (klaidinga, „Fiskalinės apskaitos vėliavėlė“);


Vertybių lentelei naudojame metodą FillValues(). Pirmasis parametras yra reikšmė, kurią reikia užpildyti. Antrasis parametras yra stulpelio, kurį reikia užpildyti, pavadinimas.

12. Kaip galiu užpildyti verčių lentelę „Gavėjų lentelė“ duomenimis iš reikšmių lentelės „SourceTable“?

Jei operacijos metu gavėjų lentelė dar neegzistuoja arba jos ankstesnių stulpelių įrašyti nereikia, galite sukurti ją kaip pilną originalo kopiją

Gavėjų lentelė = Šaltinio lentelė.Copy();


Antras variantas: lentelė ReceiverTable egzistuoja ir būtų gaila prarasti jos stulpelius ir stulpelių duomenų tipų apribojimus. Bet jūs turite užpildyti stulpelių, kurių pavadinimai atitinka šaltinio lentelės pavadinimus, duomenis.

Dalinis duomenų perdavimas stulpeliams su atitinkančiais pavadinimais:

Kiekvienai šaltinių lentelės eilutei iš šaltinių lentelės ciklo
FillPropertyValues(NewRow, SourceTableRow);
Ciklo pabaiga


Kiekvienai šaltinio lentelės eilutei prie priimančios lentelės pridedama nauja eilutė, o reikšmės užpildomos tuose naujos lentelės stulpeliuose, kurių pavadinimai sutampa su šaltinio lentelės stulpelių pavadinimais.

Jei lentelėse nėra stulpelių vienodais pavadinimais, paskirties lentelėje bus tiek eilučių su nulinėmis reikšmėmis, kiek buvo eilučių šaltinio lentelėje.
Jei kai kurių to paties pavadinimo stulpelių duomenų vertės tipas iš šaltinio lentelės nepatenka į paskirties lentelės leidžiamų stulpelių tipų masyvą, tokiuose laukuose gausime tuščias reikšmes.
Panagrinėkime trečiąjį atvejį. To paties pavadinimo stulpelių atveju paskirties lentelės stulpelis turi būti visiškai suderintas su šaltinio lentelės stulpeliu.

Visiškas duomenų kopijavimas stulpeliams su atitinkančiais pavadinimais

Tie patys stulpeliai = naujas masyvas();

Kiekvienam šaltinio lentelės stulpeliui. Stulpelių ciklas
Atitinkantis stulpelis = Lentelės imtuvas.Stulpeliai.Rasti(Stulpelis.Pavadinimas);

Jei atitinka stulpelį<>Neapibrėžta Tada

// Gaukite stulpelio ypatybes.
Pavadinimas = Stulpelis.Pavadinimas;
ValueType = Column.ValueType;
Antraštė = Stulpelis. Antraštė;
Plotis = stulpelis.Plotis;

// Pakeiskite stulpelius paskirties lentelėje.
Indeksas = TableReceiver.Columns.Index(Atitinkantis stulpelis);

TableReceiver.Columns.Delete(Index);
ReceiverTable.Columns.Insert(indeksas, pavadinimas, vertės tipas, antraštė, plotis);

// Į masyvą įtraukite kitą atitinkančių stulpelių pavadinimą.
Tie patys stulpeliai.Pridėti(Stulpelis.Pavadinimas);

endIf;

EndCycle;

// Pereikite per šaltinio lentelės eilutes.
Kiekvienai šaltinių lentelės eilutei iš šaltinių lentelės ciklo

// Pridėkite naują eilutę į paskirties lentelę.
NewRow = TableReceiver.Add();

// Įveskite reikšmes atitinkamuose langeliuose.
Kiekvienam pavadinimo stulpeliai iš to paties pavadinimo stulpelių ciklas
NaujaEilutė[StulpelioPavadinimas] = ŠaltinioLentelė[StulpelioPavadinimas];

EndCycle;

EndCycle;


Paskirties lentelės stulpelį turėsime pakeisti nauju, kurio savybės visiškai atitiks šaltinio lentelės stulpelį.
Todėl, jei gavėjų lentelėje randamas to paties pavadinimo stulpelis, visas naujo stulpelio savybes surenkame kintamaisiais. Tada ištrinkite seną ir sukurkite naują stulpelį. Tada pereiname per šaltinio lentelės eilutes.
Ciklo metu pridedame naują eilutę prie priimančios lentelės ir atidarome kilpą virš stulpelių pavadinimų atitinkamų stulpelių masyve.
Šioje įdėtoje kilpoje paskirties lentelės langelius užpildome šaltinio lentelės langelio duomenimis.

13. Kaip pridėti stulpelius į verčių lentelę „ValueTable“ su tipo apribojimais?

Pridėdami stulpelį galite tiesiog nurodyti jo pavadinimą ir palikti nepaliestą antrąjį metodo Add() parametrą. Šiuo atveju stulpelio duomenų tipas yra savavališkas.

Stulpelio pridėjimas nenurodant duomenų tipo

// Pridėkite stulpelį be tipo apribojimų.
ValueTable.Columns.Add("Objektas");


Galite įvesti antrojo parametro reikšmę. Ten turite perduoti stulpeliui leidžiamo tipo aprašymą. Patį aprašymą galima gauti naudojant konstruktorių, perduodant jam kaip parametrą tipo eilutės pavadinimą (jei tipų yra daug, atskiriant kableliais) arba galiojančių tipų masyvą.

Pridedamas stulpelis, nurodantis duomenų tipą

// Stulpelių duomenų tipų apribojimai:
// Tik katalogo „Santarvės šalys“ elementai.
Table of Values.Columns.Add("Paskyra", Naujas tipų aprašymas("DirectoryLink.Accounts"));


Jei tarp tipų, leidžiamų užpildyti stulpelio duomenis, yra eilutė, galite apriboti jos bitų gylį (ilgį), nurodyti kintamo arba fiksuoto ilgio naudojimą. Visa tai pasiekiama sukuriant objektą naudojant String Qualifiers konstruktorių. Toliau šis objektas bus naudojamas kaip vienas iš TypeDescription konstruktoriaus parametrų.

Kvalifikatorių naudojimas verčių lentelės stulpelio duomenų tipui nurodyti

// Paruoškite ir nustatykite apribojimus String tipo duomenims.
Styginių kvalifikatoriai = Naujos eilutės kvalifikacijos(20, LeidžiamasIlgis.Kintamasis);
ValidTypes = NewTypeDescription("Eilutė", StringQualifers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Panašūs veiksmai gali būti atliekami su skaičiaus ir datos kvalifikatoriais.
Atkreipkite dėmesį: tipo aprašymus konstruktorius gali sudaryti „nuo nulio“ arba gali būti naudojamas esamas tipo aprašymas.

Esamų tipo deklaracijų naudojimas reikšmių lentelės stulpelio duomenų tipui nurodyti

// Anksčiau naudoto tipo aprašymo išplėtimas.
QualifiersNumbers = Nauji kvalifikaciniai skaičiai(10, 2, Galiojantis ženklas. Neneigiamas);
DateQualifers = Naujos datos kvalifikatoriai(Datos dalys.Data);
Išplėstiniai galiojantys tipai = Naujas tipo aprašymas (galiojantys tipai, "skaičius, data", skaičių kvalifikatoriai, datos kvalifikatoriai);

ValueTable.Columns.Add("Pastaba", ExtendedAcceptableTypes);

Yra du specialūs verčių lentelės paieškos metodai:

1. Rasti

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenklatūra.Rasti(TVHorizontas);
//taip pat galime nurodyti, kuriuose stulpeliuose ieškoti, kad paieška būtų greitesnė
FoundString = TZNomenklatūra.Rasti(TVHorizontas, "Nomenklatūra");

Šis metodas grąžina pirmąją rastą eilutę su norima reikšme arba Neapibrėžta, jei jos neranda. Todėl jį patogu naudoti ieškant unikalių vertybių, nes kitu atveju, kai bus rasta reikšmė, turėsite ją pašalinti iš lentelės, kad rastumėte kitą.

Kad išvengtumėte šio vargo, yra šis metodas, leidžiantis rasti atitinkamų eilučių masyvą:

2. FindStrings


Pasirinkimo struktūra.Insert("Nomenklatūra", TVHorizon); // pirmiausia nurodykite stulpelį, kur ieškoti, o tada – ko ieškoti.

Šis metodas visada grąžina masyvą, tačiau jis gali būti tuščias, jei nieko nerandama. Ir šis metodas, kaip ir ankstesnis, grąžina pačias verčių lentelės eilutes, o ne pačias vertes atskirame masyve. Todėl pakeisdami masyvo eilutės reikšmes arba, kaip ir ankstesniame metode, rastoje eilutėje, pakeisite vertę apdorotoje reikšmių lentelėje.

Kitas geras šio metodo dalykas yra tai, kad jis vienu metu gali ieškoti keliuose verčių lentelės stulpeliuose:


SelectionStructure = nauja struktūra;
Pasirinkimo struktūra.Insert("Nomenklatūra", TVHorizon);
Pasirinkimo struktūra.Insert("Kiekis", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Vienintelis neigiamas dalykas, kaip matote, yra tai, kad negalite naudoti kitų palyginimo tipų, išskyrus „lygus“.