Επί του παρόντος, ο Lord of fear και εγώ εργαζόμαστε σε ένα ενδιαφέρον έργο - αναπτύσσουμε μια λύση που βασίζεται στην πλατφόρμα 1C:Enterprise 8.2 για μια μεγάλη εταιρεία. Για τα tasks set οι δυνατότητες των 1C είναι υπεραρκετές και δεν μετανιώνουμε καθόλου για την επιλογή μας. Στην πραγματικότητα, περαιτέρω δεν θα μιλήσουμε για τη μεγάλη και ισχυρή πλατφόρμα 1C: Enterprise.

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

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

Σκεφτήκαμε, σκεφτήκαμε και αποφασίσαμε να εγκαταλείψουμε τις τυπικές διατάξεις τύπου "Spreadsheet Document" και να χρησιμοποιήσουμε τις δυνατότητες του MS Word. Η ιδέα ήταν κάπως έτσι:

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

2. Χρησιμοποιώντας την τεχνολογία OLE, δημιουργήστε έγγραφα και αντικαταστήστε τις ψευδο-μεταβλητές με επιθυμητό κείμενο. Οι ψευδο-μεταβλητές μορφοποιήθηκαν ως: [VariableName].

3. Ανάλογα με την κατάσταση, εκτυπώστε ή αποθηκεύστε το έγγραφο που δημιουργήθηκε.

Κατ 'αρχήν, δεν υπάρχουν δυσκολίες, αλλά μέχρι σήμερα, και οι δύο δεν χρειάστηκε να εργαστούμε από το 1C: Enterprise με το MS Word. Βασικά, όλες οι διατάξεις των έντυπων φορμών που δημιούργησα βασίστηκαν έγγραφα υπολογιστικού φύλλου, επομένως δεν είχα εμπειρία στη μεταφορά δεδομένων από την πλατφόρμα, ας πούμε, στο MS Word / Excel. Έπρεπε να ασχολούμαι με την ανάγνωση δεδομένων από το Excel συχνά, αλλά ποτέ να μην τα μεταδίδω.

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

//Δημιουργία νέου αντικειμένου τύπου Word.Application WordApplication = New COMObject("WORD.Application"); //Δημιουργία νέου εγγράφου με βάση το πρότυπο //Στη μεταβλητή PathKTemplate, καθορίστε την πλήρη διαδρομή προς το πρότυπο // που δημιουργήθηκε από εμάς (επέκταση αρχείου dot) NewDocument = WordApplication .Documents.Add(PathKTemplate); //Προετοιμασία για αναζήτησηReplaceContent = NewDocument.content.Find; //Αντικαταστήστε το κείμενο //Στην πρώτη παράμετρο της μεθόδου Execute, περάστε τη συμβολοσειρά που θα αντικατασταθεί //Στην ένατη - η συμβολοσειρά που θα αντικατασταθεί με //δηλ. στο WhatReplace θα περάσουμε το όνομα της μεταβλητής (για παράδειγμα, [UserName]) //και στην τελευταία - την τιμή τηςReplaceContent.Execute(WhatReplace,False,True,False,True,False,String(WhatWeReplace)); //Περαιτέρω όλα εξαρτώνται από τη Λίστα επιθυμιών μας //Αποθήκευση του εγγράφου NewDocument.SaveAs(PathToSave); //Εκτύπωση εγγράφου NewDocument.PrintOut(); //Στο τέλος της εργασίας, πρέπει να κλείσετε το έγγραφο και το ίδιο το Winword. Αυτό γίνεται //Για τη μέθοδο Quit, περνάω την τιμή False. Αυτό υποδηλώνει ότι δεν χρειάζεται να αποθηκεύσουμε το ολοκληρωμένο έγγραφο. WordApplication.application.Quit(False); Εφαρμογή Word = 0;

Αποτελέσματα εργασίας

Ήμασταν απόλυτα ικανοποιημένοι με την επιλογή χρήσης του MS Word για τη δημιουργία κομψών έντυπων φορμών. Ξοδέψαμε μερικές ώρες γράφοντας διαδικασίες περιτυλίγματος και επίσης μετατρέψαμε φόρμες που δημιουργήθηκαν προηγουμένως σε πρότυπα MS Word. Μείναμε παραπάνω από ικανοποιημένοι με το αποτέλεσμα. Όλα λειτουργούν έξυπνα και ο πελάτης μας μπορεί εύκολα να αλλάξει τα πρότυπα των εγγράφων εξόδου χωρίς κανένα πρόβλημα. Σε περίπτωση εμπλοκών (καλά, εάν ο πελάτης πέσει κατά λάθος τα υπάρχοντα πρότυπα), έχουμε παράσχει τη δυνατότητα επαναφοράς των αρχικών αρχείων προτύπων.

Εάν αποφασίσετε να εφαρμόσετε αυτήν την προσέγγιση στα έργα σας, τότε να είστε εξαιρετικά προσεκτικοί. Η χρήση όλων αυτών των nyashek απαιτεί την παρουσία στον υπολογιστή του χρήστη MS Word. Λαμβάνοντας υπόψη ότι σήμερα πολλές εταιρείες κινούνται στο τρομερό (IMHO) OpenOffice - κάνοντας αίτηση αυτή τη μέθοδομπορεί να προκαλέσει προβλήματα. Ευτυχώς, είμαστε τυχεροί σε αυτό το θέμα.

Δημοσίευση - σας Rυπόμνημα ωδών που περιέχει παραδείγματα κώδικα για:

1. γέμιση πρότυπο λέξηςδεδομένα από 1C.
2. Συμπλήρωση κεφαλίδων και υποσέλιδων του Word με δεδομένα από 1C.
3. συμπληρώνοντας τον πίνακα στο Word με δεδομένα από το 1C.

Έναρξη εργασιών

Στις περισσότερες περιπτώσεις, αντιμετωπίζουμε την ακόλουθη εργασία:
Χρειάζεται άνοιγμα έγγραφο του Word, γεμάτο με δεδομένα από 1C.

Για να γίνει αυτό, πρέπει να προετοιμάσουμε ένα πρότυπο εγγράφου του Word. Μην το συγχέετε με το πρότυπο Word, ειδικά αρχεία Word, τα οποία περιέχουν ρυθμίσεις εγγράφων για πολλαπλή χρήση. Χρειαζόμαστε ένα κανονικό έγγραφο του Word με επεκτάσεις *.docx ή *.doc. Στη συνέχεια, τοποθετήστε αυτό το έγγραφο σε μια διάταξη με δυαδικά δεδομένα.

Προσπάθεια //Λήψη διάταξης από δυαδικά δεδομένα Πρότυπο = GetLayout(AdditionalParameters.ContractType); FileName = GetTemporaryFileName(".docx"); Template.Write(FileName); //Δημιουργία αντικειμένου COM για εργασία με το Word ObjectWord = New COMObject("Word.Application"); ObjectWord.Documents.add(FileName); // Στο Word, μπορείτε να ανοίξετε πολλά έγγραφα σε μία εφαρμογή, επομένως το αντικείμενο Word.Application.Documents είναι μια συλλογή ανοιχτά έγγραφα. //Στην περίπτωσή μας, το έγγραφο είναι πάντα ανοιχτό ένα DocumentWord = ObjectWord.Application.Documents(1); DocumentWord.Activate(); Αναφορά εξαίρεσης ("Σφάλμα έναρξης εφαρμογής "+ErrorDescription()); Τέλος απόπειρας; //Φυσικά, η λήψη του αντικειμένου COM θα πρέπει να τοποθετηθεί σε μια προσπάθεια. Ποτέ δεν ξέρεις, κάτι δεν πάει καλά.

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

//Δημιουργία της δομής των παραμέτρων του εγγράφου DocumentParameters = PrepareParameterStructure(); //Συμπλήρωση της δομής παραμέτρων του εγγράφου Fill inParameterStructure(DocumentParameters);

Ας εμβαθύνουμε λίγο στις αρχές του τρόπου λειτουργίας του Word ...

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

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

Καθε σελίδα λέξηςχωρίζεται σε διάφορους τομείς:

  • Κεφαλίδα σελίδας
  • Κύριο κείμενο
  • υποσέλιδο

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

//Αντικείμενο, περιέχει όλο το κύριο κείμενο από όλες τις ενότητες του DocumentWord.Content //Το αντικείμενο περιέχει μια συλλογή ενοτήτων του εγγράφου DocumentWord.Sections //Κάθε ενότητα έχει τη δική της συλλογή για τις κεφαλίδες DocumentWord.Sections(1). Κεφαλίδες //Και η δική της συλλογή για τα υποσέλιδα DocumentWord.Sections(1).Υποσέλιδα //Ταυτόχρονα, εάν είναι επιλεγμένο το πλαίσιο ελέγχου "Μοναδική κεφαλίδα και υποσέλιδο για την πρώτη σελίδα", οι συλλογές κεφαλίδων και υποσέλιδων θα περιέχουν δύο στοιχεία

Συμπλήρωση παραμέτρων χρήστη

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

Τώρα έχουμε λίγο-πολύ κατανοήσει πώς να προσπελάσουμε τις περιοχές του Word, μπορούμε να παίξουμε μαζί τους και να αντικαταστήσουμε τις παραμέτρους μας:

//Ας εξετάσουμε όλες τις παραμέτρους και ας τις αντικαταστήσουμε στο έγγραφο For every Parameter From DocumentParameters Loop PerformReplace(DocumentWord.Content, Parameter.Key, Parameter.Value); //Αναζήτηση για εμφανίσεις της παραμέτρου στην κεφαλίδα PerformReplace(DocumentWord.Sections(1).Headers.Item(1).Range(), Parameter.Key, Parameter.Value); //Αναζήτηση για εμφανίσεις της παραμέτρου στο υποσέλιδο της πρώτης και των επόμενων σελίδων PerformReplacement(DocumentWord.Sections(1).Footers.Item(1).Range(), Parameter.Key, Parameter.Value); ExecuteReplace(DocumentWord.Sections(1).Footers.Item(2).Range(), Parameter.Key, Parameter.Value); EndCycle; //Εκτέλεση εύρεσης και αντικατάστασης συνάρτησης ExecuteReplace(Value Object, Parameter, Value) Object.Find.Execute(Parameter,,Value,2) EndFunction

Εξετάστε τη μέθοδο Execute με περισσότερες λεπτομέρειες. Οι παράμετροί του είναι πανομοιότυπες με το πλαίσιο διαλόγου κατά την αντικατάσταση/αναζήτηση απευθείας από το MS Word:

Και εδώ είναι οι κύριες παράμετροι (δωρεάν μετάφραση της βοήθειας MSDN):

  1. Αναζήτηση κειμένου - Συμβολοσειρά - Κείμενο προς αντικατάσταση. Το κείμενο μπορεί να περιέχει ειδικές επιλογές. Για παράδειγμα, ^p - παράγραφος, ^t - καρτέλα
  2. Ευαισθησία πεζών-κεφαλαίων - Boolean - Εάν ισχύει, η αναζήτηση θα γίνεται με διάκριση πεζών-κεφαλαίων
  3. Ολόκληρες λέξεις - Boolean - Εάν είναι αληθές, αναζητά ολόκληρες λέξεις. Εμφανίσεις λέξεων δεν λαμβάνονται υπόψη. Για παράδειγμα, κατά την αναζήτηση της λέξης σπίτι, η λέξη σπίτι θα παραληφθεί.
  4. Χρησιμοποιήστε χαρακτήρες μπαλαντέρ - Boolean - Εάν είναι αληθές, χρησιμοποιούνται οι ενσωματωμένες κανονικές εκφράσεις.
  5. Αναζήτηση παρόμοια - Boolean - Εάν είναι αληθές, το αποτέλεσμα αναζήτησης θα περιέχει παρόμοιες λέξεις
  6. Αναζήτηση όλων των μορφών - Boolean - Εάν είναι αληθές, τότε το αποτέλεσμα αναζήτησης θα περιέχει διάφορες μορφές λέξεων.
  7. Αναζήτηση πρώτα - Boolean - Εάν είναι αληθές, θα γίνει αναζήτηση από την αρχή έως το τέλος του εγγράφου
  8. Κάλυψη - WdFindWrap - Καθορίζει την κατεύθυνση αναζήτησης
  9. Μορφή - Μορφή - Μορφή του αναζητούμενου κειμένου
  10. Συμβολοσειρά αντικατάστασης - Συμβολοσειρά - Η συμβολοσειρά με την οποία θα αντικατασταθεί το αρχικό κείμενο
  11. Αριθμός αντικαταστάσεων - WdReplace - Καθορίζει πόσες φορές θα αντικατασταθεί
  12. και τα λοιπά.

WdReplace - Σταθερή τιμή:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

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

//PrintControlMSWordClient με μικρές αλλαγές για τη διαμόρφωση SCP 1.3 Συνάρτηση PerformReplace(Αντικείμενο τιμής, Παράμετρος, Τιμή) SearchString = "[" + Παράμετρος + "]"; StringReplacement = String(Value); //Είναι απαραίτητο να επιλέξετε τις περιοχές στις οποίες αντικαθιστούμε το Object.Select(); //Λήψη της επιλεγμένης περιοχής Selection = Object.Application.Selection; //Βρείτε όλες τις εμφανίσεις της παραμέτρου και αντικαταστήστε την με την τιμή που χρειαζόμαστε FindObject = Selection.Find; FindObject.ClearFormatting(); Ενώ FindObject.Execute(SearchString) Loop If EmptyString(ReplacementString) Τότε Selection.Delete(); Else Selection.TypeText(ReplacementString); Τέλος εαν; EndCycle; //Αποεπιλογή επιλογής Selection.Collapse(); EndFunctions

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

//Επεξεργασία της γραμματοσειράς Selection.Font //Editing the color Selection.HighlightColorIndex

Υπάρχει επίσης μια δεύτερη προσέγγιση που χρησιμοποιεί το αντικείμενο Word ως πεδία. Δεν μου αρέσει πολύ, γιατί. σε μεγάλα έγγραφα, περίπου 100 σελίδες, αυτά τα πεδία αρχίζουν να αποτυγχάνουν (εξαφανίζονται, μην αντικαθιστούν επιθυμητές τιμές) και άλλες ανοησίες. Λοιπόν, τουλάχιστον στο Word 2007. Αλλά θα το δώσω πάντως:

Κατά την προετοιμασία ενός προτύπου, είναι απαραίτητο να εισάγετε πεδία με τον τύπο DOCVARIABLE στο σώμα του εγγράφου (μπορείτε να τα εισαγάγετε χρησιμοποιώντας τα πλήκτρα συντόμευσης Ctrl+F9).

Τα πεδία αυτά είναι προσβάσιμα με τον ακόλουθο απλό τρόπο:

DocumentWord.Variables.Item(ParameterName).Τιμές

Συμπλήρωση πινάκων σύμφωνα με ένα πρότυπο

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

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

Οι πίνακες είναι προσβάσιμοι μέσω περιοχών εγγράφων.

//Αποκτήστε πρόσβαση στον πρώτο πίνακα στο κύριο κείμενο Table = DocumentWord.Content.Tables(1)

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

//Δεδομένα για συμπλήρωση ParametersPM = DocumentParameters.ApplicationPM; //Πρέπει να αφήσετε ανέγγιχτη την κεφαλίδα και την πρώτη γραμμή Iterator = 2; Πίνακας = DocumentWord.Content.Tables(3); Για κάθε γραμμή από ParametersTCH Ο βρόχος //Από προεπιλογή προσθέτει μια σειρά πάνω από τον πρώτο Table.Rows.Add(); Συμπληρώστε τη σειρά του πίνακα (Πίνακας, Επαναληπτικός, Συμβολοσειρά, "PP, Όνομα Ονοματολογίας, Μονάδα Μέτρησης, Γραμμή Τιμής", Παράμετροι PM). Iterator = Iterator + 1; EndCycle; //Η δομή των προτύπων περιέχει τα ονόματα των στηλών και τη σειρά τους. Διαδικασία FillTableRow(Table,RowNumber,FillValue,TemplateStructure,ValueTable) StringArray = General Purpose.ExpandStringIntoSubstringArray(TemplateStructure,","); επαναλήπτης = 1; Για κάθε συμβολοσειρά από Array Of String Βρόχος If ValueTable.Columns.Find(String) = Undefined AND String<>"PP" Τότε Iterator = Iterator + 1; Προχωρώ; //Μην ξεχνάτε ότι η Κεφαλίδα είναι επίσης μια συμβολοσειρά και κατά την αρίθμηση πρέπει να την αποκλείσουμε ElseIf String = "PP" Στη συνέχεια Table.Cell(LineNumber, Iterator).Range().Text = String(LineNumber-1) ; Iterator = Iterator + 1; Προχωρώ; Τέλος εαν; Table.Cell(RowNumber, Iterator).Range().Text = String(FillValue[String]); Iterator = Iterator + 1; EndCycle; Διαδικασία λήξης

Αυτό είναι βασικά. Προσπάθησα να επισημάνω τα κύρια ζητήματα που προκύπτουν κατά την εργασία με το Word. Ελπίζω ότι αυτή η κριτική θα σας βοηθήσει στη δουλειά σας =)

Ευχαριστώ για τις συμβουλές και τα σχόλια:
,

Η κριτική είναι μόνο ευπρόσδεκτη. Όσο περισσότερα σχόλια, τόσο καλύτερος θα είναι ο οδηγός =)

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

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

Ας δημιουργήσουμε ένα πρότυπο βασισμένο σε ένα έγγραφο του Word για 1C. Πρώτα πρέπει να ενεργοποιήσετε τους σελιδοδείκτες για περισσότερα βολική λειτουργίαμε έγγραφο:


Στη συνέχεια, πρέπει να προσθέσετε κείμενο και μερικούς σελιδοδείκτες στο αρχείο προτύπου για 1C. Ο σελιδοδείκτης προστίθεται μέσω του μενού "Εισαγωγή" - "Σελιδοδείκτης". Πρέπει να επιλέξετε το κείμενο του σελιδοδείκτη, να το αντιγράψετε, να ανοίξετε το μενού "Εισαγωγή - Σελιδοδείκτης", να επικολλήσετε το αντιγραμμένο κείμενο σελιδοδείκτη και να κάνετε κλικ στο "Προσθήκη":


Όταν το αρχείο προτύπου Word είναι έτοιμο, δημιουργούμε μια νέα εξωτερική επεξεργασία σε 1C, προσθέτουμε μια φόρμα και εισάγουμε τον ακόλουθο κώδικα στη λειτουργική μονάδα φόρμας: &Στη διαδικασία πελάτη κατά το άνοιγμα (απόρριψη) Συμπλήρωση προτύπου Word (); EndProcedure &Συνάρτηση AtClient FillTemplateWord() //Προσπάθεια δημιουργίας αντικείμενο COM AttemptWordObject = Νέο COMObject("Word.Application"); Αναφορά εξαίρεσης ("Σφάλμα κατά την εκκίνηση Microsoft Word: " + ErrorDescription(), MessageStatus.Attention); Return Undefined; EndTry; //Διαδρομή προς το πρότυπο WordObject.Documents.Add("C:\Users\Konstantin\Desktop\Template.docx"); WordTemplate = WordObject.Active ; //Λήψη όλων των σελιδοδεικτών από το πρότυπο Για κάθε BookmarkWord από το TemplateWord.Bookmarks Αναφορά βρόχου (BookmarkWord.Name); EndCycle; //Αντικατάσταση σελιδοδείκτη1 με κείμενο TemplateWord.Bookmarks("Bookmark1").Select(); TemplateWord.Application.Selection .TypeText ("Κείμενο για σελιδοδείκτη #1."); //Αντικατάσταση σελιδοδείκτη2 με κείμενο TemplateWord.Bookmarks("Bookmark2").Select(); TemplateWord.Application.Selection.TypeText("Κείμενο για σελιδοδείκτη #2."); // Αλλαγή σελιδοδείκτη 3 σε σημερινή ημερομηνία TemplateWord.Bookmarks("Bookmark3").Select(); TemplateWord.Application.Selection.TypeText(CurrentDate()); ObjectWord.Application.Visible = true; ObjectWord.Activate(); //Κλείσιμο του εγγράφου //Word object.Application.Quit(); EndFunctions

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

Πληροφορίες σχετικά με τις μεθόδους COM του αντικειμένου Word, καθώς και πρόσθετα δεδομένα, μπορείτε να βρείτε στο MSDN.

Προσθήκη στη σημείωση Χρήση προτύπων του Word σε 1C

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

1. Και πώς να αλλάξετε το μέγεθος της γραμματοσειράς στο εισαγόμενο κείμενο;
Αρκεί να αλλάξετε το μέγεθος γραμματοσειράς του σελιδοδείκτη στο πρότυπο. Αλλά εάν πρέπει να αλλάξετε δυναμικά τη διάσταση, τότε:

//Αντικατάσταση σελιδοδείκτη3 με την τρέχουσα ημερομηνία TemplateWord.Bookmarks("Bookmark3").Select(); TemplateWord.Application.Selection.Font.Bold = 1; TemplateWord.Application.Selection.Font.Size = 20; TemplateWord.Application.Selection.TypeText(CurrentDate());

2. Είναι δυνατή η αποστολή εικόνων σε ένα πρότυπο;
Α, καλά. Παραδείγματα για C# και VB περιγράφονται στον σύνδεσμο: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx και για 1C ο κώδικας θα είναι ο εξής:

// Εισαγωγή εικόνας TemplateWord.Bookmarks("Bookmark3").Select(); TemplateWord.Application.Selection.InlineShapes.AddPicture("C:\Users\Konstantin\Desktop\logo_1c.png");

3. Κατά την εκτέλεση του κώδικα: ObjectWord.Documents.Add("C:/Template.docx") (όπου τοποθέτησα το έγγραφό σας) λαμβάνω ένα σφάλμα: "Σφάλμα κατά την κλήση της μεθόδου περιβάλλοντος (Προσθήκη)"Ποιος μπορεί να είναι ο λόγος;
Ίσως προσπαθήσετε να αλλάξετε τη διαδρομή σε: "C:\Template.docx".

4. Πείτε μου γιατί κατά την αποθήκευση της διάταξης του ενεργού τύπου εγγράφου στο αρχείο word με τον κωδικό:

ProcessingObject = FormAttributeToValue("Object"); Layout = ProcessingObject.GetLayout("Delay Letter Template"); FileName = TempFileDirectory() + "\"file.doc";Layout.Write(FileName);

Παίρνω αντί για ένα κανονικό έγγραφο όπως αυτό http://prntscr.com/eshgjk
Υποθέτω ότι η μέθοδος Write(,), από προεπιλογή, γράφει το αρχείο σε μορφή MXL. Δοκιμάστε να ορίσετε την τιμή ως τη δεύτερη παράμετρο: SpreadsheetDocumentFileType.DOCX, που περιγράφεται με περισσότερες λεπτομέρειες στο "Βοηθός σύνταξης".

5. Έχω συνδέσμους στο έγγραφό μου προς αρχεία που βρίσκονται στο μονάδα δίσκου δικτύου. Πώς να δημιουργήσετε έναν υπερσύνδεσμο σε αυτά τα αρχεία στο πρότυπο;
Μια ενδιαφέρουσα ερώτηση, αν προσπαθήσετε να εγγράψετε μια μακροεντολή και δείτε το αποτέλεσμα, τότε μπείτε Visual BasicΗ προσθήκη υπερσυνδέσμου θα μοιάζει με αυτό:

Sub Macro1() " " Macro1 Macro " " Selection.MoveLeft Unit:=wdCharacter, Count:=15, Extend:=wdExtend ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _ "C:\Users\Konstantin \Desktop\Test.txt", SubAddress:="", ScreenTip:="", _ TextToDisplay:="TestLink" End Sub

Προσθήκη περιγραφής μεθόδου στο MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word

Κατά συνέπεια, ο κωδικός για το 1C είναι ο εξής:

Συνάρτηση FillTemplateWord() //Προσπάθεια δημιουργίας αντικειμένου COM Attempt WordObject = Νέο COMObject("Word.Application"); Αναφορά εξαίρεσης ("Σφάλμα κατά την εκκίνηση του Microsoft Word: " + ErrorDescription(), MessageStatus.Attention); Επιστροφή Απροσδιόριστο? Τέλος απόπειρας; //Διαδρομή προς το πρότυπο ObjectWord.Documents.Add("C:\Users\k.blagin\Desktop\Template.docx"); TemplateWord = ObjectWord.ActiveDocument; //Λήψη όλων των συνδέσμων από το πρότυπο Για κάθε BookmarkWord From TemplateWord.Hyperlinks Notify Loop(BookmarkWord.Name); EndCycle; //Αλλαγή της διεύθυνσης ενός υπάρχοντος συνδέσμου TemplateWord.Hyperlinks("Logs.zip").Διεύθυνση = "C:\Users\k.blagin\Desktop\Memory.zip"; //Αντικαταστήστε τον σελιδοδείκτη με έναν σύνδεσμο ObjectBookmark = TemplateWord.Bookmarks("Bookmark3"); TemplateWord.Hyperlinks.Add(ObjectBookmark.Range, "C:\Users\k.blagin\Desktop\Template.docx", "", "Template.docx", "C:\Users\k.blagin\Desktop\Template. docx"); ObjectWord.Application.Visible = True; ObjectWord.Activate(); //Κλείσιμο του εγγράφου //Word object.Application.Quit(); EndFunctions

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

Η αρχή της επεξεργασίας είναι η εξής:

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

Προετοιμασία του προτύπου Word

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

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



Τα κενά δεν μπορούν να χρησιμοποιηθούν σε ονόματα σελιδοδεικτών.

Κατά την εκτύπωση θα συμπληρώσουμε και τον πίνακα εμπορευμάτων. Για να φαίνεται ωραίο, αφήστε την κεφαλίδα και μια κενή γραμμή:


Αποθήκευση Word, κλείσιμο.

Ρύθμιση της πλήρωσης προτύπου

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


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

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


Στο παράθυρο που ανοίγει, επιλέξτε για να προσθέσετε ένα αρχείο:


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


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

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

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


Ως αποτέλεσμα της επιλογής πηγής, ο πίνακας θα μοιάζει με αυτό:


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


Για να εκτυπώσετε έναν πίνακα στο Word, επιλέξτε τον αρχικό πίνακα εγγράφων:


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


Όλα είναι εντάξει, τώρα μπορούμε να εκτυπώσουμε το επιθυμητό Word.

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



Μπορούμε να εκτυπώσουμε τόσο ένα έγγραφο όσο και μια λίστα:


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


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


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

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

Έκδοση 1.1.2.2 με ημερομηνία 15/12/2018

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


Τώρα μπορείτε να αφαιρέσετε τα περιττά πρότυπα:


Έκδοση 1.1.2.3 με ημερομηνία 29/01/2019

Τώρα μπορείτε να εμφανίσετε μέρη της ημερομηνίας ξεχωριστά - ημέρα, μήνα (αριθμός ή όνομα) και έτος:


Για τα άτομα(και εργολάβοι με τον τύπο του ατόμου) μπορείτε πλέον να εμφανίσετε δεδομένα διαβατηρίου:


Έκδοση 1.1.2.4 με ημερομηνία 03/12/2019

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


Έκδοση 1.1.2.5 με ημερομηνία 07/12/2019

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


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


Από αυτή τη φόρμα, εάν είναι απαραίτητο, μπορείτε να ανοίξετε ένα ολοκληρωμένο πρότυπο Word για προβολή / επεξεργασία.

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

Η δημοσίευση είναι ένα είδος σημείωσης που περιέχει παραδείγματα κώδικα για:

  1. συμπληρώνοντας το πρότυπο Word με δεδομένα από 1C.
  2. γέμισμα κεφαλίδων και υποσέλιδων του Word με δεδομένα από 1C.
  3. γεμίζοντας έναν πίνακα στο Word με δεδομένα από 1C.
Έναρξη εργασιών

Στις περισσότερες περιπτώσεις, αντιμετωπίζουμε την ακόλουθη εργασία:
Πρέπει να ανοίξετε ένα έγγραφο του Word γεμάτο με δεδομένα από 1C.

Για να γίνει αυτό, πρέπει να προετοιμάσουμε ένα πρότυπο εγγράφου του Word. Μην το συγχέετε με το Word Template, ειδικά αρχεία Word που περιέχουν ρυθμίσεις εγγράφων για επαναχρησιμοποίηση. Χρειαζόμαστε ένα κανονικό έγγραφο του Word με επεκτάσεις *.docx ή *.doc. Στη συνέχεια, τοποθετήστε αυτό το έγγραφο σε μια διάταξη με δυαδικά δεδομένα.

Απόπειρα
//Λήψη διάταξης από δυαδικά δεδομένα
Πρότυπο = GetLayout(AdditionalParameters.ContractType);
FileName = GetTemporaryFileName(".docx");
Template.Write(FileName);
//Δημιουργήστε ένα αντικείμενο COM για εργασία με το Word
WordObject = Νέο COMObject("Word.Application");
ObjectWord.Documents.add(FileName);
//Το Word μπορεί να έχει πολλά έγγραφα ανοιχτά στην ίδια εφαρμογή, επομένως το αντικείμενο Word.Application.Documents είναι μια συλλογή ανοιχτών εγγράφων.
//Στην περίπτωσή μας, το έγγραφο είναι πάντα ανοιχτό μόνο του
DocumentWord = ObjectWord.Application.Documents(1);
DocumentWord.Activate();
Αναφορά εξαίρεσης ("Σφάλμα έναρξης εφαρμογής "+ErrorDescription());
Τέλος απόπειρας;
//Φυσικά, η λήψη του αντικειμένου COM θα πρέπει να τοποθετηθεί σε μια προσπάθεια. Ποτέ δεν ξέρεις, κάτι δεν πάει καλά.

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

//Δημιουργία της δομής παραμέτρων εγγράφου
DocumentParameters = PrepareParameterStructure();
//Συμπληρώστε τη δομή των παραμέτρων του εγγράφου
Συμπληρώστε inStructureParameters(DocumentParameters);

Ας εμβαθύνουμε λίγο στις αρχές του τρόπου λειτουργίας του Word ...

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

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

Κάθε σελίδα του Word χωρίζεται σε διάφορες περιοχές:

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

//Object, περιέχει όλο το κύριο κείμενο από όλες τις ενότητες του DocumentWord.Content
//Το αντικείμενο περιέχει μια συλλογή από ενότητες εγγράφου
DocumentWord.Sections
// Κάθε ενότητα έχει τη δική της συλλογή για κεφαλίδες
DocumentWord.Sections(1).Headers
//Και δική συλλογή για υποσέλιδα
DocumentWord.Sections(1).Υποσέλιδα
//Ταυτόχρονα, εάν είναι επιλεγμένο το πλαίσιο ελέγχου "Μοναδική κεφαλίδα για την πρώτη σελίδα", τότε οι συλλογές Κεφαλίδες και Υποσέλιδα θα περιέχουν δύο στοιχεία

Συμπλήρωση παραμέτρων χρήστη

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

Τώρα έχουμε λίγο-πολύ κατανοήσει πώς να προσπελάσουμε τις περιοχές του Word, μπορούμε να παίξουμε μαζί τους και να αντικαταστήσουμε τις παραμέτρους μας:

//Επαναλάβετε όλες τις παραμέτρους και αντικαταστήστε τις στο έγγραφο
Για κάθε παράμετρο από το DocumentParameters Loop
ExecuteReplace(DocumentWord.Content, Parameter.Key, Parameter.Value);
//Αναζήτηση για εμφανίσεις της παραμέτρου στην κεφαλίδα
ExecuteReplace(DocumentWord.Sections(1).Headers.Item(1).Range(), Parameter.Key, Parameter.Value);
//Αναζητήστε εμφανίσεις παραμέτρων στο υποσέλιδο της πρώτης και των επόμενων σελίδων
ExecuteReplace(DocumentWord.Sections(1).Footers.Item(1).Range(), Parameter.Key, Parameter.Value);
ExecuteReplace(DocumentWord.Sections(1).Footers.Item(2).Range(), Parameter.Key, Parameter.Value);
EndCycle;

//Εκτελέστε τη λειτουργία εύρεσης και αντικατάστασης
PerformReplace (Αντικείμενο τιμής, Παράμετρος, Τιμή)
Object.Find.Execute(Παράμετρος,,Τιμή,2)
EndFunctions

Εξετάστε τη μέθοδο Execute με περισσότερες λεπτομέρειες. Οι παράμετροί του είναι πανομοιότυπες με το πλαίσιο διαλόγου κατά την αντικατάσταση/αναζήτηση απευθείας από το MS Word:

(36,38 kilobyte) Αριθμός λήψεων: 5

Και εδώ είναι οι κύριες παράμετροι (δωρεάν μετάφραση της βοήθειας MSDN):

  1. Αναζήτηση κειμένου - Συμβολοσειρά - Κείμενο προς αντικατάσταση. Το κείμενο μπορεί να περιέχει ειδικές παραμέτρους. Για παράδειγμα, ^p - παράγραφος, ^t - καρτέλα
  2. Ευαισθησία πεζών-κεφαλαίων - Boolean - Εάν ισχύει, η αναζήτηση θα γίνεται με διάκριση πεζών-κεφαλαίων
  3. Ολόκληρες λέξεις - Boolean - Εάν είναι αληθές, αναζητά ολόκληρες λέξεις. Εμφανίσεις λέξεων δεν λαμβάνονται υπόψη. Για παράδειγμα, κατά την αναζήτηση της λέξης σπίτι, η λέξη σπίτι θα παραληφθεί.
  4. Χρησιμοποιήστε χαρακτήρες μπαλαντέρ - Boolean - Εάν είναι αληθές, χρησιμοποιούνται οι ενσωματωμένες κανονικές εκφράσεις.
  5. Αναζήτηση παρόμοια - Boolean - Εάν είναι αληθές, το αποτέλεσμα αναζήτησης θα περιέχει παρόμοιες λέξεις
  6. Αναζήτηση όλων των μορφών - Boolean - Εάν είναι αληθές, τότε το αποτέλεσμα αναζήτησης θα περιέχει διάφορες μορφές λέξεων.
  7. Αναζήτηση πρώτα - Boolean - Εάν είναι αληθές, θα γίνει αναζήτηση από την αρχή έως το τέλος του εγγράφου
  8. Κάλυψη - WdFindWrap - Καθορίζει την κατεύθυνση της αναζήτησης
  9. Μορφή - Μορφή - Μορφή του αναζητούμενου κειμένου
  10. Συμβολοσειρά αντικατάστασης - Συμβολοσειρά - Η συμβολοσειρά με την οποία θα αντικατασταθεί το αρχικό κείμενο
  11. Αριθμός αντικαταστάσεων - WdReplace - Καθορίζει πόσες φορές θα αντικατασταθεί
  12. και τα λοιπά.
WdReplace - Σταθερή τιμή:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

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

//ManagePrintMSWordClient με μικρές αλλαγές για τη διαμόρφωση του SCP 1.3
Συνάρτηση PerformReplace (Αντικείμενο τιμής, Παράμετρος, Τιμή)
SearchString = "[" + Παράμετρος + "]";
StringReplacement = String(Value);
// Είναι απαραίτητο να επιλέξουμε τις περιοχές στις οποίες αντικαθιστούμε
Object.Select();
//Λήψη της επιλεγμένης περιοχής
Επιλογή = Αντικείμενο.Εφαρμογή.Επιλογή;
//Βρείτε όλες τις εμφανίσεις της παραμέτρου και αντικαταστήστε την με την τιμή που χρειαζόμαστε
FindObject = Selection.Find;
FindObject.ClearFormatting();
Ενώ βρόχος FindObject.Execute(SearchString).
Αν EmptyString(ReplacementString) Τότε
Selection.Delete();
Σε διαφορετική περίπτωση
Selection.TypeText(SubstitutionString);
Τέλος εαν;
EndCycle;
// Αποεπιλογή
Selection.Collapse();
EndFunctions

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

//Επεξεργασία της γραμματοσειράς
Επιλογή.Γραμματοσειρά
//Επεξεργασία χρώματος
Επιλογή.HighlightColorIndex

Υπάρχει επίσης μια δεύτερη προσέγγιση που χρησιμοποιεί το αντικείμενο Word ως πεδία. Δεν μου αρέσει πολύ, γιατί. σε μεγάλα έγγραφα, περίπου 100 σελίδες, αυτά τα πεδία αρχίζουν να αποτυγχάνουν (εξαφανίζονται, δεν αντικαθιστούν τις επιθυμητές τιμές) και άλλες ανοησίες. Λοιπόν, τουλάχιστον στο Word 2007. Αλλά θα το δώσω πάντως:

Κατά την προετοιμασία ενός προτύπου, είναι απαραίτητο να εισάγετε πεδία με τον τύπο DOCVARIABLE στο σώμα του εγγράφου (μπορείτε να τα εισαγάγετε χρησιμοποιώντας τα πλήκτρα συντόμευσης Ctrl+F9).

Τα πεδία αυτά είναι προσβάσιμα με τον ακόλουθο απλό τρόπο:

DocumentWord.Variables.Item(ParameterName).Τιμές

Συμπλήρωση πινάκων σύμφωνα με ένα πρότυπο

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

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

Οι πίνακες είναι προσβάσιμοι μέσω περιοχών εγγράφων.

//Αποκτήστε πρόσβαση στον πρώτο πίνακα στο κυρίως κείμενο
Πίνακας = DocumentWord.Content.Tables(1)

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

//Δεδομένα προς συμπλήρωση
Παράμετροι PM = ParametersDocument.Application PM;
//Πρέπει να αφήσετε ανέγγιχτη την κεφαλίδα και την πρώτη γραμμή Iterator = 2;
Πίνακας = DocumentWord.Content.Tables(3);
Για κάθε σειρά από παραμέτρους PM Loop
//Από προεπιλογή προσθέτει μια γραμμή πάνω από την πρώτη
Table.Rows.Add();
Συμπληρώστε τη σειρά του πίνακα (Πίνακας, Επαναληπτικός, Συμβολοσειρά, "PP, Όνομα Ονοματολογίας, Μονάδα Μέτρησης, Γραμμή Τιμής", Παράμετροι PM).
Iterator = Iterator + 1;
EndCycle;
//Η δομή προτύπου περιέχει τα ονόματα των στηλών και τη σειρά τους
Διαδικασία FillTableRow(Πίνακας,Αριθμός γραμμής,Τιμή συμπλήρωσης,Δομή προτύπου,Πίνακας τιμών)
StringArray = General Purpose.ExpandStringIntoSubstringArray(TemplateStructure,",");
επαναλήπτης = 1;
Για κάθε συμβολοσειρά από το Array Of String Loop
Αν ValueTable.Columns.Find(String) = Undefined AND String "PP" Τότε
Iterator = Iterator + 1;
Προχωρώ;
// Μην ξεχνάτε ότι η κεφαλίδα είναι επίσης μια συμβολοσειρά, και κατά την αρίθμηση, πρέπει να την αποκλείσουμε
ElseIf String = "PP" Τότε
Table.Cell(RowNumber, Iterator).Range().Text = String(RowNumber-1);
Iterator = Iterator + 1;
Προχωρώ;
Τέλος εαν;
Table.Cell(RowNumber, Iterator).Range().Text = String(FillValue[String]);
Iterator = Iterator + 1;
EndCycle;
Διαδικασία λήξης

Αυτό είναι βασικά. Προσπάθησα να επισημάνω τα κύρια ζητήματα που προκύπτουν κατά την εργασία με το Word. Ελπίζω ότι αυτή η κριτική θα σας βοηθήσει στη δουλειά σας =)

[πρέπει να εγγραφείτε για να δείτε τον σύνδεσμο]