1c επιλέξτε σειρές του πίνακα τιμών ανά συνθήκη. Είναι σημαντικό να μην συγχέετε ποτέ μια ιδιότητα αντικειμένου και μια μέθοδο αντικειμένου

Προκειμένου να ληφθούν υπόψη τα χρήματα και τα αγαθά, διάφοροι πίνακες χρησιμοποιούνται ευρέως στις επιχειρήσεις. Σχεδόν κάθε έγγραφο είναι ένας πίνακας.

Ένας πίνακας αναφέρει τα εμπορεύματα που θα αποσταλούν από την αποθήκη. Ένας άλλος πίνακας δείχνει τις υποχρεώσεις πληρωμής για αυτά τα αγαθά.

Επομένως, στο 1C, η εργασία με πίνακες κατέχει εξέχουσα θέση.

Οι πίνακες στο 1C ονομάζονται επίσης "πινακοειδή μέρη". Κατάλογοι, έγγραφα και άλλα τα έχουν.

Το ερώτημα, όταν εκτελείται, επιστρέφει έναν πίνακα στον οποίο μπορείτε να προσπελάσετε με δύο διαφορετικούς τρόπους.

Η πρώτη - ταχύτερη - επιλογή, η λήψη σειρών από αυτήν είναι δυνατή μόνο με τη σειρά. Το δεύτερο είναι η μεταφόρτωση του αποτελέσματος του ερωτήματος σε έναν πίνακα τιμών και στη συνέχεια η τυχαία πρόσβαση σε αυτό.

//Επιλογή 1 – διαδοχική πρόσβαση στα αποτελέσματα ερωτημάτων

//πάρτε το τραπέζι
Select = Query.Run().Select();
// περνάμε από όλες τις γραμμές του αποτελέσματος του ερωτήματος με τη σειρά
Ενώ Βρόχος Select.Next().
Αναφορά(Επιλογή.Όνομα);
EndCycle;

//Επιλογή 2 – μεταφόρτωση σε πίνακα τιμών
Request = New Request("SELECT Name FROM Directory.Nomenclature");
//πάρτε το τραπέζι
Πίνακας = Query.Run().Unload().
// περαιτέρω μπορούμε επίσης να κάνουμε επανάληψη σε όλες τις γραμμές
Για κάθε σειρά από τον κύκλο του πίνακα
Αναφορά(String.Name);
EndCycle;
//ή αυθαίρετη πρόσβαση σε συμβολοσειρές
Row = Table.Find("Shovel", "Name");

Ένα σημαντικό χαρακτηριστικό είναι ότι στον πίνακα που προκύπτει από το αποτέλεσμα του ερωτήματος, όλες οι στήλες θα πληκτρολογούνται αυστηρά. Αυτό σημαίνει ότι ζητώντας το πεδίο Name από τον κατάλογο Ονοματολογία, θα λάβετε μια στήλη τύπου String με επιτρεπόμενο μήκος όχι περισσότερο από N χαρακτήρες.

Πίνακας στη φόρμα (χοντρό πελάτη)

Ο χρήστης δουλεύει με τον πίνακα όταν αυτός τοποθετείται στη φόρμα.

Συζητήσαμε τις βασικές αρχές της εργασίας με φόρμες στο μάθημα και στο μάθημα

Λοιπόν, ας τοποθετήσουμε τον πίνακα στη φόρμα. Για να το κάνετε αυτό, μπορείτε να σύρετε τον πίνακα από τον πίνακα ελέγχου. Ομοίως, μπορείτε να επιλέξετε Form/Insert Control από το μενού.

Τα δεδομένα μπορούν να αποθηκευτούν στη διαμόρφωση - τότε πρέπει να επιλέξετε το υπάρχον (που προστέθηκε προηγουμένως) τμήμα πίνακα του αντικειμένου διαμόρφωσης του οποίου τη μορφή επεξεργάζεστε.

Κάντε κλικ στο κουμπί "..." στην ιδιότητα Δεδομένα. Για να δείτε τη λίστα επιτραπέζια μέρη, πρέπει να αναπτύξετε τον κλάδο Object.

Όταν επιλέγετε το τμήμα πίνακα, το ίδιο το 1C θα προσθέσει στήλες στον πίνακα της φόρμας. Οι σειρές που εισάγονται από τον χρήστη σε έναν τέτοιο πίνακα θα αποθηκευτούν αυτόματα μαζί με το βιβλίο/έγγραφο αναφοράς.

Στην ίδια ιδιότητα Δεδομένα, μπορείτε να εισαγάγετε ένα αυθαίρετο όνομα και να επιλέξετε τον τύπο πίνακα τιμών.

Αυτό σημαίνει ότι έχει επιλεγεί ένας αυθαίρετος πίνακας τιμών. Δεν θα προσθέσει αυτόματα στήλες, ούτε θα αποθηκευτεί αυτόματα, αλλά μπορείτε να κάνετε ό,τι θέλετε με αυτό.

Κάνοντας δεξί κλικ στον πίνακα μπορείτε να προσθέσετε μια στήλη. Στις ιδιότητες μιας στήλης, μπορείτε να καθορίσετε το όνομά της (για αναφορά στον κώδικα 1C), την επικεφαλίδα της στήλης στη φόρμα, τη σύνδεση με το χαρακτηριστικό του πίνακα τμήματος (το τελευταίο - εάν δεν έχει επιλεγεί αυθαίρετος πίνακας, αλλά τμήμα πίνακα).

Στις ιδιότητες του πίνακα στη φόρμα, μπορείτε να καθορίσετε εάν ο χρήστης μπορεί να προσθέσει/διαγράψει σειρές. Μια πιο σύνθετη φόρμα είναι το πλαίσιο ελέγχου Μόνο προβολή. Αυτές οι ιδιότητες είναι βολικές στη χρήση για την οργάνωση πινάκων που προορίζονται για εμφάνιση πληροφοριών, αλλά όχι για επεξεργασία.

Για να διαχειριστείτε τον πίνακα, πρέπει να εμφανίσετε έναν πίνακα εντολών στη φόρμα. Επιλέξτε το στοιχείο μενού Form/Insert Control/Command Bar.

Στις ιδιότητες της γραμμής εντολών, επιλέξτε το πλαίσιο ελέγχου Αυτόματη συμπλήρωση, ώστε τα κουμπιά στον πίνακα να εμφανίζονται αυτόματα.

Πίνακας φόρμας (λεπτός/διαχειριζόμενος πελάτης)

Σε μια διαχειριζόμενη φόρμα, αυτές οι ενέργειες φαίνονται λίγο διαφορετικές. Εάν πρέπει να τοποθετήσετε ένα τμήμα πίνακα στη φόρμα, αναπτύξτε τον κλάδο Αντικείμενο και σύρετε ένα από τα τμήματα πίνακα προς τα αριστερά. Αυτό είναι όλο!

Εάν πρέπει να τοποθετήσετε έναν πίνακα τιμών, προσθέστε ένα νέο χαρακτηριστικό φόρμας και στις ιδιότητες του καθορίστε τον τύπο – πίνακα τιμών.

Για να προσθέσετε στήλες, χρησιμοποιήστε το μενού με το δεξί κλικ σε αυτό το χαρακτηριστικό φόρμας, επιλέξτε Προσθήκη στήλης χαρακτηριστικού.

Στη συνέχεια, σύρετε επίσης τον πίνακα προς τα αριστερά.

Προκειμένου ένας πίνακας να έχει γραμμή εντολών, στις ιδιότητες πίνακα, επιλέξτε τις τιμές στην ενότητα Θέση της γραμμής χρήσης – εντολών.

Μεταφόρτωση πίνακα στο Excel

Οποιοσδήποτε πίνακας 1C που βρίσκεται στη φόρμα μπορεί να εκτυπωθεί ή να μεταφορτωθεί στο Excel.

Για να το κάνετε αυτό, κάντε δεξί κλικ ελεύθερος χώροςστον πίνακα και επιλέξτε Λίστα.

Σε έναν διαχειριζόμενο (λεπτό) πελάτη, παρόμοιες ενέργειες μπορούν να εκτελεστούν χρησιμοποιώντας το στοιχείο μενού Όλες οι ενέργειες/Λίστα εμφάνισης.

Υπάρχουν δύο ειδικές μέθοδοι για την αναζήτηση ενός πίνακα τιμών:

1. Βρείτε

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//μπορούμε επίσης να καθορίσουμε ποιες στήλες θα αναζητήσουμε για να επιταχύνουμε την αναζήτηση
FoundString = TZNomenclature.Find(TVHorizon, "Nomenclature");

Αυτή η μέθοδος επιστρέφει την πρώτη γραμμή που βρέθηκε με την επιθυμητή τιμή ή Undefined εάν δεν τη βρει. Επομένως, είναι βολικό να το χρησιμοποιήσετε για να αναζητήσετε μοναδικές τιμές, επειδή Διαφορετικά, όταν βρεθεί μια τιμή, θα πρέπει να την αφαιρέσετε από τον πίνακα για να βρείτε την επόμενη.

Για να αποφύγετε αυτήν την ταλαιπωρία, υπάρχει η ακόλουθη μέθοδος που σας επιτρέπει να βρείτε μια σειρά από συμβολοσειρές που ταιριάζουν:

2. FindStrings


Δομή επιλογής.Εισαγωγή("Ονοματολογία", TVHorizon); // υποδείξτε πρώτα τη στήλη πού να αναζητήσετε και μετά τι να αναζητήσετε.

Αυτή η μέθοδος επιστρέφει πάντα έναν πίνακα, αλλά μπορεί να είναι κενός εάν δεν βρεθεί τίποτα. Και αυτή η μέθοδος, όπως και η προηγούμενη, επιστρέφει τις ίδιες τις γραμμές του πίνακα τιμών και όχι τις ίδιες τις τιμές σε ξεχωριστό πίνακα. Επομένως, αλλάζοντας τις τιμές στη συμβολοσειρά του πίνακα ή, όπως στην προηγούμενη μέθοδο, για τη συμβολοσειρά που βρέθηκε, θα αλλάξετε την τιμή στον επεξεργασμένο πίνακα τιμών.

Ένα άλλο καλό με αυτή τη μέθοδο είναι ότι μπορεί να πραγματοποιήσει αναζήτηση σε πολλές στήλες του πίνακα τιμών ταυτόχρονα:


SelectionStructure = Νέα δομή;
Δομή επιλογής.Εισαγωγή("Ονοματολογία", TVHorizon);
Selection Structure.Insert("Quantity", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Το μόνο αρνητικό, όπως μπορείτε να δείτε, είναι ότι δεν μπορείτε να χρησιμοποιήσετε άλλους τύπους σύγκρισης εκτός από το "ίσο"

Δημοσιεύθηκε στις 21 Σεπτεμβρίου 2011

Πίνακας τιμών 1C – μέρος 3. Μεταδεδομένα. Γίνεται βρόχος στις στήλες του πίνακα τιμών

Σε αυτό το άρθρο θα σας πω πώς να εργαστείτε με έναν πίνακα τιμών μιας "άγνωστης" δομής, πώς να επαναλάβετε τις στήλες ενός πίνακα τιμών, πώς να εξαγάγετε δεδομένα από στήλες και σειρές χωρίς τη χρήση ονομάτων στηλών. (Αυτό το άρθρο ανήκει στη σειρά άρθρων 1C από την αρχή, προγραμματισμός 1C από την αρχή, πίνακας τιμών 1C)

Να εξηγήσουμε το υλικό και να μπορούμε να τρέξουμε τα παραδείγματά μας κώδικα προγράμματος"ζήσε", χρειαζόμαστε λίγο πίνακας δοκιμών τιμών 1C. Μερικά από τα παραδείγματά μας θα εξαγάγουν δεδομένα από έναν πίνακα τιμών, επομένως θα φτιάξουμε έναν πίνακα με τρεις στήλες "Επώνυμο", "Όνομα", "Μεσαίο όνομα" και θα εισαγάγουμε μια μικρή ποσότητα δεδομένων σε αυτόν - έως και 3 σειρές :)

Λοιπόν, ας δημιουργήσουμε έναν πίνακα δοκιμών με τιμές 1C και ας τον συμπληρώσουμε:

MyTZ = New ValueTable; // δημιουργήστε έναν νέο πίνακα τιμών που είναι αποθηκευμένος στη μεταβλητή "MyTZ" MyTZ.Columns.Add("Επώνυμο"); // δημιουργήστε τη στήλη "Επώνυμο" MyTZ.Columns.Add("Όνομα"); // δημιουργήστε τη στήλη "Όνομα" MyTZ.Columns.Add("Πατρώνυμο"); // δημιουργήστε τη στήλη "Μεσαίο όνομα" // προσθέστε την πρώτη σειρά στον πίνακα τιμών μας NewLine = MyTZ.Add(); NewString.LastName = "Chapaev"; NewLine.Name = "Βασίλι"; NewString.Μεσαίο όνομα = "Ivanovich"; // προσθέστε τη δεύτερη γραμμή NewLine = MyTZ.Add(); NewString.LastName = "Dzerzhinsky"; NewRow.Name = "Felix"; NewString.Μεσαίο όνομα = "Edmundovich"; // προσθέστε την τρίτη γραμμή NewLine = MyTZ.Add(); NewLine.LastName = "Kotovsky"; NewLine.Name = "Γρηγόριος"; NewString.Μεσαίο όνομα = "Ivanovich";

Ο πίνακας δοκιμών μας αποτελείται από τρεις στήλες: Όνομα, Επώνυμο, Πατρώνυμο. και έχει τρεις γεμάτες γραμμές με τα ονόματα των ηρώων του Εμφυλίου Πολέμου.

Το πρώτο δείγμα κώδικα απαριθμεί τις στήλες ενός πίνακα τιμών 1C ως συλλογή.

// εμφάνιση των ονομάτων όλων των στηλών του TK For Every Column From MyTZ.Columns Cycle Report("Column name: " + Column.Name); EndCycle;

Ο κύκλος μας θα εμφανίσει όλα τα ονόματα στηλών στο παράθυρο μηνύματος 1C:

Όνομα στήλης: Επώνυμο Όνομα στήλης: Όνομα Όνομα στήλης: Μέσο όνομα

Βλέπουμε ότι για την επανάληψη μέσω στηλών, χρησιμοποιείται ένας ειδικός κύκλος επανάληψης συλλογής, παρόμοιος με τον κύκλο επανάληψης σειράς (στο προηγούμενο άρθρο). MyTK.Στήλες- αυτή είναι μια συλλογή στηλών του πίνακα τιμών 1C "MyTZ". Η συλλογή περιέχει αντικείμενα του τύπου "Στήλη πίνακα τιμών"Κάθε αντικείμενο αυτού του τύπου είναι μια στήλη του πίνακα τιμών και περιέχει ιδιότητες και μεθόδους. Με την πρόσβαση σε αυτές τις ιδιότητες και μεθόδους, λαμβάνουμε τις απαραίτητες πληροφορίες για μια στήλη ή εκτελούμε κάποιες άλλες ενέργειες με αυτήν.

Για παράδειγμα, πρόσβαση στο ακίνητο "Ονομα" (Στήλη.Όνομα) παίρνουμε το όνομα της τρέχουσας στήλης.

Θα ήθελα να επιστήσω την προσοχή σας στον τίτλο της σειράς: «Για όλους ΣτήληΑπό MyTZ.Column Cycle" Μεταβλητή με όνομα "Στήλη"εφευρέθηκε από εμάς. Δεν είναι απαραίτητο να χρησιμοποιήσετε το ίδιο όνομα. Μπορείτε να ονομάσετε αυτήν τη μεταβλητή ό,τι θέλετε, για παράδειγμα "MyCurrentColumn"Τότε το παραπάνω παράδειγμα θα μοιάζει με αυτό:

// εμφάνιση των ονομάτων όλων των στηλών του TK For Every MyCurrentColumn From MyTK.Columns Cycle Report("Column name: " + MyCurrentColumn.Name); EndCycle;

Όταν το υποσύστημα εκτέλεσης 1C συναντά έναν κύκλο αυτού του τύπου, με κάθε πέρασμα του κύκλου εκχωρεί μια μεταβλητή με καθορισμένο όνομαένα στοιχείο από τη συλλογή μας, σε αυτήν την περίπτωση - ένα στοιχείο συλλογήςστήλες πίνακα τιμών MyTK.ΣτήλεςΣτη συνέχεια, έχουμε πρόσβαση στη μεταβλητή που περιέχει την τρέχουσα στήλη και χρησιμοποιούμε την ιδιότητα "Ονομα".

Προτείνω να εμφανιστεί δίπλα στο όνομα της στήλης ο αριθμός κάθε στήλης στη συλλογή στηλών:

// εμφάνιση του αριθμού και των ονομάτων όλων των στηλών του πίνακα τιμών Για κάθε στήλη από MyTZ.Columns Κύκλος ΣτήληΑριθμός = MyTZ.Columns.Index(Στήλη); // λάβετε τον αριθμό της στήλης ColumnName = Column.Name; // λάβετε το όνομα της στήλης Report("Αριθμός στήλης:" + Αριθμός στήλης + " Όνομα στήλης: " + Όνομα στήλης); EndCycle;

Το ακόλουθο κείμενο θα εμφανιστεί στο παράθυρο μηνύματος 1C:

Αριθμός στήλης:0 Όνομα στήλης: Επώνυμο Αριθμός στήλης: 1 Όνομα στήλης: Όνομα Αριθμός στήλης: 2 Όνομα στήλης: Μέσο όνομα

Λάβετε υπόψη ότι οι στήλες στον πίνακα τιμών 1C αριθμούνται ξεκινώντας από το μηδέν, όπως και οι σειρές του πίνακα τιμών.

Αριθμός στηλών στον πίνακα τιμών 1C

Για να μάθουμε τον αριθμό των στηλών στον πίνακα τιμών, χρησιμοποιούμε τη μέθοδο "Count()" στη συλλογή των στηλών.

Αριθμός στηλών = MyTZ.Columns.Quantity(); Αναφορά (Αριθμός στηλών);

Ο αριθμός "3" θα εμφανιστεί στην οθόνη. Πράγματι, ο πίνακας μας έχει τρεις στήλες: "Επώνυμο", "Όνομα", "Πατρώνυμο"

Λήψη αντικειμένου στήλης με τον αριθμό του (ευρετήριο) και απαρίθμηση στηλών χρησιμοποιώντας το ευρετήριο στήλης

Ας κάνουμε έναν κύκλο αναζήτησης σε όλες τις στήλες του πίνακα τιμών χρησιμοποιώντας δείκτες στηλών (αριθμούς). Θυμηθείτε ότι η αρίθμηση στηλών ξεκινά από το μηδέν. Επομένως, πρέπει να αυξήσουμε τον μετρητή κύκλου "Sch" από το μηδέν σε έναν αριθμό ίσο με τον αριθμό των στηλών μείον ένα.

Για λογαριασμό = 0 By MyTZ.Columns.Quantity() - 1 Cycle CurrentColumn = MyTZ.Columns[Act]; Αναφορά(ΤρέχουσαΣτήλη.Όνομα); EndCycle;

Στην οθόνη θα λάβουμε τα εξής

Πλήρες όνομα

Νομίζω ότι αυτό το παράδειγμα ήταν ξεκάθαρο. Στραφήκαμε στη μέθοδο Ποσότητα()συλλογές στηλών" MyTZ.Columns.Quantity()", πήρε τον αριθμό των στηλών και ξεκίνησε έναν βρόχο με έναν μετρητή από μηδένπριν αριθμός στηλών μείον μία. Μέσα στον βρόχο παίρνουμε κάθε στήλη από τη συλλογή στηλών και εκχωρούμε το τρέχον αντικείμενο στήλης σε μια μεταβλητή Τρέχουσα ΣτήληΣτη συνέχεια, η μεταβλητή Τρέχουσα Στήληέχουμε πρόσβαση στο ακίνητο Ονομακαι εμφανίστε την τιμή αυτής της ιδιότητας στην οθόνη: Αναφορά(ΤρέχουσαΣτήλη.Όνομα);

Είναι σημαντικό να μην συγχέετε ποτέ την ιδιότητα ενός αντικειμένου και τη μέθοδο ενός αντικειμένου.

Μια ιδιότητα είναι μια συγκεκριμένη στατική τιμή και η πρόσβαση σε αυτήν γράφεται χωρίς παρενθέσεις, για παράδειγμα ΤρέχουσαΣτήλη.Όνομα. Μια μέθοδος είναι ουσιαστικά μια διαδικασία ή συνάρτηση ενός αντικειμένου και οι κλήσεις σε διαδικασίες και συναρτήσεις γράφονται πάντα με παρενθέσεις (ακόμα και αν δεν υπάρχουν παράμετροι εισόδου). Για παράδειγμα: MyTZ.Columns.Quantity()

Εάν αποκτήσουμε πρόσβαση σε μια μέθοδο και ξεχάσουμε να γράψουμε τις παρενθέσεις, ο διερμηνέας 1C θα μας δώσει ένα μήνυμα σφάλματος και δεν θα εκτελέσει τον κώδικα. Αφού ο διερμηνέας θα θεωρήσει ότι δεν έχουμε πρόσβαση σε μια μέθοδο, αλλά σε μια ιδιότητα - επειδή δεν υπάρχουν παρενθέσεις. Αλλά δεν θα μπορεί να βρει ιδιότητες με αυτό το όνομα (γιατί υπάρχει μόνο μια μέθοδος με αυτό το όνομα) - κάτι που θα αναφέρεται στο μήνυμα σφάλματος.

Αυτό θα γράψει ο διερμηνέας αν ξεχάσω να βάλω παρενθέσεις σε μια κλήση μεθόδου με τόσο λανθασμένο τρόπο MyTZ.Στήλες.Ποσότητα(χωρίς παρένθεση μετά το "Quantity()"):

Το πεδίο αντικειμένου δεν βρέθηκε (Ποσότητα)

Σε αυτήν την περίπτωση, το "πεδίο" και το "ιδιότητα" θα πρέπει να νοούνται ως συνώνυμα ή ως ανακρίβεια στην ορολογία των προγραμματιστών 1C. Χρησιμοποιούν και τις δύο αυτές λέξεις για να αναφερθούν στην ίδια έννοια. Αν και σε άλλες γλώσσες προγραμματισμού αυτοί οι όροι μπορεί να σημαίνουν διαφορετικά πράγματα.

Λήψη δεδομένων από έναν πίνακα τιμών 1C χρησιμοποιώντας αριθμούς στηλών

Αρχικά, σας προσφέρω ένα απλό παράδειγμα λήψης δεδομένων από την πρώτη σειρά του πίνακα μας. Λάβετε υπόψη ότι χρησιμοποιούμε τον προσυμπληρωμένο πίνακα από την αρχή του άρθρου. Γνωρίζουμε με βεβαιότητα ότι ο πίνακας έχει μια πρώτη γραμμή και τουλάχιστον μία στήλη. Εάν εφαρμόσουμε αυτό το παράδειγμα σε έναν κενό πίνακα, θα προκύψει σφάλμα. Ετσι:

FirstLine = MyTK; // πάρτε την πρώτη σειρά (αριθμημένη από το μηδέν) FirstColumnValue = FirstRow; // λάβετε την τιμή της πρώτης στήλης (η αρίθμηση στηλών είναι επίσης από την αρχή) Report(Value of the FirstColumn); // εμφανίζει την τιμή της πρώτης στήλης στην πρώτη σειρά του πίνακα

Η οθόνη θα εμφανίσει:

Τσαπάεφ

Αρχικά λάβαμε ένα αντικείμενο γραμμής πίνακα τιμών με πρόσβαση στον πίνακα τιμών χρησιμοποιώντας τον τελεστή [...]. (αν ξεχάσατε πώς να το κάνετε αυτό, μπορείτε να δείτε προηγούμενα άρθρα) Περάσαμε το όρισμα "0" μέσα στον τελεστή. Αυτός είναι ο δείκτης της πρώτης σειράς του πίνακα τιμών. FirstLine = MyTK;

Επιπλέον, έχουμε επίσης το δικαίωμα πρόσβασης σε ένα αντικείμενο συμβολοσειράς χρησιμοποιώντας τον τελεστή [...]. Μέσα σε αυτόν τον τελεστή περάσαμε τον αριθμό στήλης του πίνακα τιμών, σε αυτήν την περίπτωση και το "0". Και έτσι, λάβαμε την τιμή της στήλης με αριθμό "0" για την τρέχουσα σειρά πίνακα με αριθμό "0". Εμφανίσαμε αυτήν την τιμή στην οθόνη και αντιπροσωπεύει τη συμβολοσειρά "Chapaev".

Ας περιπλέκουμε λίγο το παράδειγμά μας:

FirstLine = MyTK; // λάβετε την πρώτη γραμμή (αριθμημένη από το μηδέν) Αναφορά (FirstLine); // εμφανίζει την τιμή της πρώτης στήλης στην πρώτη σειρά του πίνακα Report(FirstRow); // εμφάνιση της τιμής της δεύτερης στήλης στην πρώτη σειρά του πίνακα Report(FirstRow); // εμφανίζει την τιμή της τρίτης στήλης στην πρώτη σειρά του πίνακα

Εμφανίσαμε τώρα τις τιμές και από τις τρεις στήλες της πρώτης γραμμής του πίνακα τιμών μας:

Τσαπάεφ Βασίλι Ιβάνοβιτς

Τώρα θα τροποποιήσω επίσης αυτό το παράδειγμα, ώστε να μπορούμε να κάνουμε χωρίς τη μεταβλητή "Πρώτη γραμμή"

Αναφορά (MyTZ); // εμφανίζει την τιμή της πρώτης στήλης στην πρώτη σειρά του πίνακα Report(MyTZ); // εμφανίζει την τιμή της δεύτερης στήλης στην πρώτη σειρά του πίνακα Report(MyTZ); // εμφανίζει την τιμή της τρίτης στήλης στην πρώτη σειρά του πίνακα

Το ίδιο θα είναι και στην οθόνη

Τσαπάεφ Βασίλι Ιβάνοβιτς

Είδαμε στο παραπάνω παράδειγμα ότι για να αποκτήσουμε πρόσβαση σε μια τιμή που βρίσκεται σε μια συγκεκριμένη γραμμή και μια συγκεκριμένη στήλη ενός πίνακα τιμών, μπορούμε να χρησιμοποιήσουμε μια διαδοχική κλήση δύο τελεστών [...] με αυτήν τη μορφή: Πίνακας τιμών[Ευρετήριο σειράς][Ευρετήριο στήλης]

Έτσι, είμαστε έτοιμοι να δημιουργήσουμε έναν βρόχο και να λάβουμε τα δεδομένα όλων των γραμμών και όλων των στηλών χρησιμοποιώντας δείκτες σειρών και στηλών:

Για RowCounter = 0 By MyTZ.Quantity() - 1 Loop // κύκλος μέσω σειρών Για ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ένθετος βρόχος μέσω στηλών // λάβετε την τιμή του κελιού (από την τρέχουσα σειρά και οι τρέχουσες στήλες) CellValue = MyTK[RowCounter][ColumnCounter]; // εμφάνιση του αριθμού σειράς, του αριθμού στήλης και της τιμής του κελιού Αναφορά ("Αριθμός γραμμής" + Αρίθμηση γραμμών + "Αριθμός στήλης" + Πλήθος στηλών + " = " + Τιμή κελιού); EndCycle; EndCycle;

Στην οθόνη θα εμφανιστούν τα ακόλουθα:

Γραμμή Αρ. 0 στήλη Αρ. 0 = Chapaev Γραμμή Αρ. 0 στήλη Νο. 1 = Βασίλι Γραμμή Αρ. 0 στήλη Νο. 2 = Γραμμή Νο. 1 στήλη Ιβάνοβιτς Νο. 0 στήλη Νο. Γραμμή Ντζερζίνσκι Νο. 1 στήλη = Φέλιξ Γραμμή Νο. 1 στήλη Νο. 2 = Edmundovich Γραμμή Νο. 2 στήλη Νο. 0 = Kotovsky Γραμμή Νο. 2 στήλη Νο. 1 = Γκριγκόρι Γραμμή Νο. 2 στήλη Νο. 2 = Ιβάνοβιτς

Χρησιμοποιώντας δύο κύκλους, ο ένας από τους οποίους είναι ένθετος μέσα στον άλλο, εμφανίσαμε τις τιμές όλων των στηλών από όλες τις σειρές του πίνακα τιμών 1C. Σε αυτήν την περίπτωση, δεν χρησιμοποιήσαμε ονόματα στηλών, αλλά αποκτήσαμε πρόσβαση σε στήλες και σειρές από τα ευρετήριά τους. Για περισσότερη κατανόηση, δώστε προσοχή στα σχόλια μέσα στο παράδειγμα.

Εν κατακλείδι, προτείνω να αλλάξουμε ελαφρώς το παράδειγμά μας, ώστε αντί για αριθμούς στηλών, να εμφανίζει τα ονόματά τους στην οθόνη. Και επιπλέον, θα κάνω ένα πιο εμφανίσιμο σχέδιο για την εμφάνιση περιεχομένου στην οθόνη.

Για LineCounter = 0 By MyTZ.Quantity() - 1 Loop // Loop through rows Report(" ======= Αριθμός γραμμής " + LineCounter + " ======="); Να αναφέρουν(" "); // τροφοδοσία γραμμής (εισαγωγή κενή γραμμή) Για ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ένθετος βρόχος μέσω στηλών // λάβετε την τιμή του κελιού (από την τρέχουσα σειρά και την τρέχουσα στήλη) CellValue = MyTZ[RowCounter][ColumnCounter]; // πάρτε το όνομα της στήλης ColumnName = MyTZ.Columns[ColumnCounter].Name; // εμφάνιση του ονόματος της στήλης και της τιμής του κελιού Report(ColumnName + ": " + CellValue); EndCycle; Να αναφέρουν(" "); // τροφοδοσία γραμμής (εισαγωγή κενής γραμμής) EndCycle;

Τώρα, στην οθόνη μας οι πληροφορίες άρχισαν να φαίνονται πιο αντιπροσωπευτικές:

Γραμμή Αρ. 0 ======= Επώνυμο: Chapaev Όνομα: Vasily Πατρώνυμο: Ivanovich ======= Γραμμή Αρ. 1 ======= Επώνυμο: Dzerzhinsky Όνομα: Felix Πατρώνυμο: Edmundovich ===== == Γραμμή αρ. 2 ======= Επώνυμο: Kotovsky Όνομα: Grigory Πατρώνυμο: Ivanovich

Ναι, παραλίγο να το ξεχάσω. Όταν χρησιμοποιούμε δύο [...][...] τελεστές στη σειρά, μπορούμε να περάσουμε το όνομα αυτής της στήλης αντί για ένα ευρετήριο στήλης: ValueTable[RowIndex][ColumnName]

Για LineCounter = 0 By MyTZ.Quantity() - 1 Loop // Loop through rows Report(" ======= Αριθμός γραμμής " + LineCounter + " ======="); Να αναφέρουν(" "); // τροφοδοσία γραμμής (εισαγωγή κενής γραμμής) Για ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 βρόχος // ένθετος βρόχος μέσω στηλών ColumnName = MyTZ.Columns[ColumnCounter].Name; // λάβετε τη στήλη nameCell Value = MyTZ[RowCounter][ColumnName]; //

Προσέξτε τη γραμμή που σημειώνεται με ένα βέλος ". Σε αυτή τη γραμμή, αντί για το ευρετήριο της τρέχουσας στήλης, περνάμε το όνομα της τρέχουσας στήλης στο όρισμα σε αγκύλες [...] Το αποτέλεσμα θα είναι το ίδιο.

Και τώρα, το τελευταίο πράγμα σε αυτό το άρθρο.

ΣΩΣΤΗ λήψη όλων των δεδομένων από τον πίνακα τιμών 1C χρησιμοποιώντας βρόχους μέσω μιας συλλογής σειρών και μιας συλλογής στηλών

Για κάθε CurrentLine From MyTZ Loop // loop through a collection of strings Report(" ======= Αριθμός γραμμής. " + MyTZ.Index(CurrentLine) + " ======="); Να αναφέρουν(" "); Για κάθε CurrentColumn From MyTZ.Columns Loop // ένθετος βρόχος που επαναλαμβάνεται μέσω μιας συλλογής στηλών ColumnName = CurrentColumn.Name; // λάβετε τη στήλη nameCellValue = CurrentRow[ColumnName]; // λάβετε την τιμή του κελιού BY στήλη NAME Report(ColumnName + ": " + CellValue); // εμφανίζει το όνομα της στήλης και την τιμή του κελιού Τέλος κύκλου. Να αναφέρουν(" "); EndCycle;

Στο παράδειγμα, χρησιμοποιήθηκαν δύο βρόχοι. Ένας βρόχος για τον βρόχο μέσω μιας συλλογής στηλών είναι ένθετος μέσα σε έναν βρόχο για τον βρόχο στις σειρές. Εάν έχετε επεξεργαστεί τα παραπάνω παραδείγματα και διαβάσατε προηγούμενα άρθρα, τότε δεν θα δυσκολευτείτε να κατανοήσετε πώς λειτουργεί αυτό το παράδειγμα.

Τέλος, θα μειώσω όσο το δυνατόν περισσότερο τον αριθμό των γραμμών κώδικα στο τελευταίο μας παράδειγμα, εξαλείφοντας τη χρήση ενδιάμεσων μεταβλητών. Θα λάβουμε ένα δείγμα "βιομηχανικού κώδικα" που χρησιμοποιείται σε πραγματικά προβλήματα.

Αυτό πρέπει να γίνεται μόνο όταν έχετε καλή κατανόηση του τι κάνετε. Εάν ο κώδικας είναι πολύ περίπλοκος, τότε είναι αποδεκτό να αφήνετε ενδιάμεσες μεταβλητές για να διευκολύνετε την κατανόηση του δικού σας κώδικα αργότερα. Επίσης, οποιοσδήποτε κωδικός πρέπει να σχολιάζεται τουλάχιστον ελάχιστα, ώστε μετά από κάποιο χρονικό διάστημα να είναι ευκολότερη η κατανόηση των κειμένων του προγράμματος.

Για κάθε CurrentLine From MyTZ Cycle // iterate over rows Report(" ======= Αριθμός γραμμής. " + MyTZ.Index(CurrentLine) + " =======" + Symbols.PS); Για κάθε CurrentColumn From MyTZ.Columns Βρόχος // επανάληψη σε στήλες Αναφορά(CurrentColumn.Name + ": " + CurrentRow[CurrentColumn.Name]); EndCycle; Να αναφέρουν(" "); EndCycle;

Η έξοδος στην οθόνη δεν έχει αλλάξει, παραμένει η ίδια όπως στο προηγούμενο παράδειγμα:

ΜΑΘΗΜΑ 2 ΕΒΔΟΜΑΔΩΝ

"ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ 1C ΓΙΑ ΑΡΧΑΡΙΟΥΣ"

Το μάθημα θα έρθει στο ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ. Γίνετε προγραμματιστής ολοκληρώνοντας εργασίες βήμα προς βήμα.

Για να συμμετάσχετε χρειάζεστε μόνο υπολογιστή και Internet

Δωρεάν πρόσβαση στο μάθημα:

Sp-force-hide ( display: none;).sp-form ( display: block; background: #eff2f4; padding: 5px; πλάτος: 270px; max-width: 100%; border-radius: 0px; -moz-border -ακτίνα: 0 px; -webkit-border-radius: 0px; γραμματοσειρά-οικογένεια: Arial, "Helvetica Neue", sans-serif; background-repeat: no-repeat; background-position: center; background-size: auto;) Είσοδος .sp-form ( οθόνη: inline-block; αδιαφάνεια: 1; ορατότητα: ορατή;).sp-form .sp-form-fields-wrapper ( περιθώριο: 0 αυτόματο; πλάτος: 260 px;).sp-form .sp -form-control ( φόντο: #ffffff; χρώμα περιγράμματος: #cccccc; στυλ περιγράμματος: συμπαγές; πλάτος περιγράμματος: 1 px; μέγεθος γραμματοσειράς: 15 px; padding-left: 8,75 px; padding-right: 8,75 px; περίγραμμα -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; height: 35px; πλάτος: 100%;).sp-form .sp-field label ( χρώμα: #444444; γραμματοσειρά- μέγεθος: 13 px, στυλ γραμματοσειράς: κανονικό, βάρος γραμματοσειράς: έντονη γραφή;).sp-form .sp-button ( border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; χρώμα φόντου: #f4394c; χρώμα: #ffffff; πλάτος: 100%, βάρος γραμματοσειράς: 700; στυλ γραμματοσειράς: κανονικό; γραμματοσειρά-οικογένεια: Arial, "Helvetica Neue", sans-serif; κουτί-σκιά: κανένας; -moz-box-shadow: κανένας; -webkit-box-shadow: κανένας; φόντο: linear-gradient(to top, #e30d22 , #f77380);).sp-form .sp-button-container (στοίχιση κειμένου: κέντρο; πλάτος: αυτόματη;)

Χαιρετισμούς σε όλους τους αναγνώστες του infostart. Αυτό το άρθρο θα επικεντρωθεί στο ζήτημα της δημιουργίας ενός προσαρμοσμένου πίνακα τιμών στη μορφή μιας διαχειριζόμενης εφαρμογής προγραμματικά.

Χαρακτηριστικά της εργασίας.

Όποιος έχει προγραμματίσει σε μια κανονική εφαρμογή έχει συχνά αντιμετωπιστεί με το καθήκον να αποκτήσει έναν αυθαίρετο πίνακα τιμών σε μια φόρμα. Ένας αυθαίρετος πίνακας τιμών είναι ένας πίνακας του οποίου ο αριθμός και ο τύπος στηλών δεν είναι γνωστοί εκ των προτέρων. Δηλαδή, θα μπορούσαν να υπάρχουν 3 στήλες ή ίσως 6 ή ίσως 8. Σε μια κανονική εφαρμογή, όλα είναι απλά: θα μπορούσατε να τοποθετήσετε το στοιχείο "Πίνακας τιμών" στη φόρμα επεξεργασίας και στη συνέχεια να μεταφέρετε τον δημιουργημένο πίνακα τιμών ​σε αυτό το στοιχείο μέσω προγραμματισμού. Στη συνέχεια με μια απλή εντολή:

Form Elements.TableField.CreateColumns();

λάβετε έναν έτοιμο πίνακα τιμών στη φόρμα. Φαίνεται ότι θα μπορούσε να είναι πιο απλό.

Όλα αυτά ήταν στην κανονική εφαρμογή. Σε μια διαχειριζόμενη εφαρμογή, όλα έχουν αλλάξει. Δεν είναι τόσο εύκολο να δημιουργήσετε έναν αυθαίρετο πίνακα. Τώρα πρέπει είτε να παραμετροποιήσετε αυστηρά τον πίνακα τιμών στη φόρμα είτε να τον δημιουργήσετε μέσω προγραμματισμού (περιγράψτε, λοιπόν, αυτή, στην πραγματικότητα, είναι η ουσία της ίδιας της διαχειριζόμενης εφαρμογής). Αυτό θα προσπαθήσουμε να κάνουμε: λογισμικόδημιουργήστε έναν προσαρμοσμένο πίνακα τιμών σε μια διαχειριζόμενη φόρμα.

Η λύση του προβλήματος.

Το πρώτο πράγμα που πρέπει να κάνουμε είναι να καθορίσουμε πώς θα εμφανίζεται ο πίνακας στη φόρμα. Το κύριο πράγμα είναι ότι δεν χρειάζεται να δημιουργήσετε κανένα στοιχείο φόρμας στην επεξεργασία. Θα το δημιουργήσουμε μέσω προγραμματισμού, όπως ολόκληρος ο πίνακας. Δηλαδή, ο πίνακας θα περιγραφεί και θα δημιουργηθεί τη στιγμή που ανοίγετε τη φόρμα ή χρησιμοποιώντας ένα κουμπί - ανάλογα με το ποιος το χρειάζεται.

Η δημιουργία ενός πίνακα στη φόρμα πραγματοποιείται μέσω της περιγραφής του πίνακα τιμών ως χαρακτηριστικό:
SelectionTypeArray = Νέος πίνακας; Πίνακας SelectionType.Add(Type("Πίνακας τιμών")); ChoiceTypeDescription = New TypeDescription(ChoiceTypeArray); Πίνακας λεπτομερειών = Νέος πίνακας. Array of Attributes.Add(New Form Attributes("Schedule Table", Description of SelectionType, "", "TZN")); Τώρα πρέπει να δημιουργήσουμε έναν προγραμματικό πίνακα τιμών που περιέχει τα δεδομένα. Εάν ο πίνακας τιμών λαμβάνεται από ένα ερώτημα, τότε όλα είναι λίγο πολύ εντάξει. Εάν ο πίνακας δημιουργείται χειροκίνητα, τότε η έννοια των στηλών που θα περιέχουν αριθμούς ή ημερομηνίες μπορεί να δημιουργηθεί μέσω της «Περιγραφής τύπων». Το θέμα είναι ότι οι στήλες στον πίνακα τιμών πρέπει να έχουν κάποιο τύπο. Εάν, για παράδειγμα, αναμένεται ότι ο χρήστης θα συμπληρώσει δεδομένα σε αυτές τις στήλες διαδραστικά, τότε δεν μπορείτε να προσθέσετε μια στήλη του πίνακα τιμών απλώς με ένα όνομα· πρέπει να έχει έναν τύπο. Λάβετε υπόψη - αυτό είναι πολύ σημαντικό γιατί... Θα μεταφέρουμε αυτούς τους τύπους στον πίνακα της φόρμας.
Δημιουργούμε έναν πίνακα που περιέχει πολλές στήλες:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Νέος πίνακας; ArrayCD.Add(Type("Date")); DescriptionTypesTime = New DescriptionTypes(ArrayCD,CD); TZ = New ValueTable;
TK.Columns.Add("With", DescriptionTypesTime);
TK.Columns.Add("Before", DescriptionTypesTime);
TK.Columns.Add("Όνομα");
TK.Columns.Add("Σημείωση"); // Πλήρες όνομα και Σημείωση - σειρές Στη συνέχεια, θα συμπληρώσουμε τον πίνακα προγράμματος TK με τα απαραίτητα δεδομένα. Λαμβάνουμε έναν πίνακα TK που περιέχει τις απαραίτητες τιμές και είναι έτοιμος να μεταφερθεί στο χαρακτηριστικό φόρμας που δημιουργήθηκε. Για κάθε στήλη από 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;

Αυτός είναι ένας απλός συνδυασμός και το τραπέζι μας είναι έτοιμο.

Για κάθε στήλη από TK. Κύκλος στηλών

NewElement = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "Πίνακας χρονοδιαγράμματος." + Column.Name;
NewElement.Width = 10;
EndCycle;

Σχεδιασμός υπό όρους, αν το χρειαστούμε, το γράφουμε και χειροκίνητα, το μενού εντολών - χειροκίνητα. Οι χειριστές τραπεζιών γράφονται επίσης με το χέρι. Για παράδειγμα, για να προσθέσετε ένα πρόγραμμα χειρισμού συμβάντων για τον πίνακα "Επιλογή":

Πίνακας SelectionFields.SetAction("Selection","TZNSelection");

Για την επεξεργασία αυτού του συμβάντος, προβλέπεται μια ξεχωριστή διαδικασία με τη μορφή μιας διαδικασίας:

&OnClient
Διαδικασία TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//εντολές χειριστή EndProcedure

Σημειώστε ότι οι χειριστές πινάκων ενεργοποιούν τον πελάτη και επομένως πρέπει να έχουν μια εντολή δείκτη μεταγλωττιστή

&OnClient

Λοιπόν, το τελευταίο πράγμα που ήθελα να προσθέσω είναι ότι μετά από όλα αυτά τα βήματα, φροντίστε να θυμάστε να περάσετε τον τελικό πίνακα στο χαρακτηριστικό form:

ValueВFormAttributes(ToR, "ScheduleTable");

Αυτό έχουμε ως αποτέλεσμα:


Και ιδού ο χειρισμός της εκδήλωσης «Επιλογή»:



Επίλογος.

Ελπίζω ότι το άρθρο θα βοηθήσει αυτούς τους προγραμματιστές 1C που αρχίζουν να δημιουργούν πίνακες σε μια φόρμα μέσω προγραμματισμού.

Μπορείτε να κάνετε λήψη μιας επεξεργασίας που δημιουργεί μέσω προγραμματισμού έναν πίνακα τιμών και τον εξάγει σε αυτόν ελεγχόμενη μορφήμε σχόλια που θα σας βοηθήσουν να δημιουργήσετε τους δικούς σας πίνακες.

Εδώ είναι ένα μικρό γεγονός για να ξεκινήσετε - απλά παραδείγματαεργασία με έναν πίνακα τιμών:

1. Δημιουργήστε έναν πίνακα τιμών

ValueTable = New ValueTable;


2. Δημιουργήστε στήλες για τον πίνακα τιμών:

ValueTable.Columns.Add("Όνομα");
Τιμή Table.Columns.Add("Επώνυμο");


3. Προσθέστε νέες σειρές χρησιμοποιώντας ονόματα στηλών:


NewLine.Name = "Βασίλι";
NewLine.LastName = "Pupkin";


4. Πώς να αναζητήσετε μια τιμή στον πίνακα τιμών:
Είναι απαραίτητο να βρείτε μια σειρά πίνακα που περιέχει την επιθυμητή τιμή.

FoundRow = ValueTable.Find(SearchValue);


5. Βρείτε την πρώτη εμφάνιση σε ορισμένες στήλες του πίνακα τιμών

FoundRow = ValueTable.Find(SearchValue, "Supplier, Buyer");


6. Εάν πρέπει να βρείτε όλες τις εμφανίσεις στον πίνακα τιμών:
Χρησιμοποιούμε τη δομή αναζήτησης.

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


Ας δημιουργήσουμε μια δομή αναζήτησης, κάθε στοιχείο της οποίας θα περιέχει το όνομα της στήλης ως κλειδί και την επιθυμητή τιμή σε αυτήν τη στήλη ως τιμή. Περνάμε τη Δομή Αναζήτησης ως παράμετρο στη μέθοδο FindLines(). Ως αποτέλεσμα, έχουμε σειρές πίνακα.
Εάν προσθέσετε μια αναζήτηση για την επιθυμητή τιμή στη δομή αναζήτησης, για παράδειγμα, επίσης στη στήλη Responsible, τότε ως αποτέλεσμα της εφαρμογής της μεθόδου FindLines() θα λάβουμε όλες τις σειρές όπου τόσο ο Υπάλληλος όσο και ο Υπεύθυνος είναι ίσοι με το τιμή αναζήτησης.

7. Πώς να επαναλάβετε έναν πίνακα τιμών με τυχαία σειρά

Για κάθε τρέχουσα σειρά από τον βρόχο πίνακα τιμών
Αναφορά(CurrentRow.Name);
EndCycle;

Το ίδιο πράγμα χρησιμοποιώντας ευρετήρια:

SeniorIndex = ValueTable.Quantity() - 1;
Για λογαριασμό = 0 έως κύκλος SeniorIndex
Αναφορά(TableValues[Account].Name);
EndCycle;


8. Διαγραφή υπάρχουσας γραμμής πίνακα τιμών

ValueTable.Delete(Σειρά προς διαγραφή);

κατά ευρετήριο

ValueTable.Delete(0);


9. Διαγραφή υπάρχουσας στήλης του πίνακα τιμών

ValueTable.Columns.Delete(ColumnDeleted);


κατά ευρετήριο

ValueTable.Columns.Delete(0);

Είναι απαραίτητο να ληφθεί υπόψη ότι η διαγραφή μιας γραμμής (ή στήλης) "από τη μέση" του πίνακα τιμών θα οδηγήσει σε μείωση κατά ένα στους δείκτες των σειρών που βρίσκονται "μετά" τη διαγραφή

10. Πώς να συμπληρώσετε έναν πίνακα τιμών εάν τα ονόματα των στηλών περιέχονται σε μεταβλητές;

NewRow = ValueTable.Add();
NewRow[ColumnName] = Τιμή;


11. Πώς να συμπληρώσετε ολόκληρη τη στήλη του πίνακα τιμών με την επιθυμητή τιμή;
Η στήλη Σημαία Φορολογικής Λογιστικής στον πίνακα τιμών του πίνακα τιμών πρέπει να συμπληρωθεί με την τιμή False

Πίνακας τιμών Συμπληρώστε Τιμές (Λάθος, "Σημαία φορολογικής λογιστικής").


Χρησιμοποιούμε τη μέθοδο FillValues() για τον πίνακα τιμών. Η πρώτη παράμετρος είναι η τιμή που πρέπει να συμπληρωθεί. Η δεύτερη παράμετρος είναι το όνομα της στήλης που θα συμπληρωθεί.

12. Πώς μπορώ να συμπληρώσω τον πίνακα τιμών "Πίνακας παραλήπτη" με δεδομένα από τον πίνακα τιμών "Πίνακας προέλευσης";

Εάν ο πίνακας παραληπτών δεν υπάρχει ακόμη τη στιγμή της λειτουργίας ή οι προηγούμενες στήλες του δεν χρειάζεται να αποθηκευτούν, μπορείτε να τον δημιουργήσετε ως πλήρες αντίγραφο του πρωτοτύπου

Πίνακας παραλήπτη = Πίνακας προέλευσης.Copy();


Επιλογή δεύτερη: ο πίνακας ReceiverTable υπάρχει και θα ήταν κρίμα να χάσουμε τις στήλες και τους περιορισμούς στους τύπους δεδομένων στηλών. Πρέπει όμως να συμπληρώσετε τα δεδομένα για τις στήλες των οποίων τα ονόματα ταιριάζουν με τα ονόματα του πίνακα προέλευσης.

Μερική μεταφορά δεδομένων για στήλες με αντίστοιχα ονόματα:

Για κάθε γραμμή του SourceTable Από τον κύκλο SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Τέλος Κύκλου


Για κάθε γραμμή στον πίνακα προέλευσης, μια νέα σειρά προστίθεται στον πίνακα προορισμού και οι τιμές σε αυτές τις στήλες συμπληρώνονται νέο τραπέζι, τα ονόματα των οποίων ταιριάζουν με τα ονόματα των στηλών στον πίνακα προέλευσης

Εάν οι πίνακες δεν έχουν στήλες με τα ίδια ονόματα, ο πίνακας προορισμού θα καταλήξει να περιέχει τόσες σειρές με μηδενικές τιμές όσες υπήρχαν σειρές στον πίνακα προέλευσης.
Εάν για ορισμένες στήλες με το ίδιο όνομα, ο τύπος τιμής δεδομένων από τον πίνακα προέλευσης δεν εμπίπτει στη διάταξη των επιτρεπόμενων τύπων στηλών του πίνακα προορισμού, θα λάβουμε κενές τιμές σε τέτοια πεδία.
Ας εξετάσουμε την τρίτη περίπτωση. Στην περίπτωση των στηλών με το ίδιο όνομα, η στήλη του πίνακα προορισμού πρέπει να συμμορφώνεται πλήρως με τη στήλη του πίνακα προέλευσης.

Πλήρης αντιγραφή δεδομένων για στήλες με αντίστοιχα ονόματα

Ίδιες στήλες = New Array();

Για κάθε στήλη από SourceTable.Columns Cycle
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Αν ταιριάζουν στήλη<>Απροσδιόριστο Τότε

// Λήψη ιδιοτήτων στήλης.
Όνομα = Στήλη.Όνομα;
ValueType = Column.ValueType;
Header = Column.Header;
Width = Column.Width;

// Αντικατάσταση στηλών στον πίνακα προορισμού.
Index = TableReceiver.Columns.Index(MatchingColumn);

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

// Προσθέστε το επόμενο όνομα των στηλών που ταιριάζουν στον πίνακα.
Same Columns.Add(Column.Name);

τέλος εαν;

EndCycle;

// Κύκλος μεταξύ των σειρών του πίνακα προέλευσης.
Για κάθε γραμμή του SourceTable από τον κύκλο SourceTable

// Προσθήκη νέα γραμμήστον πίνακα παραλαβής.
NewRow = TableReceiver.Add();

// Συμπληρώστε τις τιμές στα αντίστοιχα κελιά.
Για κάθε Όνομα Στήλες Από Στήλες με το ίδιο όνομα Κύκλος
NewRow[ColumnName] = SourceTableRow[ColumnName];

EndCycle;

EndCycle;


Θα πρέπει να αντικαταστήσουμε τη στήλη στον πίνακα προορισμού με μια νέα, οι ιδιότητες της οποίας θα ταιριάζουν πλήρως με τη στήλη του πίνακα προέλευσης.
Επομένως, εάν βρεθεί μια στήλη με το ίδιο όνομα στον πίνακα παραλήπτη, συλλέγουμε όλες τις ιδιότητες για τη νέα στήλη σε μεταβλητές. Στη συνέχεια, διαγράψτε την παλιά και δημιουργήστε μια νέα στήλη. Στη συνέχεια πραγματοποιούμε κύκλο στις σειρές του πίνακα προέλευσης.
Στον βρόχο, προσθέτουμε μια νέα σειρά στον πίνακα λήψης και ανοίγουμε έναν βρόχο πάνω από τα ονόματα των στηλών στον πίνακα των στηλών που ταιριάζουν.
Μέσα σε αυτόν τον ένθετο βρόχο, γεμίζουμε τα κελιά του πίνακα προορισμού με τα δεδομένα του κελιού του πίνακα προέλευσης.

13. Πώς να προσθέσετε στήλες στον πίνακα τιμών "Πίνακας τιμών" με περιορισμούς τύπου;

Όταν προσθέτετε μια στήλη, μπορείτε απλά να καθορίσετε το όνομά της και να αφήσετε άθικτη τη δεύτερη παράμετρο της μεθόδου Add(). Σε αυτήν την περίπτωση, ο τύπος δεδομένων στήλης είναι αυθαίρετος.

Προσθήκη στήλης χωρίς καθορισμό τύπου δεδομένων

// Προσθήκη στήλης χωρίς περιορισμούς στον τύπο.
ValueTable.Columns.Add("Αντικείμενο");


Μπορείτε να συμπληρώσετε την τιμή της δεύτερης παραμέτρου. Εκεί πρέπει να περάσετε μια περιγραφή του τύπου που επιτρέπεται για τη στήλη. Η ίδια η περιγραφή μπορεί να ληφθεί χρησιμοποιώντας τον κατασκευαστή, μεταβιβάζοντάς του ως παράμετρο το όνομα συμβολοσειράς του τύπου (αν υπάρχουν πολλοί τύποι, χωρισμένοι με κόμμα) ή έναν πίνακα έγκυρων τύπων.

Προσθήκη στήλης που υποδεικνύει τον τύπο δεδομένων

// Περιορισμοί στους τύπους δεδομένων στηλών:
// Μόνο στοιχεία του καταλόγου "Counterparties".
Table of Values.Columns.Add("Account", New Description of Types("DirectoryLink.Accounts"));


Εάν μεταξύ των τύπων που επιτρέπονται για τη συμπλήρωση δεδομένων στήλης είναι μια συμβολοσειρά, μπορείτε να περιορίσετε το βάθος (μήκος) του bit, να καθορίσετε τη χρήση μεταβλητού ή σταθερού μήκους. Όλα αυτά επιτυγχάνονται με τη δημιουργία ενός αντικειμένου χρησιμοποιώντας τον κατασκευαστή String Qualifiers. Στη συνέχεια, αυτό το αντικείμενο θα χρησιμοποιηθεί ως μία από τις παραμέτρους του κατασκευαστή TypeDescription.

Χρήση προσδιοριστικών για τον καθορισμό του τύπου δεδομένων μιας στήλης πίνακα τιμών

// Προετοιμάστε και ορίστε περιορισμούς για δεδομένα τύπου String.
Προκριματικά συμβολοσειράς = New String Qualifiers(20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Παρόμοιες ενέργειες μπορούν να εκτελεστούν σε σχέση με τα κριτήρια αριθμού και ημερομηνίας.
Σημείωση: οι περιγραφές τύπων μπορούν να δημιουργηθούν από τον κατασκευαστή είτε «από την αρχή» ή μια υπάρχουσα περιγραφή τύπου μπορεί να χρησιμοποιηθεί ως βάση.

Χρησιμοποιώντας υπάρχουσες δηλώσεις τύπου για τον καθορισμό του τύπου δεδομένων μιας στήλης πίνακα τιμών

// Επέκταση της περιγραφής τύπου που χρησιμοποιήθηκε προηγουμένως.
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("Σημείωση", ExtendedAcceptableTypes);