В момента ние с Господа на страха работим по интересен проект - разработваме решение, базирано на платформата 1C:Enterprise 8.2, за голяма компания. За поставените задачи възможностите на 1C са повече от достатъчни и изобщо не съжаляваме за избора си. Всъщност по-нататък няма да говорим за страхотната и мощна платформа 1C: Enterprise.

Един от ключови функциинашата програма - генериране на печатни форми на различни законодателни документи (протоколи, съобщения и др.). От техническа страна всичко изглежда просто - създавате стандартно оформление като документ с електронна таблица и започвате оформлението. Прекарахме време и бързо хвърлихме всички печатни форми. Получи се добре, но тогава клиентът поиска да преработим дизайна и ние попаднахме в локва. Проблемът беше невъзможността да се приложат стилове за форматиране към определени думи в една и съща клетка. Да, можете да приложите стил към цяла клетка, но този метод не ни подхожда, защото. една клетка може да съдържа няколко думи, но по някакъв начин само една от тях трябваше да бъде специално маркирана.

По принцип този проблем може да бъде решен чрез намаляване на размера на клетките на документа в електронната таблица. В някои случаи такива (малки) клетки са по-лесни за работа, но промяната на толкова висока надценка твърде често също не е достатъчна. Поне за мен.

Мислихме, мислихме и решихме да изоставим типичните оформления от типа „Документ с електронна таблица“ и да използваме възможностите на MS Word. Идеята беше нещо такова:

1. Създайте шаблони за необходимите документи. Всички шаблонни файлове са създадени точно като шаблони за MS Word. За тези, които не знаят, шаблоните са файлове с разширение точка. Въз основа на тях можете да създавате нови документи.

2. Използвайки OLE технология, създайте документи и заменете псевдо-променливи с желания текст. Псевдопроменливите бяха форматирани като: [Име на променлива].

3. В зависимост от ситуацията, отпечатайте или запазете генерирания документ.

По принцип няма трудности, но до днес и на двамата не ни се е налагало да работим от 1C:Enterprise с MS Word. По принцип всички оформления на печатни формуляри, които създадох, бяха базирани на документи с електронни таблици, така че нямах опит в прехвърлянето на данни от платформата, да речем, в MS Word / Excel. Често трябваше да се справям с четене на данни от Excel, но никога не ги предавах.

След като изсвирихме няколко парчета с китара, решихме да оставим многострадалния инструмент настрана и да се захванем за работа. След като помислихме малко и прочетохме помощ, скицирахме такъв пример:

//Създаване на нов обект от тип Word.Application WordApplication = New COMObject("WORD.Application"); //Създаване на нов документ въз основа на шаблона //В променливата PathKTemplate посочете пълния път до шаблона // създаден от нас (точково файлово разширение) 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 Application = 0;

Резултати от работата

Бяхме напълно доволни от възможността да използваме MS Word за генериране на елегантни печатни форми. Прекарахме няколко часа в писане на процедури за обвиване и също така преобразувахме създадени преди това формуляри в шаблони на MS Word. Бяхме повече от доволни от резултата. Всичко работи интелигентно и нашият клиент може лесно да промени шаблоните на изходните документи без никакви проблеми. В случай на задръствания (добре, ако клиентът случайно изпусне съществуващите шаблони), сме предоставили възможност за възстановяване на оригиналните файлове на шаблона.

Ако решите да приложите този подход във вашите проекти, бъдете изключително внимателни. Използването на всички тези nyashek изисква присъствие на компютъра на потребителя MS Word. Като се има предвид, че днес много компании преминават към ужасния (IMHO) OpenOffice - кандидатстване този методможе да причини проблеми. За щастие имаме късмет в това отношение.

Публикация - вашаРода бележка, съдържаща примери за код за:

1. пълнеж word шаблонданни от 1C;
2. попълване на заглавки и долни колонтитули на Word с данни от 1C;
3. попълване на таблицата в Word с данни от 1C;

Начало на работа

В повечето случаи се сблъскваме със следната задача:
Трябва да се отвори word документ, попълнен с данни от 1C.

За да направим това, трябва да подготвим шаблон на Word документ. Не бъркайте това с Word Template, специални файлове Word, които съдържат настройки на документа за многократна употреба. Нуждаем се от обикновен документ на Word с разширения *.docx или *.doc. И след това поставете този документ в оформление с двоични данни.

Опит //Получаване на оформление от двоични данни Template = GetLayout(AdditionalParameters.ContractType); FileName = GetTemporaryFileName(".docx"); Template.Write(Име на файл); //Създаване на COM обект за работа с Word ObjectWord = New COMObject("Word.Application"); ObjectWord.Documents.add(Име на файл); // В 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). Headers //И собствена колекция за долните колонтитули DocumentWord.Sections(1).Footers //В същото време, ако има отметка в квадратчето „Уникален горен и долен колонтитул за първата страница“, колекциите Headers и Footers ще съдържат два елемента

Попълване на потребителски параметри

При достъп до тези колекции можем да търсим в тях и да получаваме вградени обекти като таблици.

След като повече или по-малко разбрахме как да имаме достъп до области на Word, можем да си поиграем с тях и да заменим нашите параметри:

//Да прегледаме всички параметри и да ги заменим в документа За всеки параметър от 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. Цели думи - Булева стойност - Ако е вярно, търси цели думи. Срещането на думи не се взема предвид. Например, когато търсите думата дом, думата дом ще бъде пропусната.
  4. Използване на заместващи символи - Булева стойност - Ако е вярно, се използват вградените регулярни изрази.
  5. Search Similar - 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(Value Object, Parameter, Value) SearchString = "[" + Parameter + "]"; StringReplacement = String(Value); //Необходимо е да се изберат областите, в които заместваме Object.Select(); //Вземете избраната област Selection = Object.Application.Selection; //Намерете всички срещания на параметъра и го заменете със стойността, от която се нуждаем FindObject = Selection.Find; FindObject.ClearFormatting(); Докато FindObject.Execute(SearchString) Loop If EmptyString(ReplacementString) Then Selection.Delete(); Else Selection.TypeText(ReplacementString); EndIf; EndCycle; //Демаркиране на селекция Selection.Collapse(); Крайни функции

След като вече сте получили избраната област, можете да редактирате стила на текста, шрифта и т.н.

//Редактиране на шрифта Selection.Font //Редактиране на цвета Selection.HighlightColorIndex

Има и втори подход, който използва обекта на Word като полета. Не го харесвам много, защото. в големи документи, около 100 страници, тези полета започват да се провалят (изчезват, не замествайте желани стойности) и други глупости. Е, поне в Word 2007. Но все пак ще го дам:

Когато подготвяте шаблон, е необходимо да вмъкнете полета с тип DOCVARIABLE в тялото на документа (можете да ги вмъкнете с помощта на горещите клавиши Ctrl+F9).

Тези полета могат да бъдат достъпни по следния лесен начин:

DocumentWord.Variables.Item(ParameterName).Values

Попълване на таблици по образец

И така, попълнихме параметрите в основния текст на документа, заменихме параметрите в горните и долните колонтитули, но все още имаме един проблем - трябва да попълним таблицата.

Подходът, описан по-долу, е подходящ само за таблици с известен формат. Тези. можем да форматираме таблицата и нейните редове по какъвто желаем начин. Но тогава промяната е доста проблематична.

Таблиците могат да бъдат достъпни чрез региони на документа.

//Получаване на достъп до първата таблица в основния текст Table = DocumentWord.Content.Tables(1)

За да зададете форматирането, е по-лесно да създадете таблица в шаблона с празен първи ред, който ще изтрием по-късно.

//Данни за попълване ParametersPM = DocumentParameters.ApplicationPM; //Трябва да оставите заглавката и първия ред недокоснати Iterator = 2; Таблица = DocumentWord.Content.Tables(3); За всеки ред от ParametersTCH Loop //По подразбиране добавя ред над първата Table.Rows.Add(); Попълнете реда на таблицата (Таблица, Итератор, Низ, „PP, Име на номенклатурата, Мерна единица, Ред с цена“, Параметри PM); Итератор = Итератор + 1; EndCycle; //Структурата на шаблоните съдържа имената на колоните и техния ред Процедура FillTableRow(Table,RowNumber,FillValue,TemplateStructure,ValueTable) StringArray = General Purpose.ExpandStringIntoSubstringArray(TemplateStructure,","); итератор = 1; За всеки низ от масив от низове Цикъл If ValueTable.Columns.Find(String) = Undefined AND String<>"PP" Тогава итератор = итератор + 1; Продължете; //Не забравяйте, че заглавието също е низ и когато номерираме трябва да го изключим ElseIf String = "PP" Then Table.Cell(LineNumber, Iterator).Range().Text = String(LineNumber-1) ; Итератор = Итератор + 1; Продължете; EndIf; Table.Cell(RowNumber, Iterator).Range().Text = String(FillValue[String]); Итератор = Итератор + 1; EndCycle; EndProcedure

Това е общо взето. Опитах се да подчертая основните проблеми, които възникват при работа с Word. Надявам се, че този преглед ще ви помогне в работата ви =)

Благодаря за съветите и коментарите:
,

Критиката е добре дошла. Колкото повече коментари, толкова по-добро ще бъде ръководството =)

В работата на 1C програмист тази функционалност се изисква изключително рядко, въпреки че благодарение на нея можете да решите доста предизвикателни задачис динамични и непостоянни печатни форми. При изпълнението на тази задача работата по създаването на шаблони на Word и поставянето на отметки в шаблона на Word се възлага на потребителите на 1C.

AT този примерще бъде показано как, използвайки механизмите на 1C и документ на Word като шаблон, можете да създадете форма за печат за извеждане на данни на потребителите на програмата 1C.

Нека създадем шаблон въз основа на документ на Word за 1C. Първо трябва да активирате отметките за повече удобна работас документ:


След това трябва да добавите текст и няколко отметки към файла на шаблона за 1C. Отметката се добавя през менюто "Вмъкване" - "Отметка". Трябва да изберете текста на отметката, да го копирате, да отворите менюто "Вмъкване - Отметка", да поставите копирания текст на отметката и да щракнете върху "Добавяне":


Когато файлът с шаблон на Word е готов, създаваме нова външна обработка в 1C, добавяме формуляр и вмъкваме следния код в модула на формуляра: &На клиентската процедура При отваряне (отхвърляне) Попълнете шаблон на Word (); EndProcedure &AtClient Функция FillTemplateWord() //Опит за създаване COM обект AttemptWordObject = Нов COMObject("Word.Application"); Доклад за изключение ("Грешка при стартиране Майкрософт Уърд: " + ErrorDescription(), MessageStatus.Attention); Връща недефинирано; EndTry; //Път до шаблона WordObject.Documents.Add("C:\Users\Konstantin\Desktop\Template.docx"); WordTemplate = WordObject.ActiveDocument ; //Вземете всички отметки от шаблона За всяка BookmarkWord от TemplateWord.Bookmarks Loop Report(BookmarkWord.Name); EndCycle; //Заменете bookmark1 с текст 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(); Крайни функции

В резултат на стартиране на външна обработка 1C за формиране на печатен формуляр въз основа на шаблон под формата на Word файл, ще получим следния резултат:

Информация за COM методите на обекта на Word, както и допълнителни данни, могат да бъдат намерени на MSDN.

Допълнение към бележката Използване на Word шаблони в 1C

Изразявам своята благодарност на всички, които коментират записа, благодарение на вас материалът се допълва с нови данни и ще бъде полезен за по-широк кръг посетители.

1. А как да променя размера на шрифта във вмъкнатия текст?
Достатъчно е да промените размера на шрифта на отметката в шаблона. Но ако трябва динамично да промените измерението, тогава:

//Замяна на bookmark3 с текущата дата 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("Обект"); Layout = ProcessingObject.GetLayout("Шаблон на писмо за забавяне"); 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 обект Опит за WordObject = Нов COMObject("Word.Application"); Доклад за изключения ("Грешка при стартиране на Microsoft Word: " + ErrorDescription(), MessageStatus.Attention); Връщане Недефинирано; Край на опита; //Път до шаблона ObjectWord.Documents.Add("C:\Users\k.blagin\Desktop\Template.docx"); TemplateWord = ObjectWord.ActiveDocument; //Вземете всички връзки от шаблона за всяка BookmarkWord от TemplateWord.Hyperlinks Notify Loop(BookmarkWord.Name); EndCycle; //Промяна на адреса на съществуваща връзка TemplateWord.Hyperlinks("Logs.zip").Address = "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(); Крайни функции

Много полезно външна обработказа всички типични конфигурации на 1C:Enterprise 8.3 ви позволява да генерирате Word файл според избрания шаблон от директории и документи на системата. С негова помощ можете да отпечатате различни спецификации, трудови договори и договори с изпълнители, гаранционни карти и така нататък от 1C. Като имате под ръка Word на желаната структура и леко я модифицирате, ще можете да я формирате директно от 1s с попълване на всички необходими параметри.

Принципът на обработка е както следва:

  • изберете 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 от 12.03.2019 г

При отпечатване в Word на таблична част от документи за движение на стоки стана възможно да се използват не само подробностите на тази таблична част, но и всякакви подробности от номенклатурата:


Версия 1.1.2.5 от 12.07.2019 г

Стана възможно не само да се генерира шаблон на Word, но и автоматично да се прикачи към изходния обект (към прикачени файлове). За да направите това, изберете опцията за настройка Запазване в прикачени файлове.


В края на процедурата за печат ще се отвори формулярът за прикачен файл.


От тази форма, ако е необходимо, можете да отворите завършен шаблон на Word за преглед / редактиране.

Тази статия е опит да се събере информация за работата (на начално ниво) с 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(Име на файл);
//Създаване на COM обект за работа с Word
WordObject = Нов COMObject("Word.Application");
ObjectWord.Documents.add(Име на файл);
//Word може да има множество отворени документи в едно и също приложение, така че обектът Word.Application.Documents е колекция от отворени документи.
//В нашия случай документът винаги е отворен сам
DocumentWord = ObjectWord.Application.Documents(1);
DocumentWord.Activate();
Доклад за изключение ("Грешка при стартиране на приложение "+ErrorDescription());
Край на опита;
//Разбира се, получаването на COM обекта трябва да бъде поставено в опит. Никога не се знае, нещо се обърка.

Читателят може правилно да забележи, че се използва модално повикване и да размаха пръст на автора. И той ще бъде прав.

//Създаване на структурата на параметрите на документа
DocumentParameters = PrepareParameterStructure();
//Попълване на структурата на параметрите на документа
Попълнете StructureParameters(DocumentParameters);

Нека се задълбочим малко в принципите на това как работи Word ...

Всеки документ на Word е разделен на секции, които се състоят от страници.

За всеки раздел е възможно да създадете свое собствено номериране на елементи, уникални горни и долни колонтитули и настройки на страницата. Така например, за да завъртите една от страниците (отпечатайте като пейзаж), трябва да създадете отделен раздел за нея.

Всяка страница на Word е разделена на няколко области:

  • Горен колонтитул на страница
  • Основен текст
  • долен колонтитул
Трябва да се отбележи, че всеки раздел може да има уникален хедър за първата страница.

//Обект, съдържа целия основен текст от всички секции на DocumentWord.Content
//Обектът съдържа колекция от секции на документ
DocumentWord.Sections
// Всеки раздел има своя собствена колекция за заглавки
DocumentWord.Sections(1).Headers
//И собствена колекция за колонтитули
DocumentWord.Sections(1).Footers
//В същото време, ако има отметка в квадратчето „Уникален горен колонтитул за първата страница“, тогава колекциите Горни и долни колонтитули ще съдържат два елемента

Попълване на потребителски параметри

При достъп до тези колекции можем да търсим в тях и да получаваме вградени обекти като таблици.

След като повече или по-малко разбрахме как да имаме достъп до области на Word, можем да си поиграем с тях и да заменим нашите параметри:

//Итерация през всички параметри и замяната им в документа
За всеки параметър от цикъла DocumentParameters
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)
Крайни функции

Разгледайте метода Execute по-подробно. Параметрите му са идентични с диалоговия прозорец при замяна/търсене директно от MS Word:

(36,38 килобайта) Брой изтегляния: 5

И ето основните параметри (безплатен превод на MSDN помощ):

  1. Текст за търсене - Низ - Текст за замяна. Текстът може да съдържа специални параметри. Например ^p - параграф, ^t - раздел
  2. Чувствителност към малки и малки букви - Boolean - Ако е вярно, търсенето ще бъде чувствително към главни и малки букви
  3. Цели думи - Булева стойност - Ако е вярно, търси цели думи. Срещането на думи не се взема предвид. Например, когато търсите думата дом, думата дом ще бъде пропусната.
  4. Използване на заместващи символи - Булева стойност - Ако е вярно, се използват вградените регулярни изрази.
  5. Search Similar - 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();
//Вземете избраната област
Избор = Object.Application.Selection;
//Намерете всички срещания на параметъра и го заменете със стойността, от която се нуждаем
FindObject = Selection.Find;
FindObject.ClearFormatting();
Докато FindObject.Execute(SearchString) цикъл
If EmptyString(ReplacementString) Then
Избор.Изтриване();
В противен случай
Selection.TypeText(SubstitutionString);
EndIf;
EndCycle;
// Демаркиране
Selection.Collapse();
Крайни функции

След като вече сте получили избраната област, можете да редактирате стила на текста, шрифта и т.н.

//Редактиране на шрифта
Избор. Шрифт
//Редактиране на цвят
Selection.HighlightColorIndex

Има и втори подход, който използва обекта на Word като полета. Не го харесвам много, защото. в големи документи, около 100 страници, тези полета започват да се провалят (изчезват, не заместват желаните стойности) и други глупости. Е, поне в Word 2007. Но все пак ще го дам:

Когато подготвяте шаблон, е необходимо да вмъкнете полета с тип DOCVARIABLE в тялото на документа (можете да ги вмъкнете с помощта на горещите клавиши Ctrl+F9).

Тези полета могат да бъдат достъпни по следния лесен начин:

DocumentWord.Variables.Item(ParameterName).Values

Попълване на таблици по образец

И така, попълнихме параметрите в основния текст на документа, заменихме параметрите в горните и долните колонтитули, но все още имаме един проблем - трябва да попълним таблицата.

Подходът, описан по-долу, е подходящ само за таблици с известен формат. Тези. можем да форматираме таблицата и нейните редове по какъвто желаем начин. Но тогава промяната е доста проблематична.

Таблиците могат да бъдат достъпни чрез региони на документа.

//Получаване на достъп до първата таблица в основния текст
Таблица = DocumentWord.Content.Tables(1)

За да зададете форматирането, е по-лесно да създадете таблица в шаблона с празен първи ред, който ще изтрием по-късно.

//Данни за попълване
Параметри PM = ParametersDocument.Application PM;
//Трябва да оставите заглавката и първия ред недокоснати Iterator = 2;
Таблица = DocumentWord.Content.Tables(3);
За всеки ред от параметри PM Loop
//По подразбиране добавя ред над първия
Таблица.Редове.Добавяне();
Попълнете реда на таблицата (Таблица, Итератор, Низ, „PP, Име на номенклатурата, Мерна единица, Ред с цена“, Параметри PM);
Итератор = Итератор + 1;
EndCycle;
//Структурата на шаблона съдържа имената на колоните и техния ред
Процедура FillTableRow(Table,RowNumber,FillValue,TemplateStructure,ValueTable)
StringArray = General Purpose.ExpandStringIntoSubstringArray(TemplateStructure,",");
итератор = 1;
За всеки низ от цикъл от масив от низове
Ако ValueTable.Columns.Find(String) = Undefined И низ "PP" тогава
Итератор = Итератор + 1;
Продължете;
// Не забравяйте, че Header също е низ и когато номерираме, трябва да го изключим
ElseIf String = "PP" Тогава
Table.Cell(RowNumber, Iterator).Range().Text = String(RowNumber-1);
Итератор = Итератор + 1;
Продължете;
EndIf;
Table.Cell(RowNumber, Iterator).Range().Text = String(FillValue[String]);
Итератор = Итератор + 1;
EndCycle;
EndProcedure

Това е общо взето. Опитах се да подчертая основните проблеми, които възникват при работа с Word. Надявам се, че този преглед ще ви помогне в работата ви =)

[трябва да се регистрирате, за да видите връзката]