1s 8 introduceți un rând în tabelul de valori. Ce metode există și cum să căutați mai multe valori simultan

Pentru a contabiliza bani și bunuri, în afaceri sunt utilizate pe scară largă diverse tabele. Aproape fiecare document este un tabel.

Un tabel listează mărfurile care urmează să fie expediate din depozit. Un alt tabel arată obligațiile de plată pentru aceste bunuri.

Prin urmare, în 1C, lucrul cu tabele ocupă un loc proeminent.

Tabelele din 1C mai sunt numite și „părți tabulare”. Directoarele, documentele și altele le au.

Interogarea, atunci când este executată, returnează un tabel care poate fi accesat în două moduri diferite.

Prima - mai rapidă - selecție, obținerea de rânduri din ea este posibilă numai în ordine. Al doilea este încărcarea rezultatului interogării într-un tabel de valori și apoi accesul aleatoriu la acesta.

//Opțiunea 1 – acces secvenţial la rezultatele interogării

//obține masa
Selectare = Query.Run().Select();
// parcurgem toate liniile rezultatului interogării în ordine
While Select.Next() Loop
Raport (Selectie.Nume);
EndCycle;

//Opțiunea 2 – încărcarea într-un tabel de valori
Solicitare = New Request("SELECT Name FROM Directory.Nomenclature");
//obține masa
Tabel = Query.Run().Unload().
//mai departe putem, de asemenea, itera prin toate liniile
Pentru fiecare rând din ciclul de masă
Raport (String.Nume);
EndCycle;
//sau accesează în mod arbitrar șiruri de caractere
Row = Table.Find("Lopata", "Nume");

O caracteristică importantă este că în tabelul care se obține din rezultatul interogării, toate coloanele vor fi strict tastate. Aceasta înseamnă că prin solicitarea câmpului Nume din directorul Nomenclatură, veți primi o coloană de tip String cu o lungime admisă de cel mult N caractere.

Tabel de pe formular (client gros)

Utilizatorul lucrează cu tabelul atunci când acesta este plasat pe formular.

Am discutat despre principiile de bază ale lucrului cu forme în lecția despre și în lecția despre

Deci, să așezăm tabelul pe formular. Pentru a face acest lucru, puteți trage tabelul din panoul Controale. În mod similar, puteți selecta Form/Insert Control din meniu.

Datele pot fi stocate în configurație - apoi trebuie să selectați partea tabelară existentă (adăugată anterior) a obiectului de configurare a cărui formă o editați.

Faceți clic pe butonul „...” din proprietatea Date. Pentru a vedea lista de părți tabulare, trebuie să extindeți ramura Object.

Când selectați partea tabelară, 1C însuși va adăuga coloane la tabelul din formular. Rândurile introduse de utilizator într-un astfel de tabel vor fi salvate automat împreună cu cartea/documentul de referință.

În aceeași proprietate Data, puteți introduce un nume arbitrar și puteți selecta tipul Value Table.

Aceasta înseamnă că a fost selectat un tabel arbitrar de valori. Nu va adăuga automat coloane și nici nu va fi salvat automat, dar puteți face ce doriți cu el.

Făcând clic dreapta pe tabel, puteți adăuga o coloană. În proprietățile unei coloane, puteți specifica numele acesteia (pentru referință în codul 1C), antetul coloanei de pe formular, conexiunea cu atributul părții tabelare (acesta din urmă - dacă nu este selectat un tabel arbitrar, ci un partea tabulară).

În proprietățile tabelului din formular, puteți specifica dacă utilizatorul poate adăuga/șterge rânduri. Un formular mai avansat este caseta de selectare Numai vizualizare. Aceste proprietăți sunt convenabile de utilizat pentru organizarea tabelelor destinate afișării informațiilor, dar nu pentru editare.

Pentru a gestiona tabelul, trebuie să afișați un panou de comandă în formular. Selectați elementul de meniu Form/Insert Control/Command Bar.

În proprietățile barei de comandă, bifați caseta de selectare Completare automată, astfel încât butoanele de pe panou să apară automat.

Tabel pe formular (client subțire/gestionat)

Într-un formular gestionat, aceste acțiuni arată puțin diferit. Dacă trebuie să plasați o parte tabelară pe formular, extindeți ramura Obiect și trageți una dintre părțile tabulare spre stânga. Asta e tot!

Dacă trebuie să plasați un tabel de valori, adăugați un nou atribut de formular și în proprietățile acestuia specificați tipul – tabel de valori.

Pentru a adăuga coloane, utilizați meniul de clic dreapta pe acest atribut de formular, selectați Adăugare coloană atribut.

Apoi trageți și tabelul spre stânga.

Pentru ca un tabel să aibă o bară de comandă, în proprietățile tabelului, selectați valorile din secțiunea Utilizare – Poziția barei de comandă.

Încărcarea unui tabel în Excel

Orice tabel 1C situat pe formular poate fi tipărit sau încărcat în Excel.

Pentru a face acest lucru, faceți clic dreapta pe un spațiu gol din tabel și selectați Listă.

Într-un client gestionat (subțire), acțiuni similare pot fi efectuate folosind elementul de meniu Toate acțiunile/Afișare listă.

Căutați în tabelul cu valorile 1C

Ce metode există și cum să căutați mai multe valori simultan.

Există două metode speciale pentru căutarea unui tabel de valori:

1. Găsiți

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//Putem specifica, de asemenea, în ce coloane să căutăm pentru a accelera căutarea
FoundString = TZNomenclature.Find(TVHorizon, „Nomenclatură”);

Această metodă returnează primul rând găsit cu valoarea dorită sau Nedefinit dacă nu îl găsește. Prin urmare, este convenabil să-l folosiți pentru a căuta valori unice, deoarece în caz contrar, când se găsește o valoare, va trebui să o eliminați din tabel pentru a găsi următoarea.

Pentru a evita această problemă, există următoarea metodă care vă permite să găsiți o serie de șiruri de caractere potrivite:

2. FindStrings


Selection Structure.Insert("Nomenclatura", TVHorizon); // mai întâi indică coloana unde să cauți, apoi ce să cauți.

Această metodă returnează întotdeauna o matrice, dar poate fi goală dacă nu se găsește nimic. Și această metodă, ca și cea anterioară, returnează rândurile tabelului de valori înseși, și nu valorile înseși într-o matrice separată. Prin urmare, prin modificarea valorilor din șirul matricei sau, ca în metoda anterioară, pentru șirul găsit, veți modifica valoarea din tabelul de valori procesat.

Un alt lucru bun despre această metodă este că poate căuta simultan prin mai multe coloane ale tabelului de valori:


SelectionStructure = Structură nouă;
Selection Structure.Insert("Nomenclatura", TVHorizon);
Selection Structure.Insert("Cantitate", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Singurul negativ, după cum puteți vedea, este că nu puteți utiliza alte tipuri de comparații, altele decât „egal”

Un tabel de valori este un obiect universal specific conceput pentru a stoca date într-o reprezentare tabelară. Diferența cheie dintre un tabel și obiectele aplicației este lipsa legării la tabelele fizice ale bazei de date. Tabelul de valori există doar în RAM, care, pe de o parte, oferă oportunități unice, iar pe de altă parte, impune anumite restricții. Cu toate acestea, posibilitățile de interacțiune cu tabelul sunt comparabile cu interacțiunea cu obiectele care există efectiv în baza de date.

Din punct de vedere istoric, tabelul de valori din 1C are un dublu scop, fiind un analog virtual al tabelelor existente, dar în același timp este și un element de control. Odată cu trecerea la o aplicație gestionată, o mare parte din această funcționalitate a fost depreciată, dar acum poate fi și un element de interfață cu utilizatorul, dar cu unele limitări semnificative.

Structura unui tabel de valori ca obiect

Proprietățile unui tabel de valori sunt determinate de combinații a două colecții predefinite: coloanele și rândurile sale.

Tabelul de valori Coloane

O coloană a unui tabel de valori este proprietatea sa definitorie. Este setul de coloane din tabel care determină structura acestuia. Coloanele corespund câmpurilor tabelelor fizice sau coloanelor familiare din interfața de utilizator a unei secțiuni tabelare sau a unui jurnal de documente. O coloană poate avea un nume intern, un tip de valoare și un titlu care este afișat atunci când lucrează interactiv cu tabelul.

Deoarece coloanele sunt o colecție de obiecte, puteți adăuga, șterge și edita coloane.

Rând tabel de valori

Din perspectiva interfeței software, șirurile sunt o colecție separată încorporată într-un tabel de valori. Ele sunt analoge cu înregistrările din tabelele fizice, adică rândurile familiare utilizatorului într-o secțiune tabelară sau jurnal de documente. Fiecare rând individual este un obiect cu un set de proprietăți denumite, ale căror nume corespund cu numele coloanelor din tabel.

Astfel, interacțiunea cu un șir este foarte asemănătoare cu interacțiunea cu alte obiecte. Puteți citi și scrie proprietățile acestuia, inclusiv folosind funcția predefinită „FillPropertyValues()”. Deoarece rândurile sunt colecția principală a tabelului de valori, metoda „Clear()” este folosită pentru a șterge toate rândurile din tabel.

Creați un tabel de valori

Există multe modalități de a obține un tabel de valori gata de utilizare. Să ne uităm la unele dintre ele. Fiecare exemplu va fi furnizat ca liste de coduri cu comentarii.

Crearea unui tabel folosind constructorul

Metoda principală care vă permite să creați exact tabelul de care are nevoie dezvoltatorul este, din păcate, cea mai laborioasă, deoarece necesită specificarea manuală a tuturor proprietăților necesare tabelului.

DemoTable = New ValueTable; // În primul rând, inițializam TK-ul // În continuare, determinăm parametrii necesari pentru coloanele noi și îi adăugăm în colecție // Crearea coloanei „Nomenclatură” Nume = „Nomenclatură”; ValueType = New TypeDescription("DirectoryLink.Nomenclature"); Titlu = „Nomenclatură (produs)”; DemoTable.Columns.Add(Nume, ValueType, Header); // Crearea coloanei „Cantitate” Nume = „Cantitate”; ValueType = New TypeDescription(„Număr”); DemoTable.Columns.Add(Nume, ValueType); // Ca urmare a acestor manipulări, am creat un tabel gol cu ​​coloane tastate // Dacă trebuie să utilizați o tastare mai precisă a tipurilor primitive, atunci ar trebui să utilizați sintaxa extinsă a constructorului „Descrierea tipurilor”

Crearea unui tabel prin copiere

Dacă aveți la îndemână o referință cu o structură și/sau o compoziție adecvată, puteți copia sau descărca tabelul de referință cu valori. Dacă tabelul de referință este un alt tabel, atunci trebuie să utilizați metoda „Copiați tabelele de referință”. Dacă aveți de-a face cu o parte tabelară sau un set de înregistrări de registru, trebuie să utilizați metoda „Descărcați tabelul de valori”. Dacă aveți nevoie doar de structură, puteți utiliza metoda „Copy Columns”.

// Opțiune cu copierea tuturor rândurilor din standardul de specificații tehnice dar păstrând doar cele două coloane specificate Coloanele Standardului = "Nomenclatură, Cantitate"; DemoTable = TableEtalon.Copy(, ColumnsEtalon); // Opțiune cu copierea rândurilor preselectate din standardul de specificații tehnice, păstrând în același timp cele două coloane specificate.Rândurile standardului = SelectIntoArrayThe Rows We Need From the Table of the Standard(); ColumnsStandard = "Nomenclatură, Cantitate"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon); // Opțiunea de copiere a rândurilor din standardul de specificații tehnice folosind filtrul specificat, păstrând o coloană „Nomenclatură” // Vor fi selectate toate rândurile în care valoarea din coloana Cantitate este 0, doar coloana Nomenclatură Row Selection = New Structure(" Cantitatea" va apărea în tabelul rezultat , 0); ColumnsStandard = "Nomenclatură"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon); // Opțiune cu o copie completă a tabelului și ștergerea ulterioară a unui rând cu valoarea câmpului cantității egală cu zero și ștergerea întregii coloane „Cantitate” Row Selection = New Structure(„Cantitate”, 0); ColumnsStandard = "Nomenclatură"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon); TableRow = DemoTable.Find(0, "Cantitate"); DemoTable.Delete(TableRow); DemoTable.Columns.Delete("Cantitate"); // Opțiuni similare și modificările acestora pot fi aplicate părților tabelare și seturilor de înregistrări de registru

Crearea unui tabel cu o interogare

Dacă un șablon al tabelului de care aveți nevoie există în baza de date, atunci puteți utiliza o interogare pentru a crea rapid un tabel cu structura dorită.

// Un exemplu de creare a unui tabel gol pe baza structurii registrului de acumulare // Este ușor de ghicit că în acest fel puteți obține și un tabel umplut Query = New Query("SELECT FIRST 0 * From Accumulation Register. Produse in depozit"); RequestResult = Request.Execute(); DemoTable = Query Result.Unload(); // Un exemplu de creare a unui tabel gol folosind tipuri și nume de câmp specificate explicit Interogare = Interogare nouă; Query.Text = "SELECT TOP 0 | Value(Directory.Nomenclature.EmptyLink) AS Nomenclature, | EXPRESS(0 AS NUMBER(15, 3)) AS Cantitate"; RequestResult = Request.Execute(); DemoTable = Query Result.Unload(); // IMPORTANT! Nu uitați că tipurile de valori ale coloanei obținute dintr-o solicitare conțin întotdeauna tipul Null // Astfel, TK-ul creat de cerere are întotdeauna tipuri de coloane compuse

Concluzie

În acest scurt articol, am analizat proprietățile de bază și tehnicile practice pentru crearea unui tabel de valori, suficient pentru înțelegere și începerea utilizării. Obiectul tabel de valori în sine este atât de multifațetat încât o descriere detaliată a capacităților sale necesită scrierea unui articol separat despre tehnici și metode de lucru.

Iată un mic fapt pentru început - exemple simple de lucru cu un tabel de valori:

1. Creați un tabel de valori

ValueTable = Nou ValueTable;


2. Creați coloane pentru tabelul de valori:

ValueTable.Columns.Add(„Nume”);
Value Table.Columns.Add("Nume");


3. Adăugați rânduri noi folosind numele coloanelor:


NewLine.Name = "Vasily";
NewLine.LastName = „Cătecel”;


4. Cum să căutați o valoare în tabelul de valori:
Este necesar să găsiți un rând de tabel care să conțină valoarea dorită.

FoundRow = ValueTable.Find(SearchValue);


5. Găsiți prima apariție în anumite coloane ale tabelului de valori

FoundRow = ValueTable.Find(SearchValue, „Furnizor, Cumpărător”);


6. Dacă trebuie să găsiți toate aparițiile în tabelul de valori:
Folosim structura de căutare.

SearchStructure = Structure ("Angajat", SearchValue);
Array of FoundRows = ValueTable.FindRows(SearchStructure);


Să creăm o structură de căutare, fiecare element al căruia va conține numele coloanei ca cheie și valoarea dorită în această coloană ca valoare. Trecem Structura de căutare ca parametru la metoda FindLines(). Ca rezultat, obținem rânduri de tabel.
Dacă adăugați o căutare pentru valoarea dorită în structura de căutare, de exemplu, tot în coloana Responsabil, atunci ca urmare a aplicării metodei FindLines() vom obține toate rândurile în care atât Angajat, cât și Responsabil sunt egale cu valoarea căutată.

7. Cum să iterați printr-un tabel de valori în ordine aleatorie

Pentru fiecare rând curent din bucla tabelului de valori
Raport (CurrentRow.Name);
EndCycle;

Același lucru folosind indecși:

SeniorIndex = ValueTable.Quantity() - 1;
Pentru cont = 0 la SeniorIndex Cycle
Raport(ValoriTabel[Cont].Nume);
EndCycle;


8. Ștergerea unui rând de tabel de valori existent

ValueTable.Delete(Rândul de șters);

prin index

ValueTable.Delete(0);


9. Ștergerea unei coloane existente din tabelul de valori

ValueTable.Columns.Delete(ColumnDeleted);


prin index

ValueTable.Columns.Delete(0);

Este necesar să se țină cont de faptul că ștergerea unui rând (sau a unei coloane) „din mijlocul” tabelului de valori va duce la o scădere cu un indici a rândurilor situate „după” șterse.

10. Cum se completează un tabel de valori dacă numele coloanelor sunt conținute în variabile?

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


11. Cum să umpleți întreaga coloană a tabelului de valori cu valoarea dorită?
Coloana Flag Contabilitate fiscală din Tabelul de valori tabelul de valori trebuie completată cu valoarea Fals

Tabel de valori Completați valorile (fals, „Stavilul contabilității fiscale”);


Folosim metoda FillValues() pentru tabelul de valori. Primul parametru este valoarea care trebuie completată. Al doilea parametru este numele coloanei care trebuie completată.

12. Cum pot completa tabelul de valori „Receiver Table” cu date din tabelul de valori „SourceTable”?

Dacă Tabelul Destinatari nu există încă în momentul operațiunii sau nu trebuie să fie salvate coloanele sale anterioare, îl puteți crea ca o copie completă a originalului

Recipient table = Source table.Copy();


Opțiunea a doua: tabelul ReceiverTable există și ar fi păcat să-și piardă coloanele și restricțiile privind tipurile de date coloane. Dar trebuie să completați datele pentru coloanele ale căror nume se potrivesc cu numele tabelului sursă.

Transfer parțial de date pentru coloanele cu nume care se potrivesc:

Pentru fiecare rând al SourceTable din ciclul SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Sfârșitul ciclului


Pentru fiecare rând al tabelului sursă, se adaugă un nou rând la tabelul de primire, iar valorile sunt completate în acele coloane din noul tabel ale căror nume se potrivesc cu numele coloanelor din tabelul sursă.

Dacă tabelele nu au coloane cu aceleași nume, tabelul de destinație va ajunge să conțină atâtea rânduri cu valori nule câte rânduri au existat în tabelul sursă.
Dacă pentru unele coloane cu același nume tipul de valoare a datelor din tabelul sursă nu se încadrează în matricea de tipuri de coloane permise din tabelul de destinație, vom obține valori goale în astfel de câmpuri.
Să luăm în considerare al treilea caz. În cazul coloanelor cu același nume, coloana tabelului de destinație trebuie adusă în deplină conformitate cu coloana tabelului sursă.

Copiere completă a datelor pentru coloanele cu nume care se potrivesc

Aceleași coloane = New Array();

Pentru fiecare coloană din SourceTable.Columns Cycle
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Dacă MatchingColumn<>Nedefinit Atunci

// Obține proprietățile coloanei.
Nume = Coloană.Nume;
ValueType = Column.ValueType;
Antet = Column.Header;
Latime = Column.Width;

// Înlocuiește coloanele din tabelul de destinație.
Index = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Index);
ReceiverTable.Columns.Insert(Index, Name, ValueType, Header, Width);

// Adăugați următorul nume al coloanelor care se potrivesc în matrice.
Aceleași coloane.Add(Column.Name);

endIf;

EndCycle;

// Parcurgeți rândurile tabelului sursă.
Pentru fiecare rând al SourceTable din ciclul SourceTable

// Adăugați un nou rând la tabelul de destinație.
NewRow = TableReceiver.Add();

// Completați valorile în celulele potrivite.
Pentru fiecare Nume Coloane Din Coloane cu același nume Ciclu
NewRow[ColumnName] = SourceTableRow[ColumnName];

EndCycle;

EndCycle;


Va trebui să înlocuim coloana din tabelul de destinație cu una nouă, ale cărei proprietăți se vor potrivi pe deplin cu coloana tabelului sursă.
Prin urmare, dacă în tabelul destinatar se găsește o coloană cu același nume, colectăm toate proprietățile pentru noua coloană în variabile. Apoi, ștergeți-l pe cel vechi și creați o coloană nouă. Apoi parcurgem rândurile tabelului sursă.
În buclă, adăugăm un nou rând la tabelul de primire și deschidem o buclă peste numele coloanelor din matricea de coloane care se potrivesc.
În interiorul acestei bucle imbricate, umplem celulele tabelului de destinație cu datele celulei tabelului sursă.

13. Cum să adăugați coloane la tabelul de valori „ValueTable” cu restricții de tip?

Când adăugați o coloană, puteți pur și simplu să specificați numele acesteia și să lăsați neatins al doilea parametru al metodei Add(). În acest caz, tipul de date al coloanei este arbitrar.

Adăugarea unei coloane fără a specifica un tip de date

// Adăugați o coloană fără restricții de tip.
ValueTable.Columns.Add(„Obiect”);


Puteți completa valoarea celui de-al doilea parametru. Acolo trebuie să treceți o descriere a tipului permis pentru coloană. Descrierea în sine poate fi obținută folosind constructorul, trecându-i ca parametru numele șirului tipului (dacă sunt multe tipuri, separate prin virgule) sau un tablou de tipuri valide.

Adăugarea unei coloane care indică tipul de date

// Restricții privind tipurile de date coloane:
// Numai elemente din directorul „Contrapărți”.
Tabel de valori.Columns.Add("Cont", Descriere nouă a tipurilor ("DirectoryLink.Accounts"));


Dacă printre tipurile permise pentru umplerea datelor coloanei este un șir, puteți limita adâncimea de biți (lungimea) acestuia, specificați utilizarea unei lungimi variabile sau fixe. Toate acestea se realizează prin crearea unui obiect folosind constructorul String Qualifiers. În continuare, acest obiect va fi folosit ca unul dintre parametrii constructorului TypeDescription.

Utilizarea calificatorilor pentru a specifica tipul de date al unei coloane de tabel de valori

// Pregătește și stabilește restricții pentru datele de tip String.
String Qualifiers = New String Qualifiers(20, AllowedLength.Variable);
ValidTypes = NewTypeDescription(„String”, StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Acțiuni similare pot fi efectuate în ceea ce privește calificatorii de număr și dată.
Vă rugăm să rețineți: descrierile de tip pot fi construite de către constructor fie „de la zero”, fie o descriere de tip existentă poate fi folosită ca bază.

Utilizarea declarațiilor de tip existente pentru a specifica tipul de date al unei coloane de tabel de valori

// Extindere a descrierii tipului utilizat anterior.
QualifiersNumbers = New QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, „Number, Date”, Number Qualifiers, Data Qualifiers);

ValueTable.Columns.Add(„Notă”, ExtendedAcceptableTypes);

Tabelul de valori din platforma 1C 8.3 (8.2) este o colecție universală de valori pe care un dezvoltator o poate folosi în timpul dezvoltării software pentru a-și implementa algoritmii. În esență, un tabel de valori 1C este un set dinamic de valori care au coloane și coloane.

Articole despre alte colecții universale de valori în 1C

Învață programarea în 1C în cartea mea „Programarea în 1C în 11 pași”

  1. Cartea este scrisă într-un limbaj clar și simplu - pentru un începător.
  2. Învață să înțelegi arhitectura 1C;
  3. Veți începe să scrieți cod în limbajul 1C;
  4. Stăpânește tehnici de bază de programare;
  5. Consolidează-ți cunoștințele cu ajutorul unei cărți de probleme;

Un ghid excelent pentru dezvoltarea într-o aplicație gestionată 1C, atât pentru dezvoltatori începători, cât și pentru programatori experimentați.

  1. Limbajul de prezentare foarte accesibil și ușor de înțeles
  2. Cartea este trimisă prin e-mail în format PDF. Poate fi deschis pe orice dispozitiv!
  3. Înțelegeți ideologia unei aplicații gestionate 1C
  4. Aflați cum să dezvoltați o aplicație gestionată;
  5. Învățați să dezvoltați formulare 1C gestionate;
  6. Veți putea lucra cu elementele de bază și necesare ale formularelor gestionate
  7. Programarea în cadrul unei aplicații gestionate va deveni clară

Cod promoțional pentru o reducere de 15% - 48PVXHeYu


Dacă această lecție te-a ajutat să rezolvi vreo problemă, ți-a plăcut sau ti-a fost utilă, atunci poți să-mi susții proiectul donând orice sumă:

Puteți plăti manual:

Yandex.Bani - 410012882996301
Web Money - R955262494655

Alăturați-vă grupurilor mele.