Μια δυνατότητα λήψης στιγμιότυπου των πιο πρόσφατων καταχωρήσεων στο μητρώο πληροφοριών. Δυνατότητα λήψης ενός τμήματος από τις πιο πρόσφατες εγγραφές στο μητρώο πληροφοριών Τμήμα των πιο πρόσφατων από το έγγραφο του μητρώου πληροφοριών 1c

/
Υλοποίηση επεξεργασίας δεδομένων

Επίλυση συνόλων για περιοδικά μητρώα πληροφοριών

Πεδίο εφαρμογής: διαχειριζόμενη εφαρμογή, εφαρμογή για κινητό, μια κοινή εφαρμογή.

1.1. Για περιοδικά μητρώα πληροφοριών, συνιστάται να επιτρέπονται τα σύνολα εάν πληρούνται όλες οι ακόλουθες προϋποθέσεις:

  • αναμένεται μεγάλος όγκος δεδομένων στο μητρώο (για παράδειγμα, δικαιολογείται για ένα μητρώο με τιμές ειδών, αλλά δεν έχει νόημα για ένα μητρώο με συναλλαγματικές ισοτιμίες).
  • η διαμόρφωση παρέχει ερωτήματα συχνότητας σε φέτες της τελευταίας την τρέχουσα ώρα ή/και σε κομμάτια της πρώτης για να ληφθούν τρέχοντα δεδομένα (δηλαδή όταν η περίοδος δεν προσδιορίζεται στις παραμέτρους των εικονικών πινάκων Φέτα του ΠρώτουΚαι Slice of the Last);
  • ενώ οι υπόλοιπες προϋποθέσεις για εικονικούς πίνακες Φέτα του ΠρώτουΚαι Slice of the Lastρυθμίζονται μόνο σε τιμές μέτρησης (και διαχωριστικά στη λειτουργία Ανεξάρτητα και από κοινού);
  • Οι περιορισμοί πρόσβασης καταχωρήστε τα δεδομένα χρησιμοποιούν μόνο διαστάσεις (και οριοθέτες που βρίσκονται σε λειτουργία Ανεξάρτητα και από κοινού).

Για μια πλήρη λίστα όλων των συνθηκών όταν τα ερωτήματα χρησιμοποιούν σύνολα καταχωρητών πληροφοριών, βλτεκμηρίωση για την πλατφόρμα 1C:Enterprise.

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

Επιλέξτε αντικείμενο. Άρθρο AS Άρθρο, Ονοματολογία Τιμών. Τιμή ΩΣ Τιμή, . . . ΑΠΟ τον κατάλογο. Ονοματολογία AS Ονοματολογία ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ Μητρώο πληροφοριών. ΤιμέςΟνοματολογίες. SliceLast(, PriceView = &Τύπος Τιμών) ΠΩΣ ΤιμέςΟνοματολογίεςΟνοματολογία Τιμών Λογισμικού. Nomenclature = Ονοματολογία. Σύνδεσμος . . .

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

1.2. Επιπλέον, θα πρέπει να εξετάσετε εναλλακτικές επιλογέςνα αναθεωρήσει τα αιτήματα στο μητρώο ώστε να πληρούνται αυτές οι προϋποθέσεις.

Για παράδειγμα, εάν σε ορισμένες περιπτώσεις τα δεδομένα στο μητρώο ΤιμέςΟνοματολογίεςκαταγράφονται σε μελλοντική ημερομηνία και κατά την επιλογή αγαθών σε αυτό το μητρώο, εκτελείται πάντα ένα ερώτημα για την τρέχουσα ημερομηνία (η ημερομηνία προσδιορίζεται ρητά στην παράμετρο εικονικού πίνακα Slice of the Last), τότε τα αποτελέσματα δεν θα επιταχύνουν την εκτέλεση τέτοιων ερωτημάτων. Δεδομένου ότι τα σύνολα δημιουργούνται μόνο για την πρώτη και την τελευταία εγγραφή του μητρώου.

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

2. Σε όλες τις άλλες περιπτώσεις, δεν θα πρέπει να επιτρέπονται σύνολα για περιοδικά μητρώα πληροφοριών. Πρώτα απ 'όλα, αν

  • πιο συχνά (πάντα) γίνονται ερωτήματα στους εικονικούς πίνακες του πρώτου/τελευταίου περιοδικού μητρώου πληροφοριών για μια συγκεκριμένη περίοδο (για παράδειγμα, για την ημερομηνία του εγγράφου).
  • σε συνθήκες για εικονικούς πίνακες Φέτα του ΠρώτουΚαι Slice of the LastΤις περισσότερες φορές (πάντα) χρησιμοποιούνται υποερωτήματα και ενώσεις (κλήσεις "μέσω μιας τελείας" στα πεδία των σχετικών πινάκων). Για παράδειγμα, σε αυτή την περίπτωση:

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

: Φέτα του ΠρώτουΚαι Slice of the LastΑς εξετάσουμε το ενδεχόμενο να εργαστούμε με αυτούς τους εικονικούς πίνακες χρησιμοποιώντας 1C. Χρησιμοποιείται πολύ πιο συχνά Slice of the Last, οπότε ας ξεκινήσουμε με αυτό.

Ένα κομμάτι από το πιο πρόσφατο σάς επιτρέπει να αποκτήσετε την τελευταία εγγραφή του μητρώου πληροφοριών για μια καθορισμένη ημερομηνία στο πλαίσιο των μετρήσεων. Για τον τελευταίο (πρώτο) πίνακα τμημάτων, είναι δυνατό να καθοριστούν δύο παράμετροι σε παρένθεση, διαχωρισμένες με κόμμα. Η πρώτη παράμετρος περιέχει την ημερομηνία κατά την οποία φτιάχτηκε το slice (εάν η παράμετρος δεν έχει καθοριστεί, το slice γίνεται στην τρέχουσα ημερομηνία). Η δεύτερη παράμετρος είναι μια συνθήκη στη γλώσσα ερωτημάτων 1C και σας επιτρέπει να ορίσετε διάφορες επιλογές. Κατά κανόνα, χρησιμοποιούνται μετρήσεις σε αυτές τις επιλογές. Όλα αυτά ακούγονται αρκετά ασαφή, επομένως είναι αδύνατο να γίνει χωρίς παράδειγμα.
Ας έχουμε λοιπόν ένα περιοδικό μητρώο πληροφοριών Τιμήπου αποθηκεύει τις τιμές ανά προϊόν και προμηθευτή. Η συχνότητα του μητρώου είναι ημέρα.

Το μητρώο περιέχει τις ακόλουθες εγγραφές

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

SELECT PriceSliceLast.Period AS Period, PriceSliceLast.Product AS Product, PriceSliceLast.Supplier AS Supplier, PriceSliceLast.Amount AS Amount FROM Πληροφορίες εγγραφής.Price.SliceLast AS PriceSliceLast

Δεδομένου ότι οι παράμετροι δεν καθορίζονται, το slice εκτελείται την τρέχουσα ημερομηνία - 02/01/2017. Ως αποτέλεσμα, έχουμε τον παρακάτω πίνακα

Εδώ βλέπουμε ότι ο συνδυασμός διαστάσεων Προϊόν + Προμηθευτής είναι μοναδικός, δηλ. Για κάθε συνδυασμό μετρήσεων μητρώου, λήφθηκε η εγγραφή με τη μέγιστη ημερομηνία και η ημερομηνία καταγραφής είναι μικρότερη ή ίση με την τρέχουσα ημερομηνία.

Ας υποθέσουμε ότι πρέπει να κάνουμε το ίδιο πράγμα, αλλά θέλουμε να λάβουμε αρχεία με ημερομηνία μικρότερη ή ίση με 15/01/2017. Για να το κάνετε αυτό, πρέπει να αλλάξετε τη σειρά με τον πιο πρόσφατο πίνακα τμημάτων στο αίτημα ως εξής

FROM RegisterInformation.Price.SliceLast(&CutDate,) AS PriceSliceLast

Πριν εκτελέσετε το αίτημα, φυσικά, πρέπει να του περάσετε μια παράμετρο &Ημερομηνία αποκοπής. Τώρα το αποτέλεσμα του ερωτήματος θα μοιάζει με αυτό

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

FROM RegisterInformation.Price.Last Cut(&CutDate, Product = &Product AND Supplier = &Supplier) AS PriceLast Cut

Ως αποτέλεσμα, έχουμε μόνο ένα ρεκόρ

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

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

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

ΣΕ διαμόρφωση δοκιμήςΔιαθέτουμε περιοδικό μητρώο πληροφοριών "Ονοματολογία Τιμών" με τα ακόλουθα δεδομένα πηγής:

Το σχήμα δείχνει επίσης τη δομή των μεταδεδομένων μητρώου. Όπως μπορούμε να δούμε, ο καταχωρητής περιέχει την ιδιότητα «Προϊόν» με τον τύπο αναφοράς «Προϊόντα», καθώς και τον αριθμητικό πόρο «Τιμή» και το χαρακτηριστικό «Παλιά Τιμή».

Ας πούμε ότι σε μια αναφορά πρέπει να πάρουμε ένα κομμάτι από τις πιο πρόσφατες εγγραφές για προϊόντα και τις τιμές τους με την προϋπόθεση ότι η παλιά τιμή είναι μικρότερη ή ίση με 50.

Δύο επιλογές αιτήματος

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

Request = New Request; Αίτηση. Κείμενο = " ΕΠΙΛΟΓΗ | | | | | ΑΠΟ | Μητρώο Πληροφοριών. ΤιμέςΟνοματολογίες. Φέτα από τις πιο πρόσφατες ΠΩΣ ΤιμέςΟνοματολογίαΦέτα από τις τελευταίες|ΠΟΥ | ΤιμέςΟνοματολογίαΦέταΤελευταία. Παλιά τιμή< = 50 " ;

Δώστε προσοχή στην κατάσταση στην ενότητα "ΠΟΥ". Αυτό είναι το κύριο λάθος! Αυτό το ερώτημα δεν θα επιστρέψει ούτε μία εγγραφή και να γιατί: όταν χρησιμοποιούνται εικονικοί πίνακες, στην περίπτωσή μας "Last Slice", τα δεδομένα λαμβάνονται πρώτα από τη βάση δεδομένων σύμφωνα με τις συνθήκες που περιγράφονται στο εικονικό τραπέζι, και στη συνέχεια εκτελούνται οι ενέργειες που περιγράφονται στο κείμενο της αίτησης (ομαδοποιήσεις, συνθήκες στην ενότητα "WHERE", ταξινόμηση κ.λπ.).

Επομένως, στο παράδειγμά μας, το αίτημα δεν επιστρέφει αποτέλεσμα. Πρώτα, λαμβάνει ένα κομμάτι από το τελευταίο και μόνο στη συνέχεια ορίζει τη συνθήκη στο χαρακτηριστικό "Old Price". Έτσι φαίνεται στο διάγραμμα:

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

Request = New Request; Αίτηση. Κείμενο = " ΕΠΙΛΟΓΗ ΤιμέςΟνοματολογίαΦέταΤελευταία. Περίοδος, ΤιμέςΟνοματολογίαΦέταΤελευταία. Προϊόν, ΤιμέςΟνοματολογίαΦέταΤελευταία. Τιμή, ΤιμέςΟνοματολογίαΦέταΤελευταία. Παλιά τιμή ΑΠΟ Μητρώο Πληροφοριών. ΤιμέςΟνοματολογίες. SliceLast(, OldPrice< = 50 ) ΠΩΣ ΤΙΜΕΣΟνοματολογίαSliceΤελευταία"

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

Αποτελέσματα

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

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

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

Διατύπωση του προβλήματος

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

Λύση

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

ΕΠΙΛΕΞΤΕ Πωλήσεις Αγαθών και Υπηρεσιών Σύνδεσμος, Πωλήσεις Αγαθών και Υπηρεσιών Νόμισμα, ΜΕΓΙΣΤΗ (Τιμές νομισμάτων. Περίοδος) AS Period PLACE IN TPperiods Ρυθμίσεις Τιμές ΑΠΟ Έγγραφο Πωλήσεις αγαθών και υπηρεσιών ΠΩΣ ΑΦΥΓΑΝ Πωλήσεις αγαθών και υπηρεσιών Μητρώο πληροφοριών Συναλλαγματικές ισοτιμίες ΩΣ Συναλλαγματικές ισοτιμίες ON Sales of Goods Services.Νόμισμα = Τιμές νομισμάτων.Νόμισμα και πωλήσεις αγαθώνΥπηρεσίες.Ημερομηνία >= Τιμές νομισμάτων.Περιόδου GROUP Λογισμικό Πωλήσεις αγαθών και υπηρεσιών. Σύνδεσμος, Πωλήσεις αγαθών και υπηρεσιών. Νόμισμα. ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT VTPperiodsSetting Rates.Link, VTPperiodsSetting Rates.Currency, RatesCurrency.Rate FROM VTPperiodsSetting Rates AS VTPperiodsSetting Rates CONNECTIONInformation Τιμές νομισμάτων ΩΣ Τιμές νομισμάτων ON VTPperiodsRate Settings.Period = Currency Rates.Period AND VTPperiodsRate Settings.Currency =Currency Rates.Currency

Διαδικασία υποβολής αιτήματος:

  1. Λήψη της περιόδου για τον καθορισμό της ισοτιμίας για κάθε έγγραφο.Τα έγγραφα συνδέονται με τον ΦΥΣΙΚΟ Πίνακα «Τιμές Νομίσματος». Εδώ θα πρέπει να δώσετε προσοχή στις συνθήκες σύνδεσης. Τα νομίσματα πρέπει να είναι ίσα και η ημερομηνία παραστατικού >= η περίοδος του μητρώου πληροφοριών.
    Ως αποτέλεσμα μιας τέτοιας σύνδεσης, για κάθε έγγραφο, θα ληφθεί ένα σύνολο σειρών που ικανοποιούν την προϋπόθεση: όλα τα αρχεία συναλλαγματικών ισοτιμιών για το νόμισμα του εγγράφου, που καταρτίζονται το αργότερο μέχρι την ημερομηνία του εγγράφου.
    Το τελευταίο βήμα θα είναι να ομαδοποιήσετε τις σειρές για να λάβετε τη μέγιστη περίοδο ποσοστού. Ως αποτέλεσμα, για κάθε έγγραφο θα λαμβάνεται η απαιτούμενη περίοδος για τον καθορισμό της συναλλαγματικής ισοτιμίας για το επιθυμητό νόμισμα (η μέγιστη ημερομηνία για τον καθορισμό της ισοτιμίας, αλλά όχι μεγαλύτερη από την ημερομηνία του παραστατικού). Το αποτέλεσμα τοποθετείται στον προσωρινό πίνακα VTPeriodsSettingRates.
  2. Λήψη μαθήματος.Ο προσωρινός πίνακας VTPperiodsSetting Rates είναι συνδεδεμένος με τον ΦΥΣΙΚΟ Πίνακα “Currency Rates”. Η σύνδεση πραγματοποιείται σύμφωνα με το νόμισμα παραστατικού και την περίοδο ρύθμισης της τιμής που ορίζεται στον δεύτερο προσωρινό πίνακα.