Υπόλοιπα και τζίρος εικονικού τραπεζιού 1c. Καρτέλα Παρτίδα ερωτήματος
Αποφάσισα να κάνω τη συνεισφορά μου και να περιγράψω εκείνα τα χαρακτηριστικά της γλώσσας που δεν συζητήθηκαν στα παραπάνω άρθρα. Το άρθρο απευθύνεται σε αρχάριους προγραμματιστές.
1. Σχέδιο «IZ».
Για να λάβετε δεδομένα από τη βάση δεδομένων, δεν είναι καθόλου απαραίτητο να χρησιμοποιήσετε την κατασκευή «FROM».
Παράδειγμα: Πρέπει να επιλέξουμε όλες τις πληροφορίες για τις τράπεζες από τον κατάλογο τραπεζών.
Αίτηση:
SELECT Directory.Banks.*
Επιλέγει όλα τα πεδία από τον κατάλογο Τραπεζών. Και είναι παρόμοιο με το αίτημα:
SELECT Banks.* FROM Directory.Banks AS Banks
2. Παραγγελία δεδομένων ανά πεδίο αναφοράς
Όταν πρέπει να οργανώσουμε τα δεδομένα ερωτήματος κατά πρωτόγονους τύπους: "String", "Number", "Date", κ.λπ., τότε όλα λύνονται χρησιμοποιώντας την κατασκευή "ORDER BY" εάν χρειάζεται να ταξινομήσετε τα δεδομένα με ένα πεδίο αναφοράς; Το πεδίο αναφοράς είναι ένας σύνδεσμος, ένα μοναδικό αναγνωριστικό, δηλ. Σε γενικές γραμμές, κάποιο αυθαίρετο σύνολο χαρακτήρων και συνηθισμένη σειρά μπορεί να παράγει ένα αποτέλεσμα που δεν είναι απολύτως αναμενόμενο. Για την παραγγελία πεδίων αναφοράς, χρησιμοποιείται η κατασκευή "AUTO ORDER". Για να γίνει αυτό, πρέπει πρώτα να παραγγείλετε τα δεδομένα απευθείας από τον τύπο αναφοράς χρησιμοποιώντας την κατασκευή "ORDER BY" και, στη συνέχεια, την κατασκευή "AUTO ORDER".
Σε αυτήν την περίπτωση, για τα έγγραφα η παραγγελία θα γίνει με τη σειρά "Ημερομηνία->Αριθμός", για βιβλία αναφοράς στην "Κύρια προβολή". Εάν η παραγγελία δεν γίνεται με πεδία αναφοράς, τότε δεν συνιστάται η χρήση της κατασκευής "AUTO ORDER".
Σε ορισμένες περιπτώσεις, η κατασκευή "AUTO ORDER" μπορεί να επιβραδύνει τη διαδικασία επιλογής. Ομοίως, μπορείτε να ξαναγράψετε χωρίς αυτόματη παραγγελία για έγγραφα:
3.Λήψη αναπαράστασης κειμένου τύπου αναφοράς. Σχέδιο «ΠΑΡΟΥΣΙΑΣΗ».
Όταν χρειάζεται να εμφανίσετε ένα πεδίο τύπου αναφοράς, για παράδειγμα, το πεδίο "Τράπεζα", το οποίο είναι ένας σύνδεσμος προς ένα στοιχείο του καταλόγου "Τράπεζες", πρέπει να κατανοήσετε ότι κατά την εμφάνιση αυτού του πεδίου, ένα δευτερεύον ερώτημα στο " Ο κατάλογος Banks" θα εκτελεστεί αυτόματα για να αποκτήσετε μια προβολή του καταλόγου. Αυτό θα επιβραδύνει την έξοδο δεδομένων. Για να αποφύγετε αυτό, πρέπει να χρησιμοποιήσετε την κατασκευή «ΠΑΡΟΥΣΙΑΣΗ» στο αίτημα για να αποκτήσετε αμέσως μια αναπαράσταση του αντικειμένου και στη συνέχεια να το εμφανίσετε για προβολή.
Στο σύστημα σύνθεσης δεδομένων, αυτός ο μηχανισμός χρησιμοποιείται από προεπιλογή, αλλά όταν δημιουργείτε διατάξεις σε κελιά, θα πρέπει να καθορίσετε την αναπαράσταση του πεδίου αναφοράς και, για παράδειγμα, να τοποθετήσετε τον ίδιο τον σύνδεσμο στη μεταγραφή.
4. Προϋπόθεση για δεδομένα δειγματοληψίας σύμφωνα με πρότυπο.
Για παράδειγμα, πρέπει να αποκτήσετε κινητά τηλέφωνα υπαλλήλων της φόρμας (8 -123- 456-78-912). Για να το κάνετε αυτό, πρέπει να ορίσετε την ακόλουθη συνθήκη στο αίτημα:
SELECT Employee.Name, Employee.Phone AS Phone FROM Directory.Employees AS Employees WHERE Phone LIKE "_-___-___-__-__"
Ο χαρακτήρας "_" είναι χαρακτήρας υπηρεσίας και αντικαθιστά οποιονδήποτε χαρακτήρα.
5. Ταυτόχρονη χρήση συνόλων και ομαδοποιήσεων.
Τα σύνολα χρησιμοποιούνται συχνά σε συνδυασμό με ομαδοποιήσεις· σε αυτήν την περίπτωση, οι συγκεντρωτικές συναρτήσεις ενδέχεται να μην προσδιορίζονται στα σύνολα.
SELECT Παροχή Υπηρεσιών.Οργανισμός AS Οργανισμός, Παροχή Υπηρεσιών.Ονοματολογία AS Ονοματολογία, SUM(Παροχή Υπηρεσιών.Ποσό Εγγράφου) AS Άθροισμα Εγγράφου ΑΠΟ Έγγραφο.Παροχή Υπηρεσιών AS Παροχή Υπηρεσιών ΟΜΑΔΑ ΑΝΑ Παροχή Υπηρεσιών.Οργάνωση, Παροχή Υπηρεσιών
Σε αυτήν την περίπτωση, το ερώτημα θα επιστρέψει σχεδόν το ίδιο με το ακόλουθο ερώτημα:
SELECT Παροχή Υπηρεσιών.Οργανισμός AS Οργανισμός, Παροχή Υπηρεσιών.Ονοματολογία AS Ονοματολογία, Παροχή Υπηρεσιών.Ποσό Εγγράφου ΩΣ Ποσό Εγγράφου ΑΠΟ Έγγραφο.Παροχή Υπηρεσιών ΩΣ Παροχή Υπηρεσιών ΑΠΟΤΕΛΕΣΜΑΤΑ ΠΟΣΟ (Ποσό Εγγράφου) ΚΑΤΑ, Οργανισμός, GENALER Ονοματολογία
Μόνο το πρώτο ερώτημα θα συμπτύξει εγγραφές με την ίδια ονοματολογία.
6. Αποαναφορά πεδίων.
Η αναφορά σε πεδία μέσω κουκκίδας ονομάζεται λειτουργία αποαναφοράς πεδίου αναφοράς. Για παράδειγμα Πληρωμή.Οργανισμός.Διοικητική Μονάδα. Στην περίπτωση αυτή, στο πεδίο αναφοράς «Οργανισμός» του παραστατικού «Πληρωμή», αναφέρεται σε άλλον πίνακα «Οργανισμοί», στον οποίο θα προκύπτει η τιμή του χαρακτηριστικού «Διαχειριστική Μονάδα». Είναι σημαντικό να κατανοήσουμε ότι κατά την πρόσβαση σε πεδία μέσω μιας κουκκίδας, η πλατφόρμα δημιουργεί έμμεσα ένα υποερώτημα και ενώνει αυτούς τους πίνακες.
Αίτηση:
Μπορεί να αναπαρασταθεί ως:
SELECT Payment.Link, Payment.Organization, Payment.Organization, Οργανισμοί. AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Organizations Software Payment.Organization = Οργανισμοί.Σύνδεσμος
Κατά την αποαναφορά πεδίων αναφοράς ενός σύνθετου τύπου, το πλαίσιο επιχειρεί να δημιουργήσει σιωπηρές συνδέσεις σε όλους τους πίνακες που αποτελούν μέρος του τύπου αυτού του πεδίου. Σε αυτήν την περίπτωση, το ερώτημα δεν θα είναι βέλτιστο. Εάν είναι ξεκάθαρα γνωστό για ποιον τύπο πεδίου είναι, είναι απαραίτητο να περιοριστούν αυτά τα πεδία ανά τύπο με μια κατασκευή ΕΞΠΡΕΣ().
Για παράδειγμα, υπάρχει ένα μητρώο συσσώρευσης «Μη κατανεμημένες πληρωμές», όπου πολλά έγγραφα μπορούν να λειτουργήσουν ως καταχωρητής. Σε αυτήν την περίπτωση, είναι λάθος να λαμβάνετε τις τιμές των στοιχείων καταχωρητή με αυτόν τον τρόπο:
SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments
θα πρέπει να περιορίσετε τον τύπο του σύνθετου πεδίου σε καταγραφικό:
SELECT EXPRESS(UnallocatedPayments.Register AS Document.Payment).Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments
7. Κατασκευή "WHERE"
Με μια αριστερή ένωση δύο πινάκων, όταν επιβάλλετε μια συνθήκη "WHERE" στον δεξιό πίνακα, θα λάβουμε ένα αποτέλεσμα παρόμοιο με το αποτέλεσμα με μια εσωτερική ένωση πινάκων.
Παράδειγμα. Είναι απαραίτητο να επιλέξετε όλους τους Πελάτες από τον Κατάλογο Πελατών και για όσους πελάτες έχουν παραστατικό πληρωμής με την τιμή του χαρακτηριστικού "Οργανισμός" = &Οργανισμός να εμφανιστεί το έγγραφο "Πληρωμή", για όσους δεν έχουν, μην το εμφανίσετε.
Το αποτέλεσμα του ερωτήματος θα επιστρέψει εγγραφές μόνο για εκείνους τους πελάτες που είχαν πληρωμή ανά οργανισμό στην παράμετρο και θα φιλτράρει άλλους πελάτες. Ως εκ τούτου, πρέπει πρώτα να λάβετε όλες τις πληρωμές για τον οργανισμό "τόσο και αυτό" σε έναν προσωρινό πίνακα και, στη συνέχεια, να τον συνδέσετε στον κατάλογο "Πελάτες" χρησιμοποιώντας μια αριστερή σύνδεση.
ΕΠΙΛΕΞΤΕ Πληρωμή.Σύνδεσμος ΩΣ Πληρωμή, Πληρωμή.Μέτοχος ΩΣ Πελάτης ΤΟΠΟΣ ΠΛΗΡΩΜΩΝ ΑΠΟ Έγγραφο.Πληρωμή ΩΣ Πληρωμή ΟΠΟΥ Πληρωμή.Κατάστημα = &Υποκατάστημα; ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Payment FROM Directory .Clients AS Πελάτες ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ toppayments AS topayments ΛΟΓΙΣΜΙΚΟ Clients.Link = topayments.Client
Μπορείτε να ξεπεράσετε αυτήν την κατάσταση με άλλο τρόπο. Είναι απαραίτητο να επιβληθεί η συνθήκη "WHERE" απευθείας στη σχέση μεταξύ των δύο πινάκων. Παράδειγμα:
SELECT Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers LEFT CONNECTION Document.Payment AS Payment Software (Clients.Link = Payment.Client AND Payment.Client.Name LIKE "Sugar Packet", ClientsLinkY) ClientsLinkY) Σύνδεσμος
8. Συνδέεται με ένθετους και εικονικούς πίνακες
Ένθετα ερωτήματασυχνά απαραίτητο για την ανάκτηση δεδομένων με βάση κάποια συνθήκη. Εάν στη συνέχεια τους χρησιμοποιήσετε σε συνδυασμό με άλλους πίνακες, αυτό μπορεί να επιβραδύνει σημαντικά την εκτέλεση του ερωτήματος.
Για παράδειγμα, πρέπει να λάβουμε το Υπόλοιπο Ποσού από την τρέχουσα ημερομηνία για ορισμένους πελάτες.
ΕΠΙΛΟΓΗ UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (SELECT Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQueryINUstedQueryRegisteryAccumAculation. yments BY Nested Request.Link = UnallocatedPaymentsBalances. Πελάτης
Κατά την εκτέλεση ενός τέτοιου ερωτήματος, το εργαλείο βελτιστοποίησης DBMS ενδέχεται να κάνει σφάλματα κατά την επιλογή ενός σχεδίου, τα οποία θα οδηγήσουν σε μη βέλτιστη εκτέλεση του ερωτήματος. Όταν συνδέετε δύο πίνακες, το εργαλείο βελτιστοποίησης DBMS επιλέγει έναν αλγόριθμο σύνδεσης πινάκων με βάση τον αριθμό των εγγραφών και στους δύο πίνακες. Εάν υπάρχει ένθετο ερώτημα, είναι εξαιρετικά δύσκολο να προσδιοριστεί ο αριθμός των εγγραφών που θα επιστρέψει το ένθετο ερώτημα. Επομένως, θα πρέπει πάντα να χρησιμοποιείτε προσωρινούς πίνακες αντί για ένθετα ερωτήματα. Ας ξαναγράψουμε λοιπόν το αίτημα.
SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients WHERE
Clients.Link B (&Clients) ; ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT JOIN RegisterAcumulations.UnallocatedPayments.Balances IN (SELECT tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients
Σε αυτήν την περίπτωση, ο βελτιστοποιητής θα μπορεί να προσδιορίσει πόσες εγγραφές χρησιμοποιεί ο προσωρινός πίνακας tClients και θα μπορεί να επιλέξει τον βέλτιστο αλγόριθμο για τη σύνδεση πινάκων.
Εικονικοί πίνακες , σας επιτρέπει να λαμβάνετε πρακτικά έτοιμα δεδομένα για τις περισσότερες εφαρμοζόμενες εργασίες. Αυτοί οι πίνακες δεν είναι φυσικοί, αλλά καταρτίζονται από το σύστημα on the fly, δηλ. Κατά τη λήψη δεδομένων από εικονικούς πίνακες, το σύστημα συλλέγει δεδομένα από πίνακες τελικών καταχωρητών, συγκεντρώνει, ομαδοποιεί και τα εκδίδει στον χρήστη.
Εκείνοι. Κατά τη σύνδεση σε έναν εικονικό πίνακα, πραγματοποιείται σύνδεση σε ένα δευτερεύον ερώτημα. Σε αυτήν την περίπτωση, το εργαλείο βελτιστοποίησης DBMS μπορεί επίσης να επιλέξει ένα μη βέλτιστο σχέδιο σύνδεσης. Εάν το ερώτημα δεν δημιουργείται αρκετά γρήγορα και το ερώτημα χρησιμοποιεί ενώσεις σε εικονικούς πίνακες, τότε συνιστάται να μετακινήσετε την πρόσβαση στους εικονικούς πίνακες σε έναν προσωρινό πίνακα και στη συνέχεια να κάνετε μια ένωση μεταξύ δύο προσωρινών πινάκων. Ας ξαναγράψουμε το προηγούμενο αίτημα.
SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients INDEX BY Link WHERE
Clients.Link B (&Clients) ; ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client PLACE υπόλοιπα FROM RegisterAccumulations.UnallocatedPayments.Balances(, Client B ( ΕΠΙΛΕΞΤΕ tClients Σύνδεσμος ΑΠΟ tClients)) AS UnallocatedPaymentsBalances; ////////////////////////////////////////////////////////////////// ///////////////////////// SELECT tClients.Link, toRemainders.AmountRemaining AS AmountRemaining FROM tClients AS tClients LEFT JOIN toRemainders AS Remainders BY tnkC. = tRemainings.Πελάτης
9.Έλεγχος του αποτελέσματος του αιτήματος.
Το αποτέλεσμα του ερωτήματος μπορεί να είναι κενό. Για να ελέγξετε για κενές τιμές, χρησιμοποιήστε την ακόλουθη κατασκευή:
ResRequest = Request.Execute(); Αν resQuery.Empty() Τότε Return; τέλος εαν;
Μέθοδος Αδειάζω()πρέπει να χρησιμοποιείται πριν από τις μεθόδους Επιλέγω()ή Ξεφορτώνω(), καθώς η ανάκτηση της συλλογής απαιτεί χρόνο.
Δεν είναι αποκάλυψη σε κανέναν ότι είναι εξαιρετικά ανεπιθύμητο να χρησιμοποιούνται ερωτήματα σε βρόχο. Αυτό μπορεί να επηρεάσει κρίσιμα τον χρόνο λειτουργίας μιας συγκεκριμένης λειτουργίας. Είναι πολύ επιθυμητό να λαμβάνετε όλα τα δεδομένα στο αίτημα και στη συνέχεια να τα επεξεργαστείτε σε βρόχο. Αλλά μερικές φορές υπάρχουν περιπτώσεις που καθίσταται αδύνατο να μετακινήσετε το αίτημα εκτός του βρόχου. Σε αυτήν την περίπτωση, για βελτιστοποίηση, μπορείτε να μετακινήσετε τη δημιουργία του ερωτήματος εκτός του βρόχου και στον βρόχο, να αντικαταστήσετε τις απαραίτητες παραμέτρους και να εκτελέσετε το ερώτημα.
Request = Νέο αίτημα; Query.Text = "SELECT | Clients.Link, | Clients.BirthDate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; Για κάθε γραμμή FROM TableClients βρόχος Query.SetParameter("Client", Client); QueryResult = Query.Execute().Select(); EndCycle;
Αυτό θα εξοικονομήσει το σύστημα από τον συντακτικό έλεγχο του αιτήματος σε βρόχο.
11. Κατασκευή «HAVING».
Ένα σχέδιο που είναι αρκετά σπάνιο σε αιτήματα. Σας επιτρέπει να επιβάλλετε συνθήκες στις τιμές των συγκεντρωτικών συναρτήσεων (SUM, MINIMUM, AVERAGE, κ.λπ.). Για παράδειγμα, πρέπει να επιλέξετε μόνο εκείνους τους πελάτες των οποίων το ποσό πληρωμής τον Σεπτέμβριο ήταν πάνω από 13.000 ρούβλια. Εάν χρησιμοποιείτε τη συνθήκη "WHERE", θα πρέπει πρώτα να δημιουργήσετε έναν προσωρινό πίνακα ή ένα ένθετο ερώτημα, να ομαδοποιήσετε τις εγγραφές εκεί κατά ποσό πληρωμής και στη συνέχεια να εφαρμόσετε τη συνθήκη. Η κατασκευή "HAVING" θα βοηθήσει να αποφευχθεί αυτό.
SELECT Payment.Customer, AMOUNT(Payment.Amount) AS Amount FROM Document.Payment AS Payment WHERE MONTH(Payment.Date) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Amount) > 13000
Στον κατασκευαστή, για να το κάνετε αυτό, απλώς μεταβείτε στην καρτέλα "Συνθήκες", προσθέστε μια νέα συνθήκη και επιλέξτε το πλαίσιο ελέγχου "Προσαρμοσμένο". Τότε απλά γράψε Amount(Payment.Amount) > 13000
12. NULL τιμή
Δεν θα περιγράψω εδώ τις αρχές της λογικής τριών αξιών στη βάση δεδομένων· υπάρχουν πολλά άρθρα για αυτό το θέμα. Εν συντομία για το πώς ΜΗΔΕΝΙΚΟμπορεί να επηρεάσει το αποτέλεσμα του ερωτήματος. Η τιμή NULL δεν είναι στην πραγματικότητα τιμή και το γεγονός ότι η τιμή είναι απροσδιόριστη είναι άγνωστο. Επομένως, οποιαδήποτε πράξη με NULL επιστρέφει NULL, είτε είναι πρόσθεση, αφαίρεση, διαίρεση ή σύγκριση. Μια τιμή NULL δεν μπορεί να συγκριθεί με μια τιμή NULL επειδή δεν ξέρουμε τι να συγκρίνουμε. Εκείνοι. Και οι δύο αυτές συγκρίσεις είναι: NULL = NULL, NULL<>Το NULL δεν είναι Σωστό ή Λάθος, είναι άγνωστο.
Ας δούμε ένα παράδειγμα.
Για όσους πελάτες δεν έχουν πληρωμές, πρέπει να εμφανίσουμε το πεδίο «Υπογραφή» με την τιμή «Χωρίς πληρωμές». Επιπλέον, γνωρίζουμε σίγουρα ότι έχουμε τέτοιους πελάτες. Και για να αντικατοπτρίσουμε την ουσία όσων έγραψα παραπάνω, ας το κάνουμε με αυτόν τον τρόπο.
ΕΠΙΛΕΞΤΕ "Χωρίς πληρωμές" AS Χαρακτηριστικό, NULL AS Έγγραφο ΤΟΠΟΣ topπληρωμές. ////////////////////////////////////////////////////////////////// ///////////////////////// ΕΠΙΛΕΞΤΕ Πελάτες.Σύνδεση ΩΣ Πελάτης, Πληρωμή.Σύνδεσμος ΠΩΣ Η Πληρωμή ΘΕΣΕ tClientPayment ΑΠΟ τον Κατάλογο.Πελάτες ΩΣ Πελάτες ΑΦΗΣΕΤΕ Έγγραφο ΣΥΝΔΕΣΗΣ. Πληρωμή AS Λογισμικό πληρωμών Clients.Link = Πληρωμή.Μέτοχος; ////////////////////////////////////////////////////////////////// ////////////////////////// ΕΠΙΛΕΞΤΕ tClientPayment.Client FROM tClientPayment AS tClientPayment ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ tPayment AS tΠληρωμή ΑΠΟ tClientPayment.Payment = tPayment.
Δώστε προσοχή στον δεύτερο προσωρινό πίνακα tClientPayment. Με το αριστερό join επιλέγω όλους τους πελάτες και όλες τις πληρωμές για αυτούς τους πελάτες. Για εκείνους τους πελάτες που δεν έχουν πληρωμές, το πεδίο «Πληρωμή» θα είναι NULL. Ακολουθώντας τη λογική, στον πρώτο προσωρινό πίνακα «tPayments» όρισα 2 πεδία, το ένα από αυτά NULL, τη δεύτερη γραμμή «Δεν υπάρχουν πληρωμές». Στον τρίτο πίνακα, συνδέω τους πίνακες "tClientPayment" και "tPayment" χρησιμοποιώντας τα πεδία "Payment" και "Document" με μια εσωτερική ένωση. Γνωρίζουμε ότι στον πρώτο πίνακα το πεδίο «Έγγραφο» είναι NULL και στον δεύτερο πίνακα όσοι δεν έχουν πληρωμές στο πεδίο «Πληρωμή» είναι επίσης NULL. Τι θα μας επιστρέψει μια τέτοια σύνδεση; Αλλά δεν θα επιστρέψει τίποτα. Επειδή η σύγκριση NULL = NULL δεν αξιολογείται σε True.
Για να επιστρέψει το αίτημα το αναμενόμενο αποτέλεσμα, ας το ξαναγράψουμε:
ΕΠΙΛΕΞΤΕ "Χωρίς πληρωμές" ΩΣ Χαρακτηριστικό, VALUE(Document.Payment.EmptyLink) AS ΤΟΠΟΣ Εγγράφου στιςΠληρωμές. ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) ΠΩΣ Πληρωμή PUT tClientPayment FROM Directory.Clients AS Clients ΑΡΙΣΤΕΡΑ ΣΥΝΔΕΣΗ Έγγραφο.Πληρωμή ΩΣ Πληρωμή ΑΠΟ Πελάτες.Σύνδεσμος = Πληρωμή.Μέτοχος; ////////////////////////////////////////////////////////////////// ////////////////////////// ΕΠΙΛΕΞΤΕ tClientPayment.Client FROM tClientPayment AS tClientPayment ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ tPayment AS tΠληρωμή ΑΠΟ tClientPayment.Payment = tPayment.
Τώρα, στον δεύτερο προσωρινό πίνακα, έχουμε υποδείξει ότι εάν το πεδίο "Πληρωμή" είναι NULL, τότε αυτό το πεδίο = ένας κενός σύνδεσμος προς το παραστατικό πληρωμής. Στον Πρώτο πίνακα αντικαταστήσαμε επίσης το NULL με μια κενή αναφορά. Τώρα η σύνδεση περιλαμβάνει πεδία που δεν είναι NULL και το αίτημα θα επιστρέψει το αναμενόμενο αποτέλεσμα.
Όλα τα αιτήματα που περιλαμβάνονται στο άρθρο αντικατοπτρίζουν τις καταστάσεις που θα ήθελα να εξετάσω και τίποτα περισσότερο. ΣΧΕΤΙΚΑ ΜΕ Μπορεί να μην είναι παραληρηματικές ή μη βέλτιστες, το κυριότερο είναι ότι αντικατοπτρίζουν την ουσία του παραδείγματος.
13. Ένα μη τεκμηριωμένο χαρακτηριστικό του σχεδίου "ΕΠΙΛΟΓΗ ΟΤΑΝ...ΤΟΤΕ...ΤΕΛΟΣ".
Στην περίπτωση που είναι απαραίτητο να περιγράψουμε την κατασκευή "Συνθήκες" στο αίτημα, χρησιμοποιούμε την τυπική σύνταξη:
ΕΠΙΛΕΞΤΕ ΕΠΙΛΟΓΗ ΟΤΑΝ Χρήστες.Όνομα = "Vasya Pupkin" ΜΕΤΑ "Ο αγαπημένος μας υπάλληλος" ΑΛΛΟ "Δεν το ξέρουμε αυτό" ΤΕΛΟΣ ΩΣ Πεδίο1 ΑΠΟ Κατάλογο. Χρήστες ΩΣ Χρήστες
Τι γίνεται όμως αν, για παράδειγμα, χρειαστεί να λάβουμε το όνομα του μήνα σε ένα αίτημα; Το να γράψουμε μια τεράστια κατασκευή σε ένα αίτημα είναι άσχημο και χρονοβόρο, επομένως αυτή η μορφή γραφής παραπάνω μπορεί να μας βοηθήσει:
ΕΠΙΛΕΞΤΕ ΜΗΝΑ(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) WHEN 1 ΤΟΤΕ "Ιανουάριος" WHEN 2 THE "February" WHEN 3 THON "March" WHEN 4 THE "April" WHEN 5 THEN "May" THEJNH ΟΤΑΝ 8 ΤΟΤΕ "Αύγουστος" ΠΟΤΕ 9 ΤΟΤΕ "Σεπτέμβριος" ΠΟΤΕ 10 ΤΟΤΕ "Οκτώβριος" ΠΟΤΕ 11 ΤΟΤΕ "Νοέμβριος" ΟΤΑΝ 12 ΤΟΤΕ Ο "Δεκέμβριος" ΤΕΛΕΙΩΝΕΙ ΩΣ Μήνας
Τώρα ο σχεδιασμός φαίνεται λιγότερο περίπλοκος και είναι εύκολο να κατανοηθεί.
14. Μαζική εκτέλεση ερωτήματος.
Για να μην πολλαπλασιάζονται τα αιτήματα, μπορείτε να δημιουργήσετε ένα μεγάλο αίτημα, να το χωρίσετε σε πακέτα και να εργαστείτε με αυτό.
Για παράδειγμα, πρέπει να λάβω τα ακόλουθα πεδία από τον κατάλογο "Χρήστες": "Ημερομηνία Γέννησης" και τους διαθέσιμους ρόλους για κάθε χρήστη. μεταφορτώστε το σε διαφορετικά τμήματα πίνακα στη φόρμα. Φυσικά, μπορείτε να το κάνετε αυτό σε ένα αίτημα, στη συνέχεια θα πρέπει να επαναλάβετε τις εγγραφές ή να τις συμπτύξετε ή μπορείτε να κάνετε το εξής:
SELECT Users.Link AS Πλήρες όνομα, Users.Date of Birth, Users.Role PUT vtUsers FROM Directory.Users AS Users; ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT tueUsers.Ονοματεπώνυμο, tueUsers.Ημερομηνία γέννησης ΑΠΟ tueUsers ΩΣ tueUsers ΟΜΑΔΑ ΑΝΑ tueUsers.πλήρες όνομα, tueUsers . Ημερομηνια γεννησης; ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT wUsers.Full Name, wUsers.Role FROM wUsers AS wUsers GROUP BY WUsers. Πλήρες όνομα, wUsers. Ημερομηνία της Γέννησης
tPackage = Request.ExecutePackage();
TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();
Όπως μπορούμε να δούμε, το ερώτημα μπορεί να εκτελεστεί σε δέσμη και το αποτέλεσμα μπορεί να επεξεργαστεί ως πίνακας. Σε ορισμένες περιπτώσεις είναι πολύ βολικό.
15. Προϋποθέσεις σε αίτηση παρτίδας
Για παράδειγμα, έχουμε ένα αίτημα παρτίδας, όπου πρώτα παίρνουμε τα πεδία: «Όνομα, Ημερομηνία Γέννησης, Κωδικός» από τον κατάλογο «Χρήστες» και θέλουμε να λάβουμε εγγραφές με προϋποθέσεις για αυτά τα πεδία από τον κατάλογο «Άτομα».
SELECT Users.Individual.Name AS Όνομα, Users.Individual.Date of Birth AS Date of Birth, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; ////////////////////////////////////////////////////////////////// ////////////////////////// SELECT Individuals. Σύνδεση AS Individual FROM Directory. Individuals AS Individuals
Μπορείτε να επιβάλετε όρους όπως αυτός:
WHERE Individuals.Code IN (SELECT vtUsers.Code FROM vtUsers) AND Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) AND Individuals.BirthDate IN (SELECT vtUsers.DateBirth FROM tv)
Και μπορείτε να το κάνετε ως εξής:
WHERE (Individuals.Code, Individuals.Name, Individuals.Date of Birth) IN (SELECT tueUsers.Code, tueUsers.Name, tueUsers.Date of Birth FROM tueUsers)
Επιπλέον, είναι απαραίτητο να διατηρηθεί η τάξη.
16. Κλήση του εργαλείου δημιουργίας ερωτημάτων για "κατάσταση" σε ένα αίτημα παρτίδας
Όταν είναι απαραίτητο να επιβάλετε μια συνθήκη, όπως στο παραπάνω παράδειγμα, μπορείτε να ξεχάσετε πώς καλείται αυτό ή εκείνο το πεδίο στον εικονικό πίνακα.
Για παράδειγμα, πρέπει να επιβάλετε μια συνθήκη στο πεδίο "Ημερομηνία γέννησης" και στον εικονικό πίνακα αυτό το πεδίο ονομάζεται "Ημερομηνία γέννησης οφειλέτη" και εάν ξεχάσετε το όνομα, θα πρέπει να βγείτε από την επεξεργασία της συνθήκης χωρίς αποθήκευση και δείτε το όνομα του πεδίου. Για να το αποφύγετε, μπορείτε να χρησιμοποιήσετε την παρακάτω τεχνική.
Είναι απαραίτητο να βάλετε αγκύλες μετά την κατασκευή "Β" και να αφήσετε ένα κενό διάστημα (κενό) μεταξύ των αγκύλων, να επιλέξετε αυτό το διάστημα και να καλέσετε τον κατασκευαστή ερωτήματος. Ο σχεδιαστής θα έχει πρόσβαση σε όλους τους πίνακες του ερωτήματος παρτίδας. Η τεχνική λειτουργεί τόσο σε πίνακες εικονικών καταχωρητών όσο και στην καρτέλα "Συνθήκες". Στην τελευταία περίπτωση, πρέπει να ελέγξετε το πλαίσιο "P (αυθαίρετη συνθήκη)" και να εισαγάγετε τη λειτουργία επεξεργασίας "F4".
Τα ερωτήματα συχνά γίνονταν εν κινήσει και χρησιμεύουν απλώς για να επεξηγήσουν τις «τεχνικές» που σκεφτόμουν.
Ήθελα να εξετάσω τη χρήση των ευρετηρίων σε ερωτήματα, αλλά αυτό είναι ένα πολύ ευρύ θέμα. Θα το βάλω σε ξεχωριστό άρθρο ή θα το προσθέσω εδώ αργότερα.
upd1. Βαθμοί 11,12
upd2. Βαθμοί 13,14,15,16
Μεταχειρισμένα βιβλία:
Γλώσσα ερωτήματος "1C:Enterprise 8" - E.Yu. Χρουστάλεβα
Επαγγελματική ανάπτυξη στο σύστημα 1C:Enterprise 8."
Κατά την οργάνωση δειγμάτων σε πραγματικά προβλήματα, στη συντριπτική πλειοψηφία των περιπτώσεων, η επιλογή δεδομένων οργανώνεται σύμφωνα με ορισμένα κριτήρια.
Στην περίπτωση που η επιλογή γίνεται από πραγματικό τραπέζι, δεν προκύπτουν δυσκολίες. Η επεξεργασία των δεδομένων γίνεται απολύτως ασήμαντη:
Στην περίπτωση που η πηγή στο ερώτημα είναι ένας εικονικός πίνακας, η κατάσταση γίνεται κάπως πιο περίπλοκη.
Η γλώσσα ερωτήματος σάς επιτρέπει να επιβάλλετε μια συνθήκη σε μια επιλογή από εικονικούς πίνακες με δύο τρόπους: στην πρόταση WHERE και χρησιμοποιώντας παραμέτρους εικονικού πίνακα. Και οι δύο μέθοδοι θα οδηγήσουν στο ίδιο αποτέλεσμα (με εξαίρεση ορισμένες συγκεκριμένες περιπτώσεις), αλλά, ωστόσο, απέχουν πολύ από το να είναι ισοδύναμες.
Γνωρίζουμε ήδη ότι οι εικονικοί πίνακες ονομάζονται εικονικοί επειδή στην πραγματικότητα δεν βρίσκονται στη βάση δεδομένων. Σχηματίζονται μόνο τη στιγμή που τους υποβάλλεται αίτημα. Παρόλα αυτά, μας βολεύει (δηλαδή όσοι γράφουν το ερώτημα) να θεωρούμε τους εικονικούς πίνακες ως πραγματικούς. Τι θα συμβεί στο σύστημα 1C Enterprise 8 όταν το ερώτημα που μεταγλωττίσαμε εξακολουθεί να έχει πρόσβαση στον εικονικό πίνακα;
Στο πρώτο βήμα, το σύστημα θα δημιουργήσει έναν εικονικό πίνακα. Στο δεύτερο βήμα, οι εγγραφές θα επιλεγούν από τον πίνακα που προκύπτει που ικανοποιούν την συνθήκη που καθορίζεται στον όρο WHERE:
Φαίνεται ξεκάθαρα ότι το τελικό δείγμα δεν θα περιλαμβάνει όλες τις εγγραφές από τον εικονικό πίνακα (και, επομένως, από τη βάση δεδομένων), αλλά μόνο εκείνες που ικανοποιούν τη δεδομένη συνθήκη. Και τα υπόλοιπα ρεκόρ απλά θα εξαιρεθούν από το αποτέλεσμα.
Έτσι, το σύστημα δεν θα κάνει απλώς άχρηστη δουλειά, αλλά διπλά άχρηστη δουλειά! Αρχικά, θα δαπανηθούν πόροι για τη δημιουργία ενός εικονικού πίνακα με βάση περιττά δεδομένα (στο σχήμα επισημαίνονται ως "περιοχές δεδομένων Α και Β") και στη συνέχεια θα γίνει εργασία για το φιλτράρισμα αυτών των δεδομένων από το τελικό αποτέλεσμα.
Είναι δυνατόν να σταματήσετε αμέσως, στο στάδιο της κατασκευής ενός εικονικού πίνακα, να χρησιμοποιείτε περιττά δεδομένα; Αποδεικνύεται ότι είναι δυνατό. Για αυτό ακριβώς έχουν σχεδιαστεί οι παράμετροι εικονικού πίνακα:
Παραμετροποιώντας έναν εικονικό πίνακα, περιορίζουμε αμέσως τον όγκο των δεδομένων που θα επεξεργαστεί το ερώτημα.
Ποια είναι η διαφορά μεταξύ των τιμών της παραμέτρου εικονικού πίνακα "Μέθοδος προσθήκης";
Όταν η Μέθοδος Πρόσθεσης έχει οριστεί σε "κινήσεις", τότε θα επιστραφούν μόνο εκείνες οι περίοδοι στις οποίες υπήρξαν κινήσεις. Όταν έχει οριστεί "Κινήσεις και Όρια Περιόδου", τότε θα προστεθούν 2 εγγραφές στις παραπάνω κινήσεις: κινήσεις στην αρχή και στο τέλος της περιόδου που καθορίζεται στις παραμέτρους VT. Το πεδίο "Καταχωρητής" θα είναι κενό για αυτές τις 2 εγγραφές.
Πληροφορίες που λαμβάνονται από τον ιστότοπο
Κατά την οργάνωση δειγμάτων σε πραγματικά προβλήματα, στη συντριπτική πλειοψηφία των περιπτώσεων, η επιλογή δεδομένων οργανώνεται σύμφωνα με ορισμένα κριτήρια.
Στην περίπτωση που η επιλογή γίνεται από πραγματικό τραπέζι, δεν προκύπτουν δυσκολίες. Η επεξεργασία των δεδομένων γίνεται απολύτως ασήμαντη:
Στην περίπτωση που η πηγή στο ερώτημα είναι ένας εικονικός πίνακας, η κατάσταση γίνεται κάπως πιο περίπλοκη.
Η γλώσσα ερωτήματος σάς επιτρέπει να επιβάλλετε μια συνθήκη σε μια επιλογή από εικονικούς πίνακες με δύο τρόπους: στην πρόταση WHERE και χρησιμοποιώντας παραμέτρους εικονικού πίνακα. Και οι δύο μέθοδοι θα οδηγήσουν στο ίδιο αποτέλεσμα (με εξαίρεση ορισμένες συγκεκριμένες περιπτώσεις), αλλά, ωστόσο, απέχουν πολύ από το να είναι ισοδύναμες.
Γνωρίζουμε ήδη ότι οι εικονικοί πίνακες ονομάζονται εικονικοί επειδή στην πραγματικότητα δεν βρίσκονται στη βάση δεδομένων. Σχηματίζονται μόνο τη στιγμή που τους υποβάλλεται αίτημα. Παρόλα αυτά, μας βολεύει (δηλαδή όσοι γράφουν το ερώτημα) να θεωρούμε τους εικονικούς πίνακες ως πραγματικούς. Τι θα συμβεί στο σύστημα 1C Enterprise 8 όταν το ερώτημα που μεταγλωττίσαμε εξακολουθεί να έχει πρόσβαση στον εικονικό πίνακα;
Στο πρώτο βήμα, το σύστημα θα δημιουργήσει έναν εικονικό πίνακα. Στο δεύτερο βήμα, οι εγγραφές θα επιλεγούν από τον πίνακα που προκύπτει που ικανοποιούν την συνθήκη που καθορίζεται στον όρο WHERE:
Φαίνεται ξεκάθαρα ότι το τελικό δείγμα δεν θα περιλαμβάνει όλες τις εγγραφές από τον εικονικό πίνακα (και, επομένως, από τη βάση δεδομένων), αλλά μόνο εκείνες που ικανοποιούν τη δεδομένη συνθήκη. Και τα υπόλοιπα ρεκόρ απλά θα εξαιρεθούν από το αποτέλεσμα.
Έτσι, το σύστημα δεν θα κάνει απλώς άχρηστη δουλειά, αλλά διπλά άχρηστη δουλειά! Αρχικά, θα δαπανηθούν πόροι για τη δημιουργία ενός εικονικού πίνακα με βάση περιττά δεδομένα (στο σχήμα επισημαίνονται ως "περιοχές δεδομένων Α και Β") και στη συνέχεια θα γίνει εργασία για το φιλτράρισμα αυτών των δεδομένων από το τελικό αποτέλεσμα.
Είναι δυνατόν να σταματήσετε αμέσως, στο στάδιο της κατασκευής ενός εικονικού πίνακα, να χρησιμοποιείτε περιττά δεδομένα; Αποδεικνύεται ότι είναι δυνατό. Για αυτό ακριβώς έχουν σχεδιαστεί οι παράμετροι εικονικού πίνακα:
Παραμετροποιώντας έναν εικονικό πίνακα, περιορίζουμε αμέσως τον όγκο των δεδομένων που θα επεξεργαστεί το ερώτημα.
Ποια είναι η διαφορά μεταξύ των τιμών της παραμέτρου εικονικού πίνακα "Μέθοδος προσθήκης";
Όταν η Μέθοδος Πρόσθεσης έχει οριστεί σε "κινήσεις", τότε θα επιστραφούν μόνο εκείνες οι περίοδοι στις οποίες υπήρξαν κινήσεις. Όταν έχει οριστεί "Κινήσεις και Όρια Περιόδου", τότε θα προστεθούν 2 εγγραφές στις παραπάνω κινήσεις: κινήσεις στην αρχή και στο τέλος της περιόδου που καθορίζεται στις παραμέτρους VT. Το πεδίο "Καταχωρητής" θα είναι κενό για αυτές τις 2 εγγραφές.
Ας καλέσουμε το παράθυρο διαλόγου για την εισαγωγή παραμέτρων του εικονικού πίνακα PriceSliceLast και ας υποδείξουμε ότι η περίοδος θα περάσει στην παράμετρο ReportDate. Για να το κάνετε αυτό, επιλέξτε αυτόν τον πίνακα στη λίστα Πίνακες και κάντε κλικ στο κουμπί Επιλογές εικονικού πίνακα. Στη συνέχεια επιλέξτε τα ακόλουθα πεδία από τους πίνακες:
SprNomenclature. Μητρική εταιρεία,
ΤιμέςΦέτα από τις τελευταίες.Τιμή.
Αριστερή ένωση τραπεζιού
- Στον σελιδοδείκτη Συνδέσεις: στο πεδίο Συνθήκη σύνδεσης, ότι η τιμή της διάστασης Ονοματολογία του μητρώου πληροφοριών πρέπει να είναι ίση με την αναφορά στο στοιχείο καταλόγου Ονοματολογίας. Επίσης, καταργήστε την επιλογή του πλαισίου ελέγχου Όλα για τον πίνακα καταχωρήσεων και επιλέξτε τον για τον πίνακα αναζήτησης, ορίζοντας έτσι τον τύπο σύνδεσης ως αριστερή σύνδεση για τον πίνακα αναζήτησης:
Ρύζι. 13.15. Σχέση μεταξύ πινάκων σε ένα ερώτημα
- Στον σελιδοδείκτη ΣυνθήκεςΑς ορίσουμε την συνθήκη για την επιλογή στοιχείων από τον κατάλογο Ονοματολογίας - τα επιλεγμένα στοιχεία πρέπει να αντιστοιχούν στον τύπο της ονοματολογίας που έχει περάσει στην παράμετρο αίτησης Τύπος ονοματολογίας:
Ρύζι. 13.16. Προϋποθέσεις επιλογής στοιχείων
- Στον σελιδοδείκτη Σωματεία/Ψευδώνυμα:καθορίστε το ψευδώνυμο του πεδίου Γονέας = Ομάδα υπηρεσιών και το πεδίο Σύνδεσμος = Υπηρεσία. - Κάντε κλικ στο OK-
Μετά από αυτό, πρέπει να επεξεργαστείτε το σχήμα διάταξης δεδομένων, για να το κάνετε αυτό στην καρτέλα Πόροι, κάντε κλικ στο κουμπί Προσθήκηκαι επιλέξτε έναν πόρο - Τιμή
- Στον σελιδοδείκτη Επιλογέςορίστε την τιμή της παραμέτρου Nomenclature Type - Enumeration.Nomenclature Types.Service. Επιπλέον, θα καταργήσουμε τον περιορισμό διαθεσιμότητας για την παράμετρο ReportDate. Στο πεδίο Τύπος αυτής της παραμέτρου, ορίστε τη σύνθεση της ημερομηνίας - Ημερομηνία. Για την παράμετρο Περίοδος, αντίθετα, ορίσαμε έναν περιορισμό διαθεσιμότητας:
Ρύζι. 13.17. Επιλογές σχήματος διάταξης
Ρυθμίσεις
- Ας πάμε στον σελιδοδείκτη Ρυθμίσεις:Ας δημιουργήσουμε μια ομαδοποίηση με βάση το πεδίο Ομάδα υπηρεσιών, καθορίζοντας τον τύπο ομαδοποίησης Ιεραρχία.
Υπάρχουν οι ακόλουθοι τύποι ιεραρχίας για ομαδοποιήσεις αναφορών:Χωρίς ιεραρχία - στην ομαδοποίηση εμφανίζονται μόνο μη ιεραρχικές εγγραφές. Ιεραρχία - τόσο οι μη ιεραρχικές όσο και οι ιεραρχικές εγγραφές εμφανίζονται στην ομαδοποίηση. Μόνο ιεραρχία - μόνο ιεραρχικές (γονικές) εγγραφές εμφανίζονται στην ομαδοποίηση. Μέσα σε αυτήν την ομάδα θα δημιουργήσουμε μια άλλη, χωρίς να καθορίσουμε το πεδίο της ομάδας. Στην υποκαρτέλα Επιλεγμένα πεδία:καθορίστε τα πεδία εξόδου Υπηρεσία και Τιμή:
Ρύζι. 13.18. Δομή και πεδία αναφοράς
Στην υποκαρτέλα Αλλαρυθμίσεις θα εκτελέσουμε τα εξής βήματα:
Ρύζι. 13.19. Ρυθμίσεις για την εμφάνιση γενικών συνόλων για την ομαδοποίηση "Ομάδα υπηρεσιών".
Ρύζι. 13.20. Ρύθμιση και εμφάνιση αποτελεσμάτων για μια καθολική αναφορά
Τέλος, ας συμπεριλάβουμε την παράμετρο Report Date στις ρυθμίσεις χρήστη και ας ορίσουμε τη λειτουργία επεξεργασίας σε Γρήγορη πρόσβαση. Ας κλείσουμε τον σχεδιαστή σχήματος σύνθεσης δεδομένων και στο παράθυρο για την επεξεργασία του αντικειμένου Λίστας υπηρεσιών, μεταβούμε στην καρτέλα Υποσυστήματα. Στη λίστα των υποσυστημάτων διαμόρφωσης, σημειώστε τα υποσυστήματα Παροχή υπηρεσιών και Λογιστική.
Σε 1C: Enterprise mode
Ας εκκινήσουμε το 1C:Enterprise σε λειτουργία εντοπισμού σφαλμάτων και πρώτα απ' όλα ανοίξουμε τον περιοδικό κατάλογο Prices. Στη συνέχεια θα δοκιμάσουμε την αναφορά.
Χρησιμοποιώντας αυτήν την αναφορά ως παράδειγμα, μελετήσαμε πώς το σύστημα σύνθεσης δεδομένων λαμβάνει τις πιο πρόσφατες τιμές από τον περιοδικό μητρώο πληροφοριών και πώς εμφανίζονται οι ομαδοποιήσεις σύμφωνα με την ιεραρχία καταλόγου.
Εάν η δημοσίευσή μου είναι χρήσιμη για εσάς, μην ξεχάσετε να της δώσετε ένα συν :-)
Ακολουθεί ένας αναλυτής για όλες τις εργασίες της συλλογής(μια σελίδα που περιέχει συνδέσμους προς νήματα φόρουμ για κάθε εργασία)
http://chistov.spb.ru/forum/16-969-1
Λοιπόν, τώρα οι εξελίξεις και οι σημειώσεις μου που δημιούργησα κατά τη διαδικασία προετοιμασίας.
Θα προσπαθήσω να επαναλάβω όσο το δυνατόν λιγότερο με τα δύο που αναφέρθηκαν παραπάνω τελευταίοςδημοσιεύσεις.
Ας ξεκινήσουμε λοιπόν:
Εάν το πάρετε από απόσταση, θα πρέπει να έχετε δύο αντικείμενα στην επιφάνεια εργασίας σας στο τέλος της εξέτασης:
1. Τελική μεταφόρτωση της βάσης πληροφοριών (αρχείο dt)
2. Επεξηγηματική σημείωση
Δεν πρέπει να υπάρχει τίποτα άλλο, κανένα ενδιάμεσο αντίγραφο κ.λπ.
Φροντίστε να γράψετε μια επεξηγηματική σημείωση!
Σε περίπτωση αόριστα διατυπωμένης εργασίας, βεβαιωθείτε ότι έχετε γράψει εκεί ότι έχετε επιλέξει ακριβώς αυτή και τη συγκεκριμένη επιλογή λύσης.
Επίσης, σε καίρια σημεία του κώδικα, είναι προτιμότερο να αφήνουμε σύντομα σχόλια, χωρίς φανατισμό, αλλά όπου ο εξεταστής μπορεί να έχει ερωτήσεις, καλύτερα να γράφει.
Θα σας πουν όμως αυτό στις οδηγίες που θα σας δοθούν να διαβάσετε πριν από την εξέταση.
Απλώς είναι καλύτερα να γνωρίζουμε εκ των προτέρων)
Χρήση του συμπλεκτικού χαρακτήρα σε ερωτήματα.
Μερικές φορές είναι πιο γρήγορο να πληκτρολογείτε από ένα πρόσθετο πληκτρολόγιο παρά να αλλάζετε τη διάταξη εμπρός και πίσω, εξοικονομώντας χρόνο
& = Alt+38
*************************************************************************************************
Χρησιμοποιώντας το TimePoint() στα ερωτήματα
Σε ερωτήματα σε μητρώα συσσώρευσης και λογιστικής, είναι απαραίτητο να χρησιμοποιηθεί όχι η ημερομηνία παραστατικού ως παράμετρος εικονικού πίνακα (περίοδος), αλλά η παράμετρος Moment, η οποία ορίζεται στον κώδικα ως εξής:
Στιγμή = ?(Λειτουργία διέλευσης = Λειτουργία δημοσίευσης εγγράφου. Λειτουργικό, Απροσδιόριστο, Στιγμή χρόνου());
*************************************************************************************************
Κατά τη δημιουργία κινήσεων εγγράφων ανά μητρώο, στην αρχή της διαδικασίας επεξεργασίας της ανάρτησης, είναι απαραίτητο να διαγραφούν οι κινήσεις του τρέχοντος εγγράφου ανά μητρώο.
Ο κωδικός είναι:
Movement.RegisterName.Write = True; Movements.RegisterName.Clear();
Είναι πιθανό ότι κατά τη διάρκεια της διαδικασίας θα χρειαστεί να αναλυθούν οι εγγραφές από αυτό το μητρώο.
Έτσι, ώστε κατά την ανάλυση των τρεχουσών εγγραφών (παλιές, πριν από την αλλαγή του εγγράφου) σίγουρα να μην περιλαμβάνονται στο δείγμα, μπορείτε να προσθέσετε μία ακόμη γραμμή στις παραπάνω δύο γραμμές:
Movement.RegisterName.Write();
Ή, όταν αναλύετε εγγραφές, υποδείξτε ρητά ένα όριο που δεν περιλαμβάνει το χρονικό σημείο του τρέχοντος εγγράφου.
Αλλά παντού απλώς υπέδειξα την κατασκευή αυτών των τριών γραμμών:
Movement.RegisterName.Write = True; Movements.RegisterName.Clear(); Movement.RegisterName.Write();
*************************************************************************************************
Υπάρχουν δύο τρόποι αποκλεισμού δεδομένων, η επιλογή μεταξύ τους εξαρτάται από τη μέθοδο που χρησιμοποιείται - παλιά ή νέα:
1) Τακτικός ελεγχόμενος αποκλεισμός, παλιά μέθοδος επεξεργασίας εγγράφων (Αντικείμενο αποκλεισμού δεδομένων)
Ορίστε εάν τα υπόλοιπα πρώτα ελέγχονται και μετά διαγράφονται.
Στην περίπτωση που χρειάζεται να έχουμε κάποια στοιχεία από το μητρώο για να σχηματίσουμε κίνηση.
Παράδειγμα:
Στο παραστατικό - ποσότητα, στο μητρώο - ποσότητα και ποσό (κόστος)
Έτσι, γνωρίζουμε την ποσότητα των αγαθών από το έγγραφο - πόσα διαγράφουμε, αλλά το κόστος - όχι.
Μπορούμε να το μάθουμε μόνο από το μητρώο, αλλά για να διασφαλίσουμε ότι κανείς δεν αλλάζει το μητρώο μεταξύ της στιγμής λήψης των υπολοίπων και της στιγμής καταγραφής των κινήσεων, πρέπει να κλειδώσουμε το μητρώο ακόμη και πριν διαβάσουμε τα υπόλοιπα.
Έτσι, σε αυτήν την περίπτωση, χρησιμοποιείται το αντικείμενο Data Locking. Και κατά τη δημιουργία του, είναι πιο σωστό να υποδείξετε με ποιες διαστάσεις μπλοκάρουμε το μητρώο (για παράδειγμα, στην περίπτωσή μας - μόνο από το στοιχείο που καθορίζεται στο έγγραφο) - έτσι ώστε να μην υπάρχουν περιττές κλειδαριές και ένας άλλος χρήστης να μπορεί να πουλήσει άλλο είδος.
1. Ορίστε ένα κλείδωμα χρησιμοποιώντας το αντικείμενο Data Lock
2. Διαβάστε τα υπόλοιπα
3. Ελέγχουμε τη δυνατότητα διαγραφής
4. Δημιουργούμε κινήσεις, για παράδειγμα, διαγράφουμε αγαθά
5. Μετά την ανάρτηση του εγγράφου, η φραγή αφαιρείται αυτόματα (η φραγή ισχύει ως μέρος της συναλλαγής ανάρτησης και αφαιρείται αυτόματα από το σύστημα). Δηλαδή, δεν χρειάζεται να ξεκλειδώσετε ειδικά το αντικείμενο.
2) Νέα μεθοδολογία επεξεργασίας εγγράφων
(χρησιμοποιώντας την ιδιότητα LockForChange = True)
Χρησιμοποιείται εάν δεν χρειαζόμαστε πληροφορίες από τα μητρώα για να σχηματίσουμε κινήσεις και μπορούμε να ελέγξουμε αν έχουμε πάει στο αρνητικό κατά τη διαγραφή, εάν, μετά την καταγραφή, κοιτάξουμε τα υπόλοιπα στο μητρώο και δούμε ότι υπάρχουν αρνητικά . Σε αυτή την περίπτωση, θα καταλάβουμε ότι έχουμε διαγράψει πάρα πολλά και θα ακυρώσουμε την πράξη διαγραφής.
Παράδειγμα:
Ας εξετάσουμε τη λειτουργία της πώλησης ενός προϊόντος.
Στο παραστατικό - ποσότητα, στο μητρώο - μόνο ποσότητα
Έτσι, γνωρίζουμε την ποσότητα των αγαθών από το έγγραφο.
Σχηματίζουμε κινήσεις με την ποσότητα που ορίζεται στο έγγραφο και τις καταγράφουμε. Στη συνέχεια, διαβάζουμε το μητρώο, κοιτάμε τα υπόλοιπα και αναλύουμε αν υπάρχουν αρνητικά. Εάν υπάρχει, εμφανίστε ένα σφάλμα και ορίστε το Refusal = True.
Δηλαδή, η σειρά έχει ως εξής:
1. Για να μετακινηθείτε στον καταχωρητή, ορίστε την ιδιότητα BlockForChange = True
2. Δημιουργούμε κινήσεις - διαγράψτε τα εμπορεύματα
3. Καταγράψτε τις κινήσεις
4. Διαβάστε το μητρώο και βεβαιωθείτε ότι δεν υπάρχουν αρνητικά υπόλοιπα. Αν υπάρχει, τότε διέγραψαν το πλεόνασμα, αν όχι, τότε όλα είναι καλά.
Έτσι, σε αυτήν την περίπτωση, δεν χρειάζεται να υποδείξουμε ποιες διαστάσεις πρέπει να αποκλείσουμε τον καταχωρητή.
Απλώς ορίζουμε την ιδιότητα BlockForChange σε True πριν καταγράψουμε τις κινήσεις μας, σχηματίζουμε τις κινήσεις και κάνουμε εγγραφή.
Το ίδιο το σύστημα θα μπλοκάρει το μητρώο κατά τη στιγμή της καταγραφής σύμφωνα με τις μετρήσεις που χρειάζονται, έχοντας αναλύσει αυτά που έχουμε καταγράψει.
Μόλις ολοκληρωθεί, το μπλοκάρισμα θα αφαιρεθεί.
Αυτή η επιλογή (η δεύτερη) είναι απλούστερη, ονομάζεται "νέα μεθοδολογία για την επεξεργασία εγγράφων" και η 1C συνιστά τη χρήση της εάν είναι δυνατόν και αφαιρεί πόντους εάν χρησιμοποιείται η πρώτη επιλογή, αλλά σε ορισμένες περιπτώσεις απλά δεν μπορεί να εφαρμοστεί και η πρώτη επιλογή με χρησιμοποιείται το αντικείμενο Data Locking (βλ. παραπάνω παράδειγμα).
Σημειώνω επίσης ότι ανεξάρτητα από την επιλεγμένη μέθοδο, οι κινήσεις πρέπει να καθαρίζονται πριν από την εργασία μαζί τους (βλ. προηγούμενη συμβουλή)
*************************************************************************************************
Αποκλεισμός δεδομένων (μέθοδος αποκλεισμού Νο. 1 από την παραπάνω περιγραφή)
Απαιτείται ελεγχόμενο κλείδωμα όπου διαβάζονται δεδομένα και γίνονται κινήσεις με βάση αυτά τα δεδομένα
Ο πιο γρήγορος τρόπος για να λάβετε τον διαχειριζόμενο κωδικό κλειδώματος είναι να εισαγάγετε "Κλείδωμα δεδομένων", να καλέσετε τον Βοηθό σύνταξης και απλώς να αντιγράψετε τον κωδικό του παραδείγματος από εκεί. Στη συνέχεια απλώς αλλάξτε το με το όνομα του μητρώου και τις διαστάσεις σας.
Μοιάζει κάπως έτσι:
Κλείδωμα = NewDataLock; Locking Element = Locking.Add("Accumulation Register.GoodsInWarehouses"); LockElement.Mode = DataLockMode.Exclusive; BlockingElement.DataSource = PM; Locking Element.UseFromDataSource("Nomenclature", "Nomenclature"); Lock.Lock();
*************************************************************************************************
Είναι καλύτερα να ονομάζετε το τμήμα του πίνακα των εγγράφων απλώς "TC"
Υπάρχει μόνο ένα τμήμα πίνακα στο 99% των εγγράφων. Ένα τέτοιο ενιαίο όνομα για εξαρτήματα πίνακα θα βοηθήσει σημαντικά στην εξοικονόμηση χρόνου, καθώς:
1) Πολύ σύντομο - γράψτε γρήγορα
2) Το ίδιο για όλα τα έγγραφα, δεν χρειάζεται να θυμάστε πώς λέγεται όταν γράφετε κώδικα
*************************************************************************************************
Το αποτέλεσμα του ερωτήματος θα πρέπει να ελεγχθεί για κενό πριν από τη λήψη ή τη μεταφόρτωση στις τεχνικές προδιαγραφές.
Γενικά χρησιμοποιούσα δειγματοληψία σε όλες τις εργασίες.
Η δειγματοληψία είναι πιο βέλτιστη για το σύστημα από την άποψη της απόδοσης, καθώς είναι «ακονισμένη» μόνο για την ανάγνωση δεδομένων (σε αντίθεση με το TK).
Αλλά σε κάθε περίπτωση, πριν από τη μέθοδο Select(), είναι καλύτερο να ελέγξετε το αποτέλεσμα του ερωτήματος για κενό, αυτό θα μειώσει περαιτέρω το φορτίο στο σύστημα.
Αποτέλεσμα = Query.Run(); Αν δεν είναι Result.Empty() Τότε Select = Result.Select(TravelQueryResult.ByGrouping); ... Τέλος εαν;
Και σε περίπτωση που χρειαστεί να πάρουμε μόνο μία τιμή από το αίτημα
(για παράδειγμα, μόνο η μέθοδος διαγραφής σύμφωνα με τη λογιστική πολιτική που καθορίστηκε για φέτος):
Αποτέλεσμα = Query.Run(); If Not Result.Empty() Στη συνέχεια Select = Result.Select(); Selection.Next(); Μέθοδος διαγραφής κόστους = Sample.Cost Write-Off Method; τέλος εαν;
*************************************************************************************************
Έγγραφο «Λειτουργία» για λογιστική εργασία
Είναι απαραίτητο να δημιουργηθεί ένα έγγραφο Λειτουργίας για λογιστικές εργασίες.
Απενεργοποιούμε εντελώς την ανάρτηση (στις ιδιότητες "Αποστολή = Άρνηση"), υποδεικνύουμε ότι κάνει κινήσεις στο λογιστικό μητρώο και σύρουμε τις κινήσεις στη φόρμα.
*************************************************************************************************
Άμεση επεξεργασία εγγράφων:
Πρέπει να είναι περιλαμβάνεται:
Σε λειτουργικό και λογιστικό. η λογιστική για τα έγγραφα πρέπει να είναι ενεργοποιημένη (εκτός από το έγγραφο «Λειτουργία», βλ. παρακάτω).
Πρέπει να είναι απενεργοποιημένο:
σε εργασίες υπολογισμού δεν έχει νόημα για έγγραφο μισθοδοσίας.
Για το έγγραφο "Λειτουργία", η ανάρτηση θα πρέπει να απενεργοποιηθεί εντελώς (στις ιδιότητες του εγγράφου "Ανάρτηση = Απαγόρευση"),
αφού γράφει απλά γράφει δεδομένα απευθείας στο μητρώο όταν γράφει.
*************************************************************************************************
Προϋπόθεση σε αίτημα του εντύπου "Είτε η καθορισμένη ονοματολογία είτε οποιαδήποτε, εάν δεν προσδιορίζεται"
Σε ερωτήματα, αντιμετωπίζεται η ακόλουθη εργασία: για παράδειγμα, πρέπει να επιλέξετε έγγραφα με καθορισμένη ονοματολογία ή όλα τα έγγραφα εάν δεν έχει καθοριστεί η ονοματολογία.
Επιλύεται από την ακόλουθη συνθήκη στο ίδιο το αίτημα:
Ονοματολογία = &Ονοματολογία Ή &Ονοματολογία = Τιμή (Directory.Nomenclature.EmptyLink)
Αλλά θα ήταν πιο βέλτιστο και σωστό να μεταμορφωθεί αυτή η συνθήκη (ευχαριστώ yukon):
Request.Text = Request.Text + "WHERE Nomenclature = &Nomenclature";
τέλος εαν;
Με την εμφάνιση του μοντέλου αντικειμένου ερωτήματος στην έκδοση 8.3.5, θα είναι δυνατή η ασφαλέστερη προσθήκη μιας συνθήκης:
If ValueFilled (Ονοματολογία) Τότε
Query1.Selection.Add("Item = &Nomenclature");
Request.SetParameter("Nomenclature", Nomenclature);
τέλος εαν;
*************************************************************************************************
Σύνδεση πινάκων σε ερωτήματα:
Ο αριθμός των συνολικών εγγραφών δεν εξαρτάται από το αν εμφανίζεται το πεδίο του ενωμένου πίνακα, εξαρτάται μόνο από τις διαμορφωμένες σχέσεις.
Δηλαδή, το πεδίο του συνημμένου πίνακα ενδέχεται να μην εμφανίζεται.
Εάν θέλετε να επισυνάψετε έναν πίνακα χωρίς όρους, τότε στην καρτέλα συνθηκών απλώς γράψτε τη συνθήκη "TRUE".
Σε αυτήν την περίπτωση, ο πίνακας θα ενωθεί ακριβώς.
*************************************************************************************************
Χρησιμοποιώντας το σχέδιο τύπων χαρακτηριστικών (PVC):
1. Χρήση ως μηχανισμός για την περιγραφή των χαρακτηριστικών των αντικειμένων.
1.1. Δημιουργούμε PVC. Αυτά θα είναι Τύποι Χαρακτηριστικών (για παράδειγμα, χρώμα, μέγεθος, μέγιστη ταχύτητα κ.λπ.). Στις ρυθμίσεις, επιλέξτε όλους τους πιθανούς τύπους χαρακτηριστικών τιμών και, εάν είναι απαραίτητο, δημιουργήστε το αντικείμενο από το σημείο 1.2 και υποδείξτε το επίσης στις ρυθμίσεις.
1.2. Για πρόσθετες τιμές PVC, δημιουργούμε έναν δευτερεύοντα κατάλογο AdditionalValues of Characteristics (ή απλά Values of Characteristics).
Θα αποθηκεύσει χαρακτηριστικά εάν δεν βρίσκονται σε υπάρχοντες καταλόγους. Ενδέχεται να μην το δημιουργήσουμε εάν όλα τα χαρακτηριστικά που χρειαζόμαστε βρίσκονται σε υπάρχοντες καταλόγους ή αυτές οι τιμές μπορούν να αναπαρασταθούν από στοιχειώδεις τύπους δεδομένων. Στις ρυθμίσεις PVC υποδεικνύουμε ότι αυτός ο κατάλογος θα χρησιμοποιηθεί για πρόσθετους σκοπούς. αξίες χαρακτηριστικών.
1.3. Δημιουργούμε έναν καταχωρητή πληροφοριών, ο οποίος στην πραγματικότητα συνδέει τρία αντικείμενα:
- Το αντικείμενο στο οποίο συνδέουμε τον μηχανισμό χαρακτηριστικών
- Χαρακτηριστικά τύπου (τύπου PVC)
- Τιμή χαρακτηριστικών (τύπος - χαρακτηριστικό, αυτός είναι ένας νέος τύπος που εμφανίστηκε στο σύστημα μετά τη δημιουργία του PVC
και περιγράφοντας όλους τους πιθανούς τύπους δεδομένων που μπορεί να λάβει μια χαρακτηριστική τιμή).
Στο μητρώο πληροφοριών, υποδεικνύουμε ότι ο Χαρακτηριστικός Τύπος είναι ο κάτοχος της Χαρακτηριστικής Τιμής (σύνδεση με την παράμετρο επιλογής), καθώς και η σύνδεση τύπου για την Χαρακτηριστική Τιμή, πάλι από τον Τύπο Χαρακτηριστικού.
Ένα άλλο χαρακτηριστικό είναι ότι για κάθε τύπο χαρακτηριστικού που δημιουργείται, μπορείτε να καθορίσετε τον τύπο χαρακτηριστικής τιμής, εάν δεν χρειάζεστε όλους τους πιθανούς τύπους για να περιγράψετε την τιμή αυτού του χαρακτηριστικού.
2. Χρήση PVC για τη δημιουργία ενός μηχανισμού δευτερεύοντος συνόλου για το λογιστικό μητρώο .
2.1. Δημιουργούμε PVC TypesSubconto.
2.2. Δημιουργούμε έναν δευτερεύοντα κατάλογο ValuesSubConto (όπως και με τα χαρακτηριστικά, θα περιέχει τιμές subconto αν δεν υπάρχουν σε άλλους καταλόγους).
2.3. Η επικοινωνία γίνεται με χρήση λογιστικού σχεδίου.
*************************************************************************************************
Πόροι λογιστικού μητρώου:
Ποσό - ισολογισμός,
Ποσότητα - εκτός ισολογισμού και σχετίζεται με το λογιστικό χαρακτηριστικό Ποσοτική
*************************************************************************************************
Πίνακες εικονικού λογιστικού μητρώου:
Κύκλος εργασιών: κύκλος εργασιών ενός μόνο λογαριασμού
TurnoverDtKt: κύκλος εργασιών μεταξύ δύο οποιωνδήποτε λογαριασμών, δηλαδή όλων των ίδιων συναλλαγών για την περίοδο.
*************************************************************************************************
Συναλλαγματική λογιστική σε λογιστικά μητρώα - πώς να εφαρμόσετε:
Δημιουργούμε ένα λογιστικό χαρακτηριστικό «νόμισμα» στο λογιστικό σχέδιο.
Στο λογιστικό μητρώο δημιουργούμε επιπλέον:
- Διάσταση νομίσματος (απαγόρευση λευκών αξιών, εκτός ισολογισμού, λογιστικό χαρακτηριστικό - νόμισμα)
- πόρος CurrencyAmount (εκτός ισολογισμού, λογιστικό χαρακτηριστικό - νόμισμα, θα αποθηκεύσει το ποσό σε νόμισμα, δηλαδή 100 $ για παράδειγμα)
Ολα.
Έτσι η δομή του μητρώου είναι:
Μετρήσεις:
- Νόμισμα
Πόροι
- Ποσότητα
- Ποσό (ποσό σε ρούβλια)
- CurrencyAmount (ποσό σε νόμισμα)
Έτσι, η νομισματική λογιστική είναι απλώς μια βελτίωση της συμβατικής λογιστικής στη Δημοκρατία της Λευκορωσίας· δεν αλλάζει την ουσία, για παράδειγμα, του πόρου Ποσό
(εκεί, ως συνήθως, το ποσό είναι σε ρούβλια, ανεξάρτητα από το αν ο λογαριασμός είναι σε ξένο νόμισμα ή όχι).
Και αν η λειτουργία λογιστικής νομίσματος είναι απενεργοποιημένη για τον λογαριασμό, τότε αυτή είναι η συνήθης δομή της Δημοκρατίας της Λευκορωσίας (πόροι - μόνο ποσότητα και ποσό).
*************************************************************************************************
Όταν ορίζουμε τις παραμέτρους ενός εικονικού πίνακα για να λάβουμε ένα κομμάτι του τελευταίου, επιβάλλουμε όρους στις διαστάσεις και όχι στους πόρους.
Διαφορετικά, δεν θα λάβουμε ένα κομμάτι από τα πιο πρόσφατα, αλλά την τελευταία εγγραφή με την καθορισμένη τιμή πόρου - μπορεί να μην είναι η τελευταία στο σύνολο διαστάσεων
*************************************************************************************************
Η έννοια του πόρου και οι λεπτομέρειες στο μητρώο υπολογισμού
Στους καταχωρητές υπολογισμού, η δημιουργία ενός πόρου καθιστά δυνατή τη λήψη του κατά τον υπολογισμό της βάσης χρησιμοποιώντας αυτόν τον καταχωρητή.
Και ακόμη και σε αναλογία με τη δεδομένη περίοδο, η τιμή του πόρου θα υπολογιστεί εκ νέου (αν η βασική περίοδος δεν συμπίπτει με την περιοδικότητα του μητρώου).
Και η τιμή του χαρακτηριστικού είναι διαθέσιμη μόνο στον πραγματικό πίνακα του καταχωρητή υπολογισμού· δεν είναι διαθέσιμη σε εικονικούς πίνακες.
*************************************************************************************************
Πλαίσιο ελέγχου "Βασικό" στις ιδιότητες της διάστασης του καταχωρητή υπολογισμού
Σημαίνει ότι θα ληφθεί μια βάση από αυτή τη διάσταση στο μέλλον και χρησιμεύει για πρόσθετη ευρετηρίαση τιμών για αυτό το πεδίο.
*************************************************************************************************
Ανάλυση της περιόδου ισχύος των διακοπών ανά μήνα κατά την καταγραφή συνόλων εγγραφών στο μητρώο,
εάν οι διακοπές καθορίζονται στο έγγραφο σε μία γραμμή για αρκετούς μήνες ταυτόχρονα σε μία γραμμή:
StartDate of CurrentMonth = Start of Month(TexLineMainAccruals.ActionPeriodStart); CurrentMonthEndDate = EndMonth(TexLineMainAccruals.ActionPeriodStart); CurrentMonth = Ημερομηνία; whileDateStartCurrentMonth<= НачалоМесяца(ТекСтрокаОсновныеНачисления.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = Макс(ДатаНачалаТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияНачало); Движение.ПериодДействияКонец = КонецДня(Мин(ДатаОкончанияТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияКонец)); Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Сумма = 0; Движение.КоличествоДней = 0; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр; Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Дата, -3)); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(Дата, -1))); ДатаНачалаТекМесяца = НачалоМесяца(ДобавитьМесяц(ДатаНачалаТекМесяца, 1)); ДатаОкончанияТекМесяца = КонецМесяца(ДатаНачалаТекМесяца); КонецЦикла; КонецЕсли;
*************************************************************************************************
Δημιουργία γραφήματος Gantt:
Τοποθετούμε ένα στοιχείο του τύπου «Γράφημα Gantt» στη φόρμα, το ονομάζουμε DG, μετά δημιουργούμε την εντολή «Δημιουργία» και γράφουμε τα εξής στη μονάδα φόρμας:
Διαδικασία &OnClient Generate(Command) GenerateOnServer(); Τέλος διαδικασίας &Στον διακομιστή Διαδικασία GenerateOn Server() DG.Clear(); DG.Update = False; Request = New Request("SELECT |BasicAccrualsActualActionPeriod.Employee, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodStart, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodStart. ctionsEnd |FROM |Calculation Register.BasicAccruals.ActualPeriodActions AS BasicAccrualsActualPeriodActions |WHERE |Βασικά AccrualsActualPeriodActions.PeriodActions BETWEEN &StartDate ΚΑΙ &Ημερομηνία λήξης "); Query.SetParameter("StartDate", Period.StartDate); Request.SetParameter("EndDate", Period.EndDate); Select = Query.Run().Select(); Ενώ Selection.Next() Loop Point = DG.SetPoint(Selection.Employee); Series = DG.SetSeries(Selection.CalculationType); Τιμή = DG.GetValue(Point, Series); Interval = Value.Add(); Interval.Start = Sample.PeriodActionStart; Interval.End = Sample.ActionPeriodEnd; EndCycle; DG.Update = True; Τέλος Διαδικασίας
Στην πραγματικότητα, μόνο ο κώδικας στον βρόχο είναι σημαντικός για εμάς εδώ, τα υπόλοιπα πράγματα είναι βοηθητικά, απλά έδωσα ολόκληρη την υλοποίηση αυτής της δευτερεύουσας εργασίας.
Στο αίτημα είναι σημαντικό για εμάς να υπάρχει υπάλληλος, είδος πληρωμής, ημερομηνία έναρξης και ημερομηνία λήξης της περιόδου.
Ο κώδικας είναι πραγματικά πολύ απλός, εύκολος στην απομνημόνευση, μην ανησυχείτε αν σας φαίνεται περίπλοκος
*************************************************************************************************
Επεξεργασία εγγραφών «αντιστροφής» σε εργασίες υπολογισμού:
Στη διαδικασία επεξεργασίας συναλλαγών (ενότητα αντικειμένου), σχηματίζουμε όλες τις κινήσεις και, στη συνέχεια, εάν υπάρχουν εγγραφές σε άλλες περιόδους, τις παίρνουμε ως εξής
(το σύστημα τα δημιουργεί αυτόματα - μας βοηθά):
Εγγραφές προσθήκης = Movements.MainAccruals.GetAddition(); // Δεν χρειάζεται να καταγράψετε κινήσεις για να λάβετε την προσθήκη
Για κάθε γραμμή τεχνολογίας από τον κύκλο προσθηκών εγγραφών
Record = Movements.MainAccruals.Add();
FillPropertyValues(Record, TechString);
Record.RegistrationPeriod = TechString.RegistrationPeriodReversal;
Record.ActionPeriodStart = TechString.ActionPeriodStartReverse;
Record.ActionPeriodEnd = TechString.ActionPeriodEndReversal;
Τέλος Κύκλου
Και κατά τον υπολογισμό των εγγραφών, εισάγετε επιταγές:
Αν TechMotion.Αναστροφή Τότε
CurrentMovement.Sum = - CurrentMovement.Amount;
τέλος εαν;
*************************************************************************************************
Πώς να προσδιορίσετε τι περιλαμβάνεται στα κύρια δεδουλευμένα και τι περιλαμβάνεται στα πρόσθετα δεδουλευμένα στις εργασίες υπολογισμού.
Αλλά αυτό δεν είναι πάντα 100% σαφές· υπάρχουν και πιο περίπλοκες περιπτώσεις, αν και υπάρχουν αρκετές από αυτές
(για παράδειγμα, ένα μπόνους που εξαρτάται από τον αριθμό των εργάσιμων ημερών σε ένα μήνα - αυτός είναι ο HE).
Βασικές χρεώσεις:
Εάν ο τύπος υπολογισμού εξαρτάται από το χρονοδιάγραμμα (δηλαδή ένα μητρώο πληροφοριών με ημερολογιακές ημερομηνίες), τότε αναφέρεται στις κύριες χρεώσεις.
Παράδειγμα OH:
- Μισθός
- Κάτι που υπολογίζεται από τον αριθμό των εργάσιμων ημερών (και για αυτό πρέπει να χρησιμοποιήσετε πρόγραμμα): είτε στην περίοδο ισχύος (όπως ο μισθός) είτε στην περίοδο βάσης
Επιπλέον χρεώσεις:
Αυτό που θεωρείται είτε από το δεδουλευμένο ποσό, είτε ο χρόνος που λειτούργησε (και όχι ο κανόνας!), είτε δεν εξαρτάται καθόλου - αυτό είναι επιπλέον. δεδουλευμένων.
Δηλαδή: τα δεδουλευμένα για τον υπολογισμό των οποίων χρησιμοποιείται το πρότυπο χρόνου (ίσως και γεγονός) είναι OH, και για τα οποία χρειάζονται πραγματικά δεδομένα ή τίποτα είναι DN.
Ή με άλλα λόγια:
Εάν το VR χρησιμοποιεί ένα πρότυπο χρόνου, τότε η περίοδος ισχύος πρέπει να συμπεριληφθεί για το VR.
*************************************************************************************************
Προσθέστε τη δυνατότητα ανοίγματος της ενσωματωμένης ενότητας βοήθειας "Εργασία με βιβλία αναφοράς" στη φόρμα λίστας του καταλόγου "Ονοματολογία".
Εκτελέστε την εντολή στη φόρμα:
&OnClient
Βοήθεια διαδικασίας (εντολή)
OpenHelp("v8help://1cv8/EnterprWorkingWithCatalogs");
Τέλος Διαδικασίας
Ορίζουμε τη γραμμή τομής ως εξής:
Μεταβείτε στις πληροφορίες βοήθειας του αντικειμένου διαμόρφωσης (στον διαμορφωτή), γράψτε μια λέξη, επιλέξτε την, μεταβείτε στο μενού Στοιχεία/Σύνδεσμος και επιλέξτε την επιθυμητή ενότητα της Βοήθειας 1C, μετά την οποία ο σύνδεσμος εισάγεται αυτόματα. Φαίνεται περίπλοκο, αλλά στην πράξη είναι εύκολο.
*************************************************************************************************
Εφαρμογή της αλληλεπίδρασης μεταξύ μορφών, για παράδειγμα, επιλογή:
1. Από την τρέχουσα φόρμα, ανοίξτε την επιθυμητή χρησιμοποιώντας τη μέθοδο «OpenForm()», περνώντας τη δομή με παραμέτρους ως δεύτερη παράμετρο (αν χρειάζεται). Η τρίτη παράμετρος μπορεί να περάσει έναν σύνδεσμο σε αυτήν τη φόρμα - ThisForm.
2. Στην ανοιχτή φόρμα, στον χειριστή «When CreatedOnServer()», μπορούμε να συλλάβουμε τις παραμέτρους που πέρασαν στο βήμα 1 μέσω του «Parameters.[ParameterName]». Η φόρμα που ξεκίνησε το άνοιγμα αυτής της φόρμας θα είναι προσβάσιμη μέσω του αναγνωριστικού «Ιδιοκτήτης» (αν, φυσικά, καθορίστηκε στο βήμα 1).
Και το πιο σημαντικό, θα είναι διαθέσιμες οι λειτουργίες εξαγωγής της φόρμας κατόχου. Δηλαδή, μπορούμε να καλέσουμε τη συνάρτηση εξαγωγής της φόρμας πηγής και να περάσουμε κάτι εκεί ως παράμετρο για να επεξεργαστούμε την επιλογή. Και αυτή η συνάρτηση θα συμπληρώσει ήδη ότι χρειάζεται στην αρχική φόρμα. Υπάρχει μόνο μία προειδοποίηση - δεν μπορείτε να περάσετε έναν πίνακα τιμών μεταξύ των διαδικασιών πελάτη, αλλά μπορούμε να τον τοποθετήσουμε σε προσωρινή αποθήκευση και απλώς να περάσουμε τη διεύθυνση VX και, στη συνέχεια, να τον εξαγάγουμε από το VX.
*************************************************************************************************
Κύκλος ζωής των παραμέτρων φόρμας
Όλες οι παράμετροι που μεταφέρθηκαν στη φόρμα τη στιγμή του ανοίγματός της είναι ορατές μόνο στη διαδικασία "When CreateOnServer".
Αφού δημιουργηθούν, όλες οι παράμετροι καταστρέφονται και δεν είναι πλέον διαθέσιμες στη φόρμα.
Η εξαίρεση αφορά τις παραμέτρους που δηλώνονται στο πρόγραμμα επεξεργασίας φόρμας με το χαρακτηριστικό "Key Parameter".
Καθορίζουν τη μοναδικότητα της φόρμας.
Αυτή η παράμετρος θα υπάρχει όσο υπάρχει η ίδια η φόρμα.
*************************************************************************************************
Χρήση της διεπαφής Taxi
Κατά τη διάρκεια της ανάπτυξης, μπορείτε να ορίσετε τη συνήθη διαχειριζόμενη διεπαφή 8.2 στις ιδιότητες διαμόρφωσης - αυτό κάνει τα πάντα αισθητά πιο συμπαγή και οικεία.
Αυτό ισχύει ιδιαίτερα αν νοικιάσετε εξ αποστάσεως - η ανάλυση της οθόνης είναι πολύ μικρή και είναι αδύνατο να κάνετε οτιδήποτε με τη διεπαφή "ταξί".
Απλώς μην ξεχάσετε να βάλετε ξανά το "Taxi" όταν τελειώσετε!Διαφορετικά, ο εξεταστής θα αφαιρέσει βαθμούς!
*************************************************************************************************
ΥΓ: Ε Υπάρχουν ξεχωριστές τυπικές δευτερεύουσες εργασίες που χρησιμοποιούνται σε όλες τις εργασίες και είναι αυτές που πρέπει να μπορείτε να επιλύσετε (για παράδειγμα, διαγραφή κατά παρτίδες, χρήση PVC (καλά, αυτό είναι πραγματικά σπάνιο) και άλλα). Και σε όλες τις εργασίες απλώς επαναλαμβάνονται (κάπου υπάρχουν κάποιες δευτερεύουσες εργασίες, αλλού, απλώς σε διαφορετικούς συνδυασμούς). Επιπλέον, έχουν υποσχεθεί εδώ και καιρό να κυκλοφορήσουν μια νέα συλλογή (αν δεν έχουν ήδη), στην οποία θα πρέπει να υπάρχουν πολύ περισσότερα προβλήματα, δηλαδή, δεν έχει νόημα να απομνημονεύσουμε λύσεις σε μεμονωμένα προβλήματα, είναι λογικό να μάθουμε πώς να λύστε μεμονωμένες τυπικές δευτερεύουσες εργασίες, τότε θα λύσετε οποιοδήποτε πρόβλημα.
PSS: Συνάδελφοι, αν κάποιος έχει άλλες χρήσιμες πληροφορίες σχετικά με την προετοιμασία για την εξέταση και την επιτυχία, γράψτε στα σχόλια και θα προσθέσουμε στο άρθρο.