Πώς να αντιγράψετε δυαδικά δεδομένα 1. Επέκταση της λειτουργικότητας της εργασίας με δυαδικά δεδομένα

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

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

Για να αποθηκεύσετε αρχεία, χρησιμοποιήστε ένα χαρακτηριστικό (ή εγγραφή πόρου) με τον τύπο StorageValues.

Μεταφόρτωση ενός αυθαίρετου αρχείου στη βάση πληροφοριών 1C

Οποιοδήποτε αρχείο μπορεί να αναπαρασταθεί ως δυαδικά δεδομένα και να φορτωθεί σε αυτά Αποθήκευση αξίας.

Κατά τη μετατροπή δυαδικών δεδομένων σε αντικείμενο StorageValuesσχεδιασμός που χρησιμοποιείται new StorageValues ​​(Δεδομένα, Συμπίεση)με δύο παραμέτρους:

  1. Δεδομένα— δυαδικά δεδομένα που πρέπει να αποθηκευτούν στο χώρο αποθήκευσης
  2. Συμπίεση— λόγος συμπίεσης του αλγόριθμου Deflation. Ακέραιος στην περιοχή -1...9. -1 είναι το προεπιλεγμένο επίπεδο συμπίεσης. 0 - χωρίς συμπίεση, 9 - μέγιστη συμπίεση. Προεπιλεγμένη τιμή: -1. Η παράμετρος είναι προαιρετική, εάν δεν προσδιορίζεται, τότε δεν χρησιμοποιείται συμπίεση.

//Μετατροπή του αρχείου σε δυαδικά δεδομένα
Αρχείο = New BinaryData(Διαδρομή) ;

//Δημιουργία νέου αντικειμένου Value Storage

DataStorage = NewValueStorage(File, NewDataCompression(9) );

Αποθήκευση αυθαίρετου αρχείου από τη βάση πληροφοριών 1C στο δίσκο

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

//Λήψη δυαδικών δεδομένων από την αποθήκευση
//Αποθήκευση δεδομένων - χαρακτηριστικό ενός αντικειμένου με τύπο αποθήκευσης τιμής

//Εγγραφή των δεδομένων που λαμβάνονται στο δίσκο
//Η μεταβλητή Path περιέχει την πλήρη διεύθυνση του αρχείου στο δίσκο
Δεδομένα. Write(Path) ;

Προβολή αρχείου που βρίσκεται στη βάση πληροφοριών 1C

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

//Λάβετε το όνομα του προσωρινού αρχείου με την απαιτούμενη επέκταση
//Στη μεταβλητή Extension πρέπει να βάλετε την επέκταση αρχείου, για παράδειγμα "pdf"
Διαδρομή = GetTemporaryFileName(Επέκταση) ;

//Λήψη δεδομένων από την αποθήκευση
//Αποθήκευση δεδομένων - χαρακτηριστικό ενός αντικειμένου με τύπο αποθήκευσης τιμής
Δεδομένα = Αποθήκη δεδομένων. Get() ;

//Εγγραφή δεδομένων σε ένα προσωρινό αρχείο
Δεδομένα. Write(Path) ;

//Προσπαθώ να ανοίξω το αρχείο στην προβλεπόμενη εφαρμογή
//Εάν η εφαρμογή δεν βρεθεί, θα εμφανιστεί το παράθυρο διαλόγου συστήματος "Άνοιγμα με...".
LaunchApplication(Path) ;

Εκτύπωση (Ctrl+P)

16.3. Εργασία με δυαδικά δεδομένα

16.3.1. γενικές πληροφορίες

Κατά την εφαρμογή λύσεων εφαρμογών, μπορεί να υπάρχουν περιπτώσεις όπου είναι απαραίτητο να αναλυθούν διάφορα δυαδικά δεδομένα. Για παράδειγμα, πρέπει να προσδιορίσετε τον τύπο αρχείου χρησιμοποιώντας μια υπογραφή ή να εκτελέσετε κάποιους χειρισμούς με μια εικόνα. Για εργασία με δυαδικά δεδομένα, το 1C:Enterprise παρέχει ειδικές διεπαφές λογισμικού. Στη συνέχεια, θα εξετάσουμε τις δυνατότητες εργασίας με δυαδικά δεδομένα.
Όλη η εργασία με δυαδικά δεδομένα βασίζεται στην έννοια της ροής. Ροήείναι μια λογική γενίκευση μιας αυθαίρετης (σε γενική περίπτωση) πηγή δεδομένων (Αντικείμενο ροής). Το σύστημα δεν παρέχει τη δυνατότητα δημιουργίας ανεξάρτητου αντικειμένου ροής που δεν σχετίζεται με καμία πηγή. Υπάρχουν όμως παράγωγα αντικείμενα που μπορούν να δημιουργηθούν - μια ροή που σχετίζεται με ένα αρχείο στο δίσκο (αντικείμενο FileStream) ή μια ροή που δημιουργείται στη μνήμη (αντικείμενο MemoryStream). Μια ροή σάς επιτρέπει τόσο να διαβάζετε δεδομένα όσο και να τα γράφετε. Για να προσδιορίσετε τη δυνατότητα εκτέλεσης ορισμένων λειτουργιών, μια ροή (και παράγωγα αντικείμενα) έχει ειδικές μεθόδους που σας επιτρέπουν να προσδιορίσετε ποιες
είναι διαθέσιμες λειτουργίες με αυτό το νήμα (μέθοδοι AvailableRecord(), AvailableRead(), AvailableChangePosition()).
Εάν πρέπει να εργαστείτε με μια ροή σε υψηλότερο επίπεδο, συγκεκριμένα, με δεδομένα ανάγνωσης/εγγραφής όπως ένας αριθμός (διαφορετικού βάθους bit) ή μια συμβολοσειρά, τότε τα αντικείμενα DataRead/DataWrite προορίζονται για αυτό. Χρησιμοποιώντας αυτά τα αντικείμενα, μπορείτε να ακολουθήσετε μια πιο δομημένη προσέγγιση στα δυαδικά δεδομένα που βρίσκονται στη ροή. Έτσι, για παράδειγμα, γνωρίζοντας τη μορφή ενός αρχείου, μπορείτε να διαβάσετε πολύ άνετα ένα τέτοιο αρχείο, λαμβάνοντας τα απαραίτητα δεδομένα από τις κεφαλίδες (οι οποίες, κατά κανόνα, αντιπροσωπεύονται από τους τύπους αριθμός και συμβολοσειρά), παρακάμπτοντας περιττά μπλοκ δεδομένων και φόρτωση των απαραίτητων για επεξεργασία.
Το γενικό σχήμα για την εργασία με δυαδικά δεδομένα μπορεί να αναπαρασταθεί ως εξής:

  1. Λήψη ροής σε εξέλιξη
  2. Δημιουργείται ένα αντικείμενο Data Reader ή Data Writer.
  3. Χρησιμοποιώντας το αντικείμενο που δημιουργήθηκε στο βήμα 2, εκτελούνται οι απαιτούμενες ενέργειες.
  4. Το αντικείμενο που δημιουργήθηκε στο βήμα 2 είναι κλειστό.
  5. Εάν δεν απαιτούνται περισσότερες λειτουργίες, η ροή που λαμβάνεται στο βήμα 1 κλείνει.
  6. Εάν πρέπει να συνεχίσετε να εργάζεστε με τη ροή, μπορείτε να ορίσετε μια νέα θέση στη ροή (αν υποστηρίζεται αυτή η λειτουργία) και να συνεχίσετε να εργάζεστε ξεκινώντας από το βήμα 2.

Αξίζει να σημειωθεί ότι είναι δυνατός ο συνδυασμός των παραγράφων 1 και 2. Με άλλα λόγια, το σύστημα παρέχει τη δυνατότητα δημιουργίας αντικειμένων Ανάγνωση δεδομένων/Εγγραφή δεδομένωναπευθείας από, για παράδειγμα, ένα αντικείμενο BinaryData.
Για την εκτέλεση διαφόρων λειτουργιών με δυαδικά δεδομένα, το σύστημα παρέχει τη δυνατότητα λήψης κάποιου μέρους της ροής ως ξεχωριστό τμήμα με τυχαία (byte-by-byte) πρόσβαση (αντικείμενο BufferBinaryData). Το μέγεθος του buffer ορίζεται όταν δημιουργείται και δεν μπορεί να αλλάξει αργότερα. Όταν εργάζεστε με ένα δυαδικό buffer δεδομένων, είναι δυνατό να εργαστείτε με αριθμούς διαφορετικών βάθους bit όπως
ως ένα σύνολο. Σε αυτήν την περίπτωση, είναι δυνατό να καθοριστεί η σειρά των byte με λέξεις: "little endian" ή "big endian" (big endian). Είναι επίσης δυνατό να χωρίσετε ένα buffer σε πολλά και να συνδυάσετε πολλά δυαδικά buffer δεδομένων σε ένα buffer που προκύπτει.
Είναι σημαντικό να σημειωθεί ότι η εργασία με μια προσωρινή μνήμη δυαδικών δεδομένων μπορεί να απλοποιήσει σημαντικά την υλοποίηση εάν η εργασία με δυαδικά δεδομένα υλοποιείται στην πλευρά της εφαρμογής πελάτη σε ασύγχρονη λειτουργία. Σε αυτήν την περίπτωση, η ανάγνωση δεδομένων στην προσωρινή μνήμη θα εκτελείται ως ασύγχρονη λειτουργία και η εργασία με τα δεδομένα της προσωρινής μνήμης θα είναι σύγχρονη.
Η εργασία με δυαδικά δεδομένα είναι διαθέσιμη στην πλευρά του πελάτη (συμπεριλαμβανομένου του προγράμματος-πελάτη web) της εφαρμογής και στην πλευρά του διακομιστή, καθώς και σε σχήματα σύγχρονης και ασύγχρονης εργασίας. Περαιτέρω παραδείγματα θα χρησιμοποιούν ένα σύγχρονο σχήμα εργασίας.

16.3.2. Ανάγνωση δυαδικών δεδομένων

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

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (στα Αγγλικά). Για το παράδειγμα ανάγνωσης θα χρησιμοποιηθούν οι ακόλουθες πληροφορίες μορφής:
1. Τα πρώτα 4 byte του αρχείου περιέχουν το αναγνωριστικό μορφής: RIFF.
2. τα επόμενα 4 byte περιέχουν το μέγεθος των πραγματικών ηχητικών δεδομένων σε σειρά λίγων byte.
3. Τα επόμενα 4 byte περιέχουν τον τύπο κειμένου των δεδομένων που χρησιμοποιούνται: WAVE.
Για να εκτελέσετε αυτές τις ενέργειες θα χρειαστείτε τον ακόλουθο κώδικα στην ενσωματωμένη γλώσσα:

Διαβάστε = Νέο ReadData(FileName, ByteEndian.LittleEndian);
Μορφή αρχείου = Read.ReadCharacters(4);
DataSize = Read.ReadInteger32();
FileType = Read.ReadCharacters(4);
Αν Μορφή αρχείου<>«RIFF» Τότε
Αναφορά ("Αυτό δεν είναι αρχείο RIFF");
ΕΠΙΣΤΡΟΦΗ ;
Τέλος εαν ;
Αν FileType = "WAVE" Τότε
Αναφορά ("Αυτό είναι ένα αρχείο WAV με δεδομένα, μέγεθος " + Μέγεθος δεδομένων + " byte")
Σε διαφορετική περίπτωση
Αναφορά ("Αυτό δεν είναι αρχείο WAV").
ΕΠΙΣΤΡΟΦΗ;
τέλος εαν;

Ας δούμε το παράδειγμα με περισσότερες λεπτομέρειες.
Αρχικά, ανοίγει το αρχείο του οποίου το όνομα περιέχεται στη μεταβλητή FileName, ανοίγει το αρχείο για ανάγνωση ( FileOpenMode.Open), θα διαβάσει μόνο από το αρχείο ( FileAccess.Read) και ένα buffer 16 byte θα χρησιμοποιηθεί για ανάγνωση.
Στη συνέχεια, δημιουργείται μια ροή για την ανάγνωση δεδομένων, η οποία θα έχει τη λιγότερο σημαντική σειρά byte για δεδομένα του τύπου Αριθμός. Στη συνέχεια διαβάζονται 4 χαρακτήρες, ένας ακέραιος αριθμός 32 bit και 4 ακόμη χαρακτήρες από τη ροή που προκύπτει. Τα δεδομένα που προκύπτουν αναλύονται και με βάση τα αποτελέσματα της ανάλυσης λαμβάνεται απόφαση για το αν το επιλεγμένο αρχείο είναι αρχείο .wav ή όχι.

16.3.3. Εγγραφή δυαδικών δεδομένων

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

Είσοδος = Νέο WriteData(Όνομα αρχείου);
Για δείκτη = 0 έως 255 κύκλος
Write.WriteByte(Ευρετήριο);
EndCycle;
Record.Close() ;

Αυτό το παράδειγμα γράφει σε ένα αρχείο μια ακολουθία byte από 0 έως 255 (0xFF σε δεκαεξαδικό). Αυτή είναι η απλούστερη επιλογή εγγραφής.
Μπορείτε επίσης να χρησιμοποιήσετε μια μέθοδο παρόμοια με τη μέθοδο ανάγνωσης που συζητήθηκε στο προηγούμενο παράδειγμα, όπου λαμβάνεται μια ροή αρχείου και εγγράφονται δεδομένα σε αυτήν τη ροή αρχείου.

16.3.4. Εργασία με ένα δυαδικό buffer δεδομένων

Όπως αναφέρθηκε παραπάνω, το buffer δυαδικών δεδομένων παρέχει έναν βολικό τρόπο χειρισμού θραυσμάτων δυαδικών δεδομένων.
Δεν υποστηρίζεται μόνο η ανάγνωση δεδομένων, αλλά και η γραφή.
Ως παράδειγμα, θα εξετάσουμε την ανάλυση της κεφαλίδας του αρχείου RIFF από το παράδειγμα ανάγνωσης δεδομένων (δείτε εδώ). Για τη δημιουργία του παραδείγματος, θα χρησιμοποιηθούν ακριβώς οι ίδιες πληροφορίες σχετικά με τη μορφή αρχείου. Επομένως, είναι απαραίτητο να διαβάσετε από το αρχείο προέλευσης ένα buffer το μέγεθος της κεφαλίδας του αρχείου. Η κεφαλίδα αποτελείται από τρία πεδία των 4 byte. Επομένως, πρέπει να διαβαστούν 12 byte.

Buffer = Νέο BufferBinaryData(12);
Αρχείο = FileStreams.Open(Κατάλογος προσωρινών αρχείων() + "Windows Logon.wav", FileOpenMode.Open, FileAccess.Read);
File.Read(Buffer, 0, 12);
Μέγεθος = Buffer.ReadInteger32(4);
StreamString = newStreamInMemory(Buffer);
StreamRows.Go(0, PositionInStream.Start);

Μορφή αρχείου = ReadLines.ReadCharacters(4, "windows-1251");
ReadLines.Close();
StreamRows.Go(8, PositionInStream.Start);
RowReader = νέο DataReader(RowStream);
Τύπος αρχείου = ReadLines.ReadCharacters( 4, "windows-1251");
ReadLines.Close();

Η διαδικασία μεταφοράς δεδομένων σε ένα δυαδικό buffer δεδομένων δεν είναι τίποτα ιδιαίτερο. Για περαιτέρω ενέργειες απαιτούνται ορισμένα σχόλια. Η ανάγνωση αριθμών οποιουδήποτε υποστηριζόμενου βάθους bit είναι δυνατή από οποιαδήποτε θέση στην προσωρινή μνήμη. Σε αυτό το παράδειγμα Buffer.ReadInteger32(4); σημαίνει ανάγνωση ενός ακέραιου αριθμού 32 bit που ξεκινά από το byte 4 του buffer. Επομένως, εάν χρειάζεται να διαβάσετε πολλούς αριθμούς που βρίσκονται σε διαφορετικά σημεία στην προσωρινή μνήμη, αυτό μπορεί να γίνει χωρίς άμεση τοποθέτηση σε αυτήν την προσωρινή μνήμη.
Ωστόσο, η ανάγνωση μιας συμβολοσειράς δεν υποστηρίζεται από την προσωρινή μνήμη δυαδικών δεδομένων. Επομένως, θα πρέπει να χρησιμοποιήσετε ένα αντικείμενο που σας επιτρέπει να το κάνετε αυτό: Ανάγνωση δεδομένων. Ένα αντικείμενο DataReader δεν μπορεί να δημιουργηθεί από μια δυαδική προσωρινή μνήμη δεδομένων. Αλλά με βάση ένα δυαδικό buffer δεδομένων, μπορείτε να δημιουργήσετε μια ροή που είναι ένας καθολικός ενδιάμεσος μεταξύ της φυσικής θέσης αποθήκευσης των πληροφοριών (αρχείο, δυαδική προσωρινή μνήμη δεδομένων) και ενός αντικειμένου υψηλού επιπέδου που σας επιτρέπει να εργαστείτε με αυτά τα δεδομένα.
Όταν δημιουργείται ένα αντικείμενο DataReader με βάση μια ροή, αρχίζει να διαβάζει δεδομένα από τη θέση που είναι εγκατεστημένη αυτήν τη στιγμή στη ροή. Επομένως, στο παράδειγμα, ορίζεται πρώτα η θέση στη ροή και, στη συνέχεια, δημιουργείται ένα αντικείμενο DataReader και διαβάζεται ο απαιτούμενος αριθμός χαρακτήρων. Για λεπτομερή περιγραφή της διαφοράς μεταξύ του αριθμού των byte και των χαρακτήρων κατά την ανάγνωση συμβολοσειρών, δείτε την επόμενη ενότητα 16.3.5

16.3.5. Χαρακτηριστικά χρήσης

Όταν χρησιμοποιείτε δυαδικά δεδομένα, θα πρέπει να λάβετε υπόψη τις δυνατότητες εργασίας με δεδομένα τύπου String. Η ιδιαιτερότητα είναι ότι το μήκος της συμβολοσειράς που επιστρέφει η συνάρτηση καθολικού περιβάλλοντος StrLength() μετριέται σε χαρακτήρες. Στα σύμβολα, θα πρέπει να υποδείξετε το μέγεθος των δεδομένων προς ανάγνωση/εγγραφή στις μεθόδους εγγραφής/ανάγνωσης συμβολοσειρών σε αντικείμενα για εργασία με δυαδικά δεδομένα ( ReadCharacters(),
ReadString(), WriteCharacters(), WriteString()). Ωστόσο, δεν υπάρχει σαφής επιλογή για τη μετατροπή του μήκους μιας συμβολοσειράς σε χαρακτήρες σε παρόμοια παράμετρο σε byte. Ανάλογα με τα περιεχόμενα της συμβολοσειράς και την κωδικοποίηση, αυτή η αναλογία θα είναι διαφορετική. Επομένως, όταν εργάζεστε με οποιεσδήποτε δομές δεδομένων που περιλαμβάνουν συμβολοσειρές μεταβλητού μήκους, θα πρέπει να κατανοείτε σαφώς σε ποιες μονάδες εκφράζονται τα μήκη συμβολοσειρών.
Εάν στα διαθέσιμα δεδομένα το μήκος συμβολοσειράς υποδεικνύεται σε byte και η συμβολοσειρά καθορίζεται σε μια κωδικοποίηση μεταβλητού μήκους πολλών byte (για παράδειγμα, UTF-8), τότε χρησιμοποιώντας δυαδικά αντικείμενα δεδομένων, διαβάζοντας μια τέτοια δομή από ένα αρχείο σε δεδομένα του τύπου String είναι γενικά αδύνατα.
Αλλά σε αυτήν την περίπτωση, μπορείτε εύκολα να αλλάξετε τη θέση ανάγνωσης/εγγραφής στη ροή αρχείων. Εάν το μήκος μιας συμβολοσειράς καθορίζεται σε χαρακτήρες, τότε καθίσταται δυνατή η ανάγνωση μιας τέτοιας συμβολοσειράς σε δεδομένα τύπου String, αλλά καθίσταται αδύνατη η αλλαγή της θέσης ανάγνωσης/εγγραφής σε μια τέτοια ροή.
Για να λάβετε το μήκος μιας συμβολοσειράς σε byte, μπορείτε να χρησιμοποιήσετε την ακόλουθη συνάρτηση για να μετατρέψετε τη συμβολοσειρά σε αντικείμενο BinaryData:

Λειτουργία Λάβετε δυαδικά δεδομένα από τη συμβολοσειρά(Value StrParameter, Value Encoding = "UTF-8")
MemoryThread = NewMemoryThread;
Συγγραφέας = Νέος WriteData(StreamMemory);
Writer.Write String(StrParameter, Encoding);
Συγγραφέας.Κλείσιμο();
Επιστροφή StreamMemory.CloseAndGetBinaryData();
EndFunction

Το πραγματικό μέγεθος σε byte μπορεί να ληφθεί καλώντας τη συνάρτηση Size() στο αντικείμενο BinaryData, το οποίο λαμβάνεται ως αποτέλεσμα της συνάρτησης.
Δεν συνιστάται η ταυτόχρονη χρήση αντικειμένων Ανάγνωση δεδομένων/Εγγραφή δεδομένωνκαι ροή αντικειμένων. Εάν μεταξύ δύο διαδοχικών πράξεων ανάγνωσης από το ReadData ή δύο διαδοχικών πράξεων εγγραφής στο WriteData υπάρχει μια αλλαγή στη θέση στη ροή με την οποία λειτουργούν τα αντικείμενα Ch ShadowData/WriteData– δημιουργείται μια εξαίρεση. Έτσι, το ακόλουθο παράδειγμα δείχνει τη σωστή αλλαγή θέσης σε μια ροή κατά την εγγραφή δεδομένων σε μια ροή:

Stream = newStreamInMemory();

WriteData.WriteString("Γειά σου Κόσμε!");
WriteData.Close();
Stream.Go (0, PositionInStream.Start);
DataWrite = newDataWrite(Stream);
WriteData.WriteString("Αντίο!");
WriteData.Close();
Το ακόλουθο παράδειγμα γεια σε μια εξαίρεση που ρίχνεται:

Stream = NewStreamInMemory();

WriteData.WriteString("Γεια, κόσμο!");
Stream.Go(0, PositionInStream.Start);
// Η επόμενη γραμμή θα δημιουργήσει μια εξαίρεση
WriteData.WriteString("Αντίο!");
Ταυτόχρονα, είναι δυνατές καταστάσεις όπου η συμπεριφορά του συστήματος θα είναι εσφαλμένη, αλλά δεν θα δημιουργηθούν σφάλματα:

Stream = GetStream();
ReadData = νέο ReadData(Stream);
TestString = ReadData.Read();
InitialPosition = Stream.CurrentPosition();
DataWrite = newDataWrite(Stream);
WriteData.WriteString("Απροσδόκητη συμβολοσειρά");
WriteData.Close();
Stream.Go(InitialPosition, PositionInStream.Start);
// Γενικά, είναι αδύνατο να προσδιοριστεί ποια τιμή θα τοποθετηθεί στη μεταβλητή TestString2
TestLine2 = ReadData.ReadLine();

Η συμπεριφορά που περιγράφεται σε αυτήν την ενότητα προκαλείται από o Τα αντικείμενα Data Reader/Data Writer χρησιμοποιούν τα δικά τους buffer όταν εργάζονται με μια ροή. Ως αποτέλεσμα, η πραγματική θέση του νήματος διαφέρει από τη λογική θέση, η οποία σχηματίζεται ως αποτέλεσμα των ολοκληρωμένων λειτουργιών.
Επίσης, δεν υποστηρίζεται η ταυτόχρονη χρήση αντικειμένων Data Reader και Data Writer, τα οποία χρησιμοποιούν ένα νήμα για την εργασία τους.

Υλοποιήθηκε στην έκδοση 8.3.10.2168.

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

Νέες λειτουργίες για τη μετατροπή δυαδικών δεδομένων σε διαφορετικές μορφές

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

Παρόμοιες μετατροπές υποστηρίζονται για τον τύπο BufferBinaryData. Επιπλέον, μπορείτε να μετατρέψετε ένα δυαδικό buffer δεδομένων σε δυαδικά δεδομένα και αντίστροφα.

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

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

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

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

Ως αποτέλεσμα, μπορείτε πλέον να ανοίγετε ροές για ανάγνωση και γραφή όταν χρησιμοποιείτε αντικείμενα όπως:

  • ReadingTextΚαι WriteText;
  • ReadingFastInfoSetΚαι EntryFastInfoSet;
  • ReadingHtmlΚαι PostHtml;
  • Διαβάζοντας JSONΚαι Καταχώρηση JSON;
  • Ανάγνωση XMLΚαι Καταχώρηση XML;
  • Ανάγνωση του αρχείου ZipΚαι Εγγραφή αρχείου Zip.

Μπορείτε να λάβετε το σώμα ως ροή όταν εργάζεστε με HTTP:

  • HTTPRαίτησηΚαι HTTPRresponse;
  • Αίτημα HTTPSserviceΚαι HTTPServiceResponse.
  • Έγγραφο κειμένου;
  • Πίνακας Έγγραφο;
  • ΜορφοποιημένοΈγγραφο;
  • Γεωγραφικό Σχέδιο;
  • GraphicScheme;
  • Σύνδεση FTP.

Η εγγραφή σε ροή είναι πλέον διαθέσιμη όταν εργάζεστε με τύπους ΕικόναΚαι ConvertToCanonicalXML. Και εκτός από αυτό, η εργασία με ροές υποστηρίζεται πλέον με διάφορες μεθόδους που έχουν οι τύποι Μετατροπή XSL, Υπεύθυνος Κρυπτογραφίας, ΠιστοποιητικόΚρυπτογραφίαΚαι HashingData.

Αποτελεσματική αντιγραφή με ανάγνωση και εγγραφή δεδομένων

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

Επομένως, ο τύπος ReadDataέχουμε εφαρμόσει μια νέα μέθοδο CopyB(). Όχι μόνο εξαλείφει αυτό το πρόβλημα, αλλά και απλοποιεί το κείμενο, καθιστώντας το πιο κατανοητό.

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

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

Το ωραίο είναι ότι μπορείς να αντιγράψεις όχι μόνο σε μια ροή, αλλά και σε ένα αντικείμενο WriteData. Αυτή η επιλογή είναι βολική όταν, εκτός από τα δεδομένα από τη ροή πηγής, πρέπει να γράψετε μερικά από τα δικά σας δεδομένα στη ροή εξόδου.

Λογικές λειτουργίες bitwise σε ένα δυαδικό buffer δεδομένων

Μπορείτε τώρα να χρησιμοποιήσετε λογικές λειτουργίες bitwise όταν εργάζεστε με δυαδικές προσωρινές αποθήκες δεδομένων. Ως αποτέλεσμα αυτών των λειτουργιών, το αποτέλεσμα ενός συνδυασμού δυαδικών ψηφίων των byte προέλευσης και των byte στη δεδομένη προσωρινή μνήμη θα εγγραφεί στην προσωρινή μνήμη πηγής σύμφωνα με τους κανόνες της επιλεγμένης λογικής λειτουργίας. Υλοποιήσαμε τις ακόλουθες λειτουργίες:

  • WriteBitAnd();
  • WriteBitOr();
  • WriteBitExclusiveOr();
  • WriteBitIne();
  • Αντιστρέφω().

Ένα καλό παράδειγμα χρήσης λογικών πράξεων bitwise είναι η αποκωδικοποίηση της μορφής ανταλλαγής με εξοπλισμό λιανικής. Για παράδειγμα, η μορφή ανταλλαγής με εξοπλισμό λιανικής περιγράφεται από ένα πεδίο 1 byte. Αυτό το πεδίο περιέχει ένα σύνολο χαρακτηριστικών που περιγράφουν τη σειρά προϊόντων:

  • Bits 0-2: φορολογικός συντελεστής;
  • Bit 3: 0 - τεμάχιο αγαθών, 1 - αγαθά βάρους.
  • Bit 4: 0 - να επιτρέπεται η πώληση, 1 - να απαγορεύεται η πώληση.
  • Bit 5: 0 - ενεργοποιήστε την καταμέτρηση ποσότητας, 1 - απενεργοποιήστε την καταμέτρηση ποσότητας.
  • Bit 6: 0 - η ενιαία πώληση απαγορεύεται, 1 - η μοναδική πώληση επιτρέπεται.
  • Bit 7: Με κράτηση.

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

Λήψη αριθμού από δεκαεξαδική και δυαδική κυριολεξία

  • NumberFromHexString();
  • NumberFromBinaryString().

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

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

Τα δεκαεξαδικά κυριολεκτικά είναι βολικά στη χρήση κατά την ανάλυση τεχνικών μορφών: μορφές εικόνας, ήχου, βίντεο.

Αλλαγές στην τεχνολογία των εξωτερικών στοιχείων NativeAPI

Προηγουμένως, υπήρχαν ορισμένοι περιορισμοί κατά τη μεταφορά δυαδικών δεδομένων μεταξύ 1C:Enterprise και ενός εξωτερικού στοιχείου. Για παράδειγμα, ήταν αδύνατη η μεταφορά δυαδικών δεδομένων σε ένα εξωτερικό στοιχείο και όταν εργάζεστε σε ένα πρόγραμμα-πελάτη Ιστού, η ανταλλαγή δυαδικών δεδομένων ήταν γενικά αδύνατη.

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

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

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

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

Τι μπορεί να κάνει το σύστημα

Όταν εργάζεστε με δυαδικά δεδομένα, η πλατφόρμα 8.3 μπορεί να εκτελέσει τις ακόλουθες ενέργειες:

  1. Ανάγνωση και εγγραφή δυαδικών δεδομένων.
  2. Μετακίνηση δεδομένων από πελάτη σε διακομιστή και πίσω χρησιμοποιώντας προσωρινή αποθήκευση.
  3. Αρχικοποιήστε ένα αντικείμενο του τύπου "Εικόνα" χρησιμοποιώντας δυαδικά αρχεία.
  4. Διαβάστε τα από τον Παγκόσμιο Ιστό χρησιμοποιώντας τα αντικείμενα "Επισύναψη αλληλογραφίας", "Σύνδεση HTTP" κ.λπ.
  5. Χρησιμοποιήστε κρυπτογραφικά εργαλεία για την κρυπτογράφηση και την υπογραφή σημαντικών συνημμένων.
  6. Χρησιμοποιώντας το αντικείμενο "Data Hashing", υπολογίστε τη συνάρτηση κατακερματισμού.

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

Για παράδειγμα, ας δημιουργήσουμε έναν κατάλογο σε μια δοκιμαστική διαμόρφωση.

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


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


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

Ανάγνωση δεδομένων από στηρίγματα

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


Βασικά, αυτός είναι όλος ο κώδικας που χρειαζόμαστε. Χρησιμοποιώντας τον τελεστή Get(), διαβάζουμε τα δυαδικά δεδομένα που είναι αποθηκευμένα στο αντίστοιχο χαρακτηριστικό directory και τα μεταφέρουμε στο αντικείμενο «Εικόνα», το οποίο θα εμφανίζεται στο επάνω αριστερό κελί του εγγράφου υπολογιστικού φύλλου της φόρμας (Εικ. 9).

Εικ.9

Μετατροπή Δεδομένων

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

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

  1. Base64String – μετατρέπει την καθορισμένη τιμή σε μια συμβολοσειρά της αντίστοιχης κωδικοποίησης.
  2. Base64Value – κάνει την αντίστροφη μετατροπή.

Βελτιστοποίηση του παραπάνω κώδικα

Ο κώδικας που παρουσιάζεται στο Σχ. 4 σίγουρα λειτουργεί, αλλά με μια σημαντική προειδοποίηση: εάν το πλαίσιο ελέγχου "Λειτουργία χρήσης τρόπων" είναι επιλεγμένο στις ιδιότητες διαμόρφωσης (Εικ. 10). Διαφορετικά, η χρήση του θα προκαλέσει σφάλμα.
Εικ.10

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

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

Εικ.11

mob_info