V současné době s Lord of fear pracujeme na zajímavém projektu – vyvíjíme řešení založené na platformě 1C:Enterprise 8.2 pro velkou společnost. Pro nastavené úkoly jsou možnosti 1C více než dostatečné a své volby vůbec nelitujeme. Ve skutečnosti nebudeme dále mluvit o skvělé a výkonné platformě 1C: Enterprise.

Jeden z klíčové funkce náš program - generování tištěných formulářů různých legislativních dokumentů (protokoly, oznámení atd.). Po technické stránce se vše zdá být jednoduché – vytvoříte standardní rozvržení, jako je tabulkový dokument, a spustíte rozvržení. Strávili jsme čas a rychle jsme vhodili všechny tiskové formy. Dopadlo to dobře, ale pak zákazník požadoval předělat design a dostali jsme se do louže. Problémem byla nemožnost použít styly formátování na určitá slova ve stejné buňce. Ano, styl můžete použít na celou buňku, ale tato metoda nám nevyhovovala, protože. jedna buňka může obsahovat několik slov, ale nějak bylo nutné speciálně zvýraznit pouze jedno z nich.

V zásadě lze tento problém vyřešit zmenšením velikosti buněk tabulkového dokumentu. V určitých případech se s takovými (malými) buňkami pracuje snadněji, ale příliš často měnit tak vysokou přirážku také nestačí. Alespoň pro mě.

Přemýšleli jsme, přemýšleli jsme a rozhodli jsme se opustit typická rozvržení typu „tabulkový dokument“ a využít možnosti MS Word. Myšlenka byla asi tato:

1. Vytvořte šablony pro potřebné dokumenty. Všechny soubory šablon byly vytvořeny přesně jako šablony pro MS Word. Pro neznalé jsou šablony soubory s příponou tečka. Na jejich základě můžete vytvářet nové dokumenty.

2. Pomocí technologie OLE vytvořte dokumenty a nahraďte pseudoproměnné požadovaný text. Pseudoproměnné byly formátovány jako: [Název proměnné].

3. V závislosti na situaci vytiskněte nebo uložte vygenerovaný dokument.

V zásadě neexistují žádné potíže, ale až do dnešního dne jsme oba nemuseli pracovat z 1C:Enterprise s MS Word. V podstatě všechny layouty tištěných formulářů, které jsem vytvořil, vycházely tabulkové dokumenty, takže jsem neměl žádné zkušenosti s přenosem dat z platformy, řekněme, do MS Word / Excel. Musel jsem často číst data z Excelu, ale nikdy je nepřenášet.

Po zahrání několika skladeb s kytarou jsme se rozhodli odložit strádající nástroj a pustit se do práce. Po malém přemýšlení a přečtení nápovědy jsme načrtli takový příklad:

//Vytvořte nový objekt typu Word.Application WordApplication = New COMObject("WORD.Application"); //Vytvořte nový dokument na základě šablony //V proměnné PathKTemplate zadejte úplnou cestu k námi vytvořené šabloně // (přípona souboru tečka) NewDocument = WordApplication .Documents.Add(PathKTemplate); //Příprava na searchReplaceContent = NewDocument.content.Find; //Nahraďte text //V prvním parametru metody Execute předejte řetězec, který má být nahrazen //V devátém - řetězec, který má být nahrazen //tj. v WhatReplace předáme jméno proměnné (například [UserName]) //a v posledním - její hodnotaReplaceContent.Execute(WhatReplace,False,True,False,True,False,String(WhatWeReplace)); //Dále vše závisí na našem Wishlistu //Uložení dokumentu NewDocument.SaveAs(PathToSave); //Tisk dokumentu NewDocument.PrintOut(); //Na konci práce je potřeba zavřít dokument a samotný Winword. To se provádí //Pro metodu Quit předám hodnotu False. To naznačuje, že nemusíme hotový dokument ukládat. WordApplication.application.Quit(False); Aplikace Word = 0;

Pracovní výsledky

Naprosto spokojeni jsme byli s možností použití MS Word pro generování elegantních tištěných formulářů. Strávili jsme několik hodin psaním procedur wrapperu a také jsme převedli dříve vytvořené formuláře do šablon MS Word. S výsledkem jsme byli více než spokojeni. Vše funguje chytře a náš zákazník může snadno bez problémů měnit šablony výstupních dokumentů. V případě zárubní (dobře, pokud zákazník omylem upustí stávající šablony), poskytujeme možnost obnovit původní soubory šablon.

Pokud se rozhodnete použít tento přístup ve svých projektech, buďte velmi opatrní. Použití všech těchto nyashek vyžaduje přítomnost MS Word na počítači uživatele. Vzhledem k tomu, že dnes mnoho společností přechází na hrozný (IMHO) OpenOffice - žádá tato metoda může způsobit problémy. Naštěstí máme v tomto ohledu štěstí.

Publikace - vaše R ode memo obsahující příklady kódu pro:

1. plnění šablona slovaúdaje z 1C;
2. vyplnění záhlaví a zápatí Wordu daty z 1C;
3. vyplnění tabulky ve Wordu daty z 1C;

Začátek práce

Ve většině případů stojíme před následujícím úkolem:
Nutno otevřít wordový dokument, naplněný údaji z 1C.

K tomu musíme připravit šablonu dokumentu Word. Nepleťte si to se šablonou aplikace Word, speciální soubory Word, které obsahují nastavení dokumentu pro více použití. Potřebujeme běžný dokument aplikace Word s příponami *.docx nebo *.doc. A pak umístěte tento dokument do rozložení s binárními daty.

Pokus //Získání rozložení z binárních dat Template = GetLayout(AdditionalParameters.ContractType); FileName = GetTemporaryFileName(".docx"); Template.Write(NázevSouboru); //Vytvoření objektu COM pro práci s Wordem ObjectWord = New COMObject("Word.Application"); ObjectWord.Documents.add(NázevSouboru); // Ve Wordu můžete otevřít více dokumentů v jedné aplikaci, takže objekt Word.Application.Documents je kolekce otevřené dokumenty. //V našem případě je dokument vždy otevřený jeden DocumentWord = ObjectWord.Application.Documents(1); DocumentWord.Activate(); Zpráva o výjimce("Chyba při spuštění aplikace "+ErrorDescription()); Konec pokusu; //Samozřejmě je třeba pokusit se získat objekt COM. Člověk nikdy neví, něco se pokazí.

Čtenář si může správně všimnout, že se používá modální volání, a zamávat prstem na autora. A bude mít pravdu.

//Vytvoření struktury parametrů dokumentu DocumentParameters = PrepareParameterStructure(); //Vyplňte strukturu parametrů dokumentu Fill inParameterStructure(DocumentParameters);

Pojďme se trochu ponořit do principů fungování Wordu...

Každý dokument aplikace Word je rozdělen do sekcí, které se skládají ze stránek.

Pro každou sekci je možné vytvořit vlastní číslování prvků, unikátní záhlaví a zápatí a nastavení stránky. Chcete-li tedy například otočit jednu ze stránek (tisknout na šířku), musíte pro ni vytvořit samostatnou sekci.

Každý slovní stránka rozdělena do několika oblastí:

  • Záhlaví stránky
  • Hlavní text
  • zápatí

Je třeba poznamenat, že každá sekce může mít jedinečné záhlaví pro první stránku.

//Objekt, obsahuje veškerý hlavní text ze všech sekcí DocumentWord.Content //Objekt obsahuje kolekci sekcí dokumentu DocumentWord.Sections //Každá sekce má svou vlastní kolekci pro záhlaví DocumentWord.Sections(1). Záhlaví //A vlastní kolekce pro zápatí DocumentWord.Sections(1).Zápatí //Zároveň, pokud je zaškrtnuto políčko „Unikátní záhlaví a zápatí pro první stránku“, budou kolekce Záhlaví a zápatí obsahovat dva prvky

Vyplnění uživatelských parametrů

Při přístupu k těmto kolekcím je můžeme prohledávat a získat vestavěné objekty, jako jsou tabulky.

Nyní jsme víceméně pochopili, jak přistupovat k oblastem Wordu, můžeme si s nimi pohrát a nahradit naše parametry:

//Projdeme si všechny parametry a nahradíme je v dokumentu For each Parameter From DocumentParameters Loop PerformReplace(DocumentWord.Content, Parameter.Key, Parameter.Value); //Hledání výskytů parametru v hlavičce PerformReplace(DocumentWord.Sections(1).Headers.Item(1).Range(), Parameter.Key, Parameter.Value); //Hledání výskytů parametru v zápatí první a následujících stránek 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; //Spustit funkci najít a nahradit ExecuteReplace(Objekt hodnoty, Parametr, Hodnota) Object.Find.Execute(Parameter,,Value,2) EndFunction

Zvažte metodu Execute podrobněji. Jeho parametry jsou shodné s dialogovým oknem při nahrazování/hledání přímo z MS Word:

A zde jsou hlavní parametry (volný překlad nápovědy MSDN):

  1. Vyhledat text - Řetězec - Text k nahrazení. Text může obsahovat speciální možnosti. Například ^p - odstavec, ^t - tab
  2. Rozlišování malých a velkých písmen – Boolean – Pokud je true, vyhledávání bude rozlišovat malá a velká písmena
  3. Celá slova - Boolean - Pokud je pravda, vyhledává celá slova. Na výskyty slov se nepřihlíží. Například při hledání slova domov bude slovo domov vynecháno.
  4. Použít zástupné znaky – Boolean – Pokud má hodnotu true, použijí se vestavěné regulární výrazy.
  5. Hledat podobné - Boolean - Pokud je pravda, výsledek hledání bude obsahovat podobná slova
  6. Hledat ve všech formách - Boolean - Je-li true, bude výsledek hledání obsahovat různé formy slov.
  7. Hledat nejprve - Boolean - Pokud je true, bude prohledán od začátku do konce dokumentu
  8. Pokrytí - WdFindWrap - Určuje směr hledání
  9. Format - Format - Formát hledaného textu
  10. Replacement string - String - Řetězec, kterým se má nahradit původní text
  11. Počet výměn - WdReplace - Určuje, kolikrát vyměnit
  12. atd.

WdReplace - Konstantní hodnota:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

Tato metoda neumožňuje získat "Replacement string" jako výběr, ale funguje asi 10x pomaleji. Chcete-li získat vybranou oblast, můžete použít mírně upravenou typickou funkci:

//PrintControlMSWordClient s drobnými změnami pro konfiguraci SCP 1.3 Funkce PerformReplace(Objekt hodnoty, Parametr, Hodnota) SearchString = "[" + Parametr + "]"; StringReplacement = String(Value); //Je nutné vybrat oblasti, ve kterých nahrazujeme Object.Select(); //Získání vybrané oblasti Selection = Object.Application.Selection; //Najde všechny výskyty parametru a nahradí ho hodnotou, kterou potřebujeme FindObject = Selection.Find; FindObject.ClearFormatting(); While FindObject.Execute(SearchString) Loop If EmptyString(ReplacementString) Then Selection.Delete(); Else Selection.TypeText(ReplacementString); EndIf; EndCycle; //Zrušení výběru Selection.Collapse(); EndFunctions

Po obdržení vybrané oblasti můžete upravit styl textu, písmo atd.

//Úprava písma Selection.Font //Úprava barvy Selection.HighlightColorIndex

Existuje také druhý přístup, který používá objekt Word jako pole. Nemám ho moc ráda, protože. ve velkých dokumentech, asi 100 stran, tato pole začnou selhávat (zmizet, nenahrazovat požadované hodnoty) a další nesmysly. Tedy alespoň ve Wordu 2007. Ale i tak to dám:

Při přípravě šablony je nutné do těla dokumentu vložit pole s typem DOCVARIABLE (vložit je můžete pomocí horkých kláves Ctrl+F9).

K těmto polím lze přistupovat následujícím jednoduchým způsobem:

DocumentWord.Variables.Item(Název parametru).Hodnoty

Plnění tabulek podle šablony

Vyplnili jsme tedy parametry v hlavním textu dokumentu, nahradili parametry v záhlaví a zápatí, ale stále máme jeden průšvih - potřebujeme vyplnit tabulku.

Níže popsaný přístup je vhodný pouze pro tabulky se známým formátem. Tito. tabulku a její řádky můžeme naformátovat libovolným způsobem. Pak je ale změna dost problematická.

K tabulkám lze přistupovat prostřednictvím oblastí dokumentů.

//Získejte přístup k první tabulce v hlavním textu Table = DocumentWord.Content.Tables(1)

Pro nastavení formátování je jednodušší vytvořit v šabloně tabulku s prázdným prvním řádkem, který později smažeme.

//Data k vyplnění ParametryPM = DocumentParameters.ApplicationPM; //Je třeba ponechat záhlaví a první řádek nedotčené Iterator = 2; Tabulka = DocumentWord.Content.Tables(3); For Each Row From ParametersTCH Loop //Ve výchozím nastavení přidá řádek nad první Table.Rows.Add(); Vyplňte řádek tabulky (tabulka, iterátor, řetězec, "PP, název nomenklatury, měrná jednotka, řádek ceny", parametry PM); Iterátor = Iterátor + 1; EndCycle; //Struktura šablon obsahuje názvy sloupců a jejich pořadí Procedure FillTableRow(Table,RowNumber,FillValue,TemplateStructure,ValueTable) StringArray = General Purpose.ExpandStringIntoSubstringArray(TemplateStructure,","); iterátor = 1; Pro každý řetězec z pole řetězců smyčka If ValueTable.Columns.Find(String) = Nedefinováno AND String<>"PP" Potom Iterátor = Iterátor + 1; Pokračovat; //Nezapomeňte, že Header je také řetězec a při číslování jej musíme vyloučit ElseIf String = "PP" Then Table.Cell(LineNumber, Iterator).Range().Text = String(LineNumber-1) ; Iterátor = Iterátor + 1; Pokračovat; EndIf; Table.Cell(RowNumber, Iterator).Range().Text = String(FillValue[String]); Iterátor = Iterátor + 1; EndCycle; EndProcedure

To je v podstatě vše. Snažil jsem se upozornit na hlavní problémy, které při práci s Wordem vznikají. Doufám, že vám tato recenze pomůže ve vaší práci =)

Děkuji za rady a komentáře:
,

Kritika je jedině vítána. Čím více komentářů, tím lepší bude návod =)

V práci programátora 1C je tato funkce vyžadována velmi zřídka, i když díky ní můžete docela vyřešit náročné úkoly s dynamickými a nestálými tiskovými formami. Při implementaci tohoto úkolu je práce na vytváření šablon aplikace Word a umístění záložek do šablony aplikace Word přiřazena uživatelům 1C.

V tento příklad bude ukázáno, jak pomocí mechanismů 1C a dokumentu Word jako šablony můžete vytvořit tisknutelný formulář pro výstup dat uživatelům programu 1C.

Vytvořme šablonu založenou na dokumentu aplikace Word pro 1C. Nejprve musíte povolit záložky pro více pohodlné ovládání s dokumentem:


Dále musíte do souboru šablony pro 1C přidat text a několik záložek. Záložka se přidává přes menu "Vložit" - "Záložka". Musíte vybrat text záložky, zkopírovat jej, otevřít nabídku „Vložit – záložka“, vložit zkopírovaný text záložky a kliknout na „Přidat“:


Když je soubor šablony aplikace Word připraven, vytvoříme nové externí zpracování v 1C, přidáme formulář a do modulu formuláře vložíme následující kód: &Na proceduře klienta Při otevření (odmítnutí) Vyplnit šablonu Wordu (); EndProcedure &Funkce AtClient FillTemplateWord() //Pokus o vytvoření COM objekt AttemptWordObject = Nový COMObject("Word.Application"); Zpráva o výjimce („Chyba při spouštění Microsoft Word: " + ErrorDescription(), MessageStatus.Attention); Return Undefined; EndTry; //Cesta k šabloně WordObject.Documents.Add("C:\Users\Konstantin\Desktop\Template.docx"); WordTemplate = WordObject.ActiveDocument ; //Získat všechny záložky ze šablony Pro každý BookmarkWord From TemplateWord.Bookmarks Loop Report(BookmarkWord.Name); EndCycle; //Nahraďte záložku1 textem TemplateWord.Bookmarks("Bookmark1").Select(); TemplateWord.Application.Selection .TypeText ("Text pro záložku #1."); //Nahraďte záložku2 textem TemplateWord.Bookmarks("Záložka2").Select(); TemplateWord.Application.Selection.TypeText("Text pro záložku #2."); // Změnit záložku 3 na dnešní datum TemplateWord.Bookmarks("Záložka3").Select(); TemplateWord.Application.Selection.TypeText(CurrentDate()); ObjectWord.Application.Visible = True; ObjectWord.Activate(); //Zavření dokumentu //Word object.Application.Quit(); EndFunctions

V důsledku spuštění externího zpracování 1C k vytvoření tištěného formuláře na základě šablony ve formě souboru Word získáme následující výsledek:

Informace o metodách COM objektu Word, stejně jako další data, lze nalézt na MSDN.

Dodatek k poznámce Použití šablon Wordu v 1C

Vyjadřuji poděkování všem, kteří se k rekordu vyjadřují, díky vám je materiál doplněn o nová data a bude užitečný širšímu okruhu návštěvníků.

1. A jak změnit velikost písma ve vloženém textu?
V šabloně stačí změnit velikost písma záložky. Pokud však potřebujete dynamicky změnit dimenzi, pak:

//Nahraďte záložku3 aktuálním datem TemplateWord.Bookmarks("Bookmark3").Select(); TemplateWord.Application.Selection.Font.Tučné = 1; TemplateWord.Application.Selection.Font.Size = 20; TemplateWord.Application.Selection.TypeText(CurrentDate());

2. Je možné nahrát obrázky do šablony?
Jistě. Příklady pro C# a VB jsou popsány na odkazu: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx a pro 1C bude kód následující:

// Vložení obrázku TemplateWord.Bookmarks("Bookmark3").Select(); TemplateWord.Application.Selection.InlineShapes.AddPicture("C:\Users\Konstantin\Desktop\logo_1c.png");

3. Při provádění kódu: ObjectWord.Documents.Add("C:/Template.docx") (kam jsem umístil váš dokument) se zobrazí chyba: "Chyba při volání kontextové metody (přidat)" Jaký by mohl být důvod?
Možná zkuste změnit cestu na: "C:\Template.docx".

4. Řekněte mi prosím, proč při ukládání rozložení aktivního typu dokumentu do souboru word s kódem:

ProcessingObject = FormAttributeToValue("Object"); Layout = ProcessingObject.GetLayout("Zpožděná šablona dopisu"); FileName = TempFileDirectory() + "\"file.doc";Layout.Write(FileName);

Dostanu místo normálního dokumentu, jako je tento http://prntscr.com/eshgjk
Předpokládám, že metoda Write(,) standardně zapisuje soubor ve formátu MXL. Zkuste nastavit hodnotu jako druhý parametr: SpreadsheetDocumentFileType.DOCX, podrobněji popsáno v "Pomocníkovi syntaxe".

5. Mám v dokumentu odkazy na soubory umístěné na síťový disk. Jak vytvořit hypertextový odkaz na tyto soubory v šabloně?
Zajímavá otázka, pokud se pokusíte nahrát makro a uvidíte výsledek, pak v Visual Basic přidání hypertextového odkazu by vypadalo takto:

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

Přidejte popis metody na MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word

V souladu s tím je kód pro 1C následující:

Funkce FillTemplateWord() //Pokus o vytvoření objektu COM Attempt WordObject = New COMObject("Word.Application"); Výjimka Report("Chyba při spuštění aplikace Microsoft Word: " + ErrorDescription(), MessageStatus.Attention); Návrat Nedefinováno; Konec pokusu; //Cesta k šabloně ObjectWord.Documents.Add("C:\Users\k.blagin\Desktop\Template.docx"); TemplateWord = ObjectWord.ActiveDocument; //Získat všechny odkazy ze šablony Pro každý BookmarkWord From TemplateWord.Hyperlinks Notify Loop(BookmarkWord.Name); EndCycle; //Změna adresy existujícího odkazu TemplateWord.Hyperlinks("Logs.zip").Address = "C:\Users\k.blagin\Desktop\Memory.zip"; //Nahraďte záložku odkazem 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(); //Zavření dokumentu //Word object.Application.Quit(); EndFunctions

Velmi užitečné externí zpracování pro všechny typické konfigurace 1C:Enterprise 8.3 umožňuje vygenerovat soubor Wordu podle zvolené šablony z adresářů a dokumentů systému. S jeho pomocí můžete tisknout různé specifikace, pracovní smlouvy a smlouvy s dodavateli, záruční listy a tak dále od 1C. Máte-li po ruce Word požadované struktury a mírně jej upravíte, budete jej moci vytvořit přímo od 1s s vyplněním všech potřebných parametrů.

Princip zpracování je následující:

  • vyberte Word požadované struktury,
  • na těch místech souboru, kam potřebujete vložit informace z 1C, vytvoříme záložky,
  • po přípravě šablony ji přidejte do 1C (adresář Files),
  • nakonfigurujte plnění tiskové šablony v 1C,
  • vytiskneme potřebné dokumenty / adresáře výběrem vytvořené šablony.

Příprava šablony aplikace Word

Pro ukázku práce zpracování nastavíme tisk specifikace zakázky z dokumentu Prodej zboží a služeb. Řekněme, že máme slovo jako toto:

Z něj sestavíme plnohodnotnou specifikaci. Začneme vložením záložek na místa, kde je potřeba nahradit informace z databáze:



V názvech záložek nelze použít mezery.

Při tisku vyplníme i tabulku zboží. Aby to vypadalo hezky, nechte záhlaví a jeden prázdný řádek:


Uložit Word, zavřít.

Nastavení výplně šablony

Nyní v programu otevřeme časopis prodejních dokladů, přejdeme do nabídky tisku a stisknutím tlačítka nastavíme tisk podle šablony Word:


Přizpůsobení šablony je dostupné pouze uživatelům s plnými právy.

V okně nastavení, které se otevře, nejprve vytvořte nový soubor v programu (myšleno referenční prvek Soubory) a svázat s ním naše Slovo:


V okně, které se otevře, vyberte pro přidání souboru:


Poté jej vyberte v nastavení šablony. Poté je tabulka záložek vyplněna, musíme vybrat zdroje pro vyplnění údajů v těchto záložkách:


Jako zdroj se používají podrobnosti samotného prodejního dokladu, jakož i odvozeniny z těchto podrobností:

Při tisku můžete využít i další podrobnosti o adresářích a dokumentech.

Seznam dostupných podrobností je velmi rozsáhlý, je vhodné použít rychlé zadání:


V důsledku výběru zdroje bude tabulka vypadat takto:


Pro hodnotu do řádků tabulky je k dispozici skloňování velkých a malých písmen a také zkratka celého jména:


Chcete-li vytisknout tabulku ve Wordu, vyberte tabulku původního dokumentu:


Po výběru tabulky se zobrazí nápověda s názvy těch podrobností, které lze použít k zobrazení tabulky ve Wordu. Zbývá nám vypsat potřebné údaje oddělené čárkami (v pořadí sloupců souboru). Ve sloupci je povoleno ponechat prázdnou hodnotu nebo tam napsat libovolný text:


Vše je v pořádku, nyní můžeme vytisknout požadovaný Word.

Tisk podle předlohy na míru je nyní dostupný všem, tzn. uživatelé nemusí každý nastavovat tisk samostatně.



Můžeme vytisknout jak jeden dokument, tak seznam:


Ve formuláři nastavení tisku můžete kromě vytváření nových šablon upravovat stávající:


V případě, že je pro objekt nakonfigurováno několik šablon aplikace Word, po výběru příkazu tisku se otevře okno s výběrem požadované:


Aby nedocházelo ke konfliktům s přístupovými právy uživatele k adresáři Soubory je potřeba nainstalovat kromě samotného zpracování tisku ve Wordu také rozšíření pro 1C (nachází se ve stejném archivu se zpracováním), které uživatelům poskytne přístup ke čtení referenční knihy.

Pokud budete mít nějaké dotazy / připomínky / návrhy k tomuto zpracování, rád odpovím.

Vydání 1.1.2.2 ze dne 15.12.2018

Pro zobrazení data při tisku šablony přibyla možnost výběru formátu, v tabulkové části lze nově kromě číselníku zadat i artikl a měrnou jednotku:


Nyní můžete odstranit nepotřebné šablony:


Vydání 1.1.2.3 ze dne 29.01.2019

Nyní můžete zobrazit části data samostatně - den, měsíc (číslo nebo jméno) a rok:


Pro Jednotlivci(a dodavatelé s typem jednotlivce) nyní můžete zobrazit údaje z pasu:


Vydání 1.1.2.4 ze dne 03.12.2019

Při tisku tabulkové části dokladů o pohybu zboží ve Wordu bylo možné použít nejen podrobnosti této tabulkové části, ale také jakékoli podrobnosti o nomenklatuře:


Vydání 1.1.2.5 ze dne 07.12.2019

Bylo možné nejen vygenerovat šablonu aplikace Word, ale také ji automaticky připojit ke zdrojovému objektu (k připojeným souborům). Chcete-li to provést, vyberte možnost nastavení Uložit do přiložených souborů.


Na konci procesu tisku se otevře přiložený souborový formulář.


Z tohoto formuláře můžete v případě potřeby otevřít hotovou šablonu aplikace Word pro prohlížení / úpravu.

Tento článek je pokusem shromáždit informace o díle (na vstupní úroveň) s MS Word na jednom místě. Podobných materiálů je spousta a při patřičné vytrvalosti se to všechno dá najít. Chtěl jsem nasbírat hlavní body na jednom místě.

Publikace je druh poznámky obsahující příklady kódu pro:

  1. naplnění šablony Word daty z 1C;
  2. vyplnění záhlaví a zápatí aplikace Word daty z 1C;
  3. vyplnění tabulky ve Wordu daty z 1C;
Začátek práce

Ve většině případů stojíme před následujícím úkolem:
Musíte otevřít dokument aplikace Word naplněný daty z 1C.

K tomu musíme připravit šablonu dokumentu Word. Nezaměňujte to se šablonou aplikace Word, speciálními soubory aplikace Word, které obsahují nastavení dokumentu pro opětovné použití. Potřebujeme běžný dokument aplikace Word s příponami *.docx nebo *.doc. A pak umístěte tento dokument do rozložení s binárními daty.

Pokus
//Získání rozložení z binárních dat
Template = GetLayout(AdditionalParameters.ContractType);
FileName = GetTemporaryFileName(".docx");
Template.Write(NázevSouboru);
//Vytvořte objekt COM pro práci s aplikací Word
WordObject = Nový COMObject("Word.Application");
ObjectWord.Documents.add(NázevSouboru);
//Word může mít otevřeno více dokumentů ve stejné aplikaci, takže objekt Word.Application.Documents je kolekce otevřených dokumentů.
//V našem případě je dokument vždy otevřen samostatně
DocumentWord = ObjectWord.Application.Documents(1);
DocumentWord.Activate();
Zpráva o výjimce("Chyba při spuštění aplikace "+ErrorDescription());
Konec pokusu;
//Samozřejmě je třeba pokusit se získat objekt COM. Člověk nikdy neví, něco se pokazí.

Čtenář si může správně všimnout, že se používá modální volání, a zamávat prstem na autora. A bude mít pravdu.

//Vytvořte strukturu parametrů dokumentu
DocumentParameters = PrepareParameterStructure();
//Vyplňte strukturu parametrů dokumentu
Fill inStructureParameters(DocumentParameters);

Pojďme se trochu ponořit do principů fungování Wordu...

Každý dokument aplikace Word je rozdělen do sekcí, které se skládají ze stránek.

Pro každou sekci je možné vytvořit vlastní číslování prvků, unikátní záhlaví a zápatí a nastavení stránky. Chcete-li tedy například otočit jednu ze stránek (tisknout na šířku), musíte pro ni vytvořit samostatnou sekci.

Každá stránka aplikace Word je rozdělena do několika oblastí:

  • Záhlaví stránky
  • Hlavní text
  • zápatí
Je třeba poznamenat, že každá sekce může mít jedinečné záhlaví pro první stránku.

//Objekt, obsahuje veškerý hlavní text ze všech sekcí DocumentWord.Content
//Objekt obsahuje kolekci sekcí dokumentu
DocumentWord.Sections
// Každá sekce má svou vlastní kolekci záhlaví
DocumentWord.Sections(1).Headers
//A vlastní kolekce pro patičky
DocumentWord.Sections(1).Zápatí
//Zároveň, pokud je zaškrtnuto políčko "Unikátní záhlaví pro první stránku", budou kolekce Headers a Footers obsahovat dva prvky

Vyplnění uživatelských parametrů

Při přístupu k těmto kolekcím je můžeme prohledávat a získat vestavěné objekty, jako jsou tabulky.

Nyní jsme víceméně pochopili, jak přistupovat k oblastem Wordu, můžeme si s nimi pohrát a nahradit naše parametry:

//Projděte všechny parametry a nahraďte je v dokumentu
Pro každý parametr ze smyčky DocumentParameters
ExecuteReplace(DocumentWord.Content, Parameter.Key, Parameter.Value);
//Hledání výskytů parametru v záhlaví
ExecuteReplace(DocumentWord.Sections(1).Headers.Item(1).Range(), Parameter.Key, Parameter.Value);
//Vyhledejte výskyty parametrů v zápatí první a následujících stránek
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;

//Provedení funkce najít a nahradit
PerformReplace(Objekt hodnoty, Parametr, Hodnota)
Object.Find.Execute(Parametr,,Hodnota,2)
EndFunctions

Zvažte metodu Execute podrobněji. Jeho parametry jsou shodné s dialogovým oknem při nahrazování/hledání přímo z MS Word:

(36,38 kilobajtů) Počet stažení: 5

A zde jsou hlavní parametry (volný překlad nápovědy MSDN):

  1. Vyhledat text - Řetězec - Text k nahrazení. Text může obsahovat speciální parametry. Například ^p - odstavec, ^t - tab
  2. Rozlišování malých a velkých písmen – Boolean – Pokud je true, vyhledávání bude rozlišovat malá a velká písmena
  3. Celá slova - Boolean - Pokud je pravda, vyhledává celá slova. Na výskyty slov se nepřihlíží. Například při hledání slova domov bude slovo domov vynecháno.
  4. Použít zástupné znaky – Boolean – Pokud má hodnotu true, použijí se vestavěné regulární výrazy.
  5. Hledat podobné - Boolean - Pokud je pravda, výsledek hledání bude obsahovat podobná slova
  6. Hledat ve všech formách - Boolean - Je-li true, bude výsledek hledání obsahovat různé formy slov.
  7. Hledat nejprve - Boolean - Pokud je true, bude prohledán od začátku do konce dokumentu
  8. Pokrytí - WdFindWrap - Určuje směr hledání
  9. Format - Format - Formát hledaného textu
  10. Replacement string - String - Řetězec, kterým se má nahradit původní text
  11. Počet výměn - WdReplace - Určuje, kolikrát vyměnit
  12. atd.
WdReplace - Konstantní hodnota:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

Tato metoda neumožňuje získat "Replacement string" jako výběr, ale funguje asi 10x pomaleji. Chcete-li získat vybranou oblast, můžete použít mírně upravenou typickou funkci:

//ManagePrintMSWordClient s drobnými změnami pro konfiguraci SCP 1.3
Funkce PerformReplace(Objekt hodnoty, Parametr, Hodnota)
SearchString = "[" + Parametr + "]";
StringReplacement = String(Value);
// Je nutné vybrat oblasti, ve kterých nahrazujeme
Object.Select();
//Získejte vybranou oblast
Selection = Object.Application.Selection;
//Najděte všechny výskyty parametru a nahraďte jej hodnotou, kterou potřebujeme
FindObject = Selection.Find;
FindObject.ClearFormatting();
Zatímco FindObject.Execute(SearchString) smyčka
If EmptyString(ReplacementString) Then
Selection.Delete();
v opačném případě
Selection.TypeText(SubstitutionString);
EndIf;
EndCycle;
// Zrušte výběr
Selection.Collapse();
EndFunctions

Po obdržení vybrané oblasti můžete upravit styl textu, písmo atd.

//Úprava písma
Selection.Font
//Upravit barvu
Selection.HighlightColorIndex

Existuje také druhý přístup, který používá objekt Word jako pole. Nemám ho moc ráda, protože. ve velkých dokumentech, cca 100 stran, začnou tato pole selhávat (mizet, nenahrazovat požadované hodnoty) a další nesmysly. Tedy alespoň ve Wordu 2007. Ale i tak to dám:

Při přípravě šablony je nutné do těla dokumentu vložit pole s typem DOCVARIABLE (vložit je můžete pomocí horkých kláves Ctrl+F9).

K těmto polím lze přistupovat následujícím jednoduchým způsobem:

DocumentWord.Variables.Item(Název parametru).Hodnoty

Plnění tabulek podle šablony

Vyplnili jsme tedy parametry v hlavním textu dokumentu, nahradili parametry v záhlaví a zápatí, ale stále máme jeden průšvih - potřebujeme vyplnit tabulku.

Níže popsaný přístup je vhodný pouze pro tabulky se známým formátem. Tito. tabulku a její řádky můžeme naformátovat libovolným způsobem. Pak je ale změna dost problematická.

K tabulkám lze přistupovat prostřednictvím oblastí dokumentů.

//Získejte přístup k první tabulce v hlavním textu
Tabulka = DocumentWord.Content.Tables(1)

Pro nastavení formátování je jednodušší vytvořit v šabloně tabulku s prázdným prvním řádkem, který později smažeme.

//Údaje k vyplnění
Parametry PM = ParametersDocument.Application PM;
//Je třeba ponechat záhlaví a první řádek nedotčené Iterator = 2;
Tabulka = DocumentWord.Content.Tables(3);
Pro každý řádek z parametrů PM smyčka
//Ve výchozím nastavení přidá řádek nad první řádek
Table.Rows.Add();
Vyplňte řádek tabulky (tabulka, iterátor, řetězec, "PP, název nomenklatury, měrná jednotka, řádek ceny", parametry PM);
Iterátor = Iterátor + 1;
EndCycle;
//Struktura šablony obsahuje názvy sloupců a jejich pořadí
Postup FillTableRow(Tabulka,Číslo řádku,FillValue,TemplateStructure,ValueTable)
StringArray = General Purpose.ExpandStringIntoSubstringArray(TemplateStructure,",");
iterátor = 1;
Pro Každý řetězec Z Pole Strun Smyčka
If ValueTable.Columns.Find(String) = Undefined AND String "PP" Then
Iterátor = Iterátor + 1;
Pokračovat;
// Nezapomeňte, že záhlaví je také řetězec a při číslování ho musíme vyloučit
ElseIf String = "PP" Potom
Table.Cell(RowNumber, Iterator).Range().Text = String(RowNumber-1);
Iterátor = Iterátor + 1;
Pokračovat;
EndIf;
Table.Cell(RowNumber, Iterator).Range().Text = String(FillValue[String]);
Iterátor = Iterátor + 1;
EndCycle;
EndProcedure

To je v podstatě vše. Snažil jsem se upozornit na hlavní problémy, které při práci s Wordem vznikají. Doufám, že vám tato recenze pomůže ve vaší práci =)

[pro zobrazení odkazu se musíte zaregistrovat]