در حال حاضر، پروردگار ترس و من روی یک پروژه جالب کار می کنیم - ما در حال توسعه راه حلی بر اساس پلت فرم 1C: Enterprise 8.2 برای یک شرکت بزرگ هستیم. برای مجموعه وظایف، قابلیت های 1C بیش از اندازه کافی است و ما به هیچ وجه از انتخاب خود پشیمان نیستیم. در واقع، آنچه در ادامه می‌آید درباره پلتفرم بزرگ و قدرتمند 1C:Enterprise نیست.

یکی از توابع کلیدیبرنامه ما - تولید فرم های چاپی اسناد قانونی مختلف (پروتکل ها، اطلاعیه ها و غیره). از جنبه فنی، همه چیز ساده به نظر می رسد - شما یک طرح بندی استاندارد مانند یک سند صفحه گسترده ایجاد می کنید و طرح آن را شروع می کنید. ما وقت گذاشتیم و به سرعت همه موارد قابل چاپ را کنار هم گذاشتیم. خوب شد، اما بعد مشتری خواستار بازسازی طرح شد و در نهایت به آشفتگی رسیدیم. مشکل ناتوانی در اعمال سبک های قالب بندی برای کلمات خاص در همان سلول بود. بله، شما می توانید یک استایل را برای کل سلول اعمال کنید، اما این روش برای ما مناسب نبود، زیرا ... ممکن است چندین کلمه در یک سلول وجود داشته باشد، اما فقط یکی از آنها باید به طور خاص برجسته شود.

در اصل، این مشکل را می توان با کاهش اندازه سلول های سند صفحه گسترده حل کرد. در موارد خاص، کار با چنین سلول‌هایی (کوچک) آسان‌تر است، اما تغییر بیش از حد چنین نشانه‌هایی نیز کافی نیست. حداقل برای من.

ما در مورد آن فکر کردیم و تصمیم گرفتیم که طرح‌بندی‌های معمولی از نوع «Spreadsheet Document» را کنار بگذاریم و از قابلیت‌های MS Word استفاده کنیم. ایده چیزی شبیه به این بود:

1. برای اسناد لازم الگویی ایجاد کنید. تمام فایل های قالب دقیقاً به عنوان الگو برای MS Word ایجاد شده اند. برای کسانی که نمی دانند، قالب ها فایل هایی با پسوند نقطه هستند. بر اساس آنها می توانید اسناد جدیدی ایجاد کنید.

2. با استفاده از فناوری OLE، اسناد ایجاد کنید و متغیرهای شبه را جایگزین کنید متن مورد نیاز. متغیرهای شبه به صورت زیر قالب بندی شدند: [VariableName].

3. بسته به موقعیت، سند تولید شده را چاپ یا ذخیره کنید.

در اصل، هیچ مشکلی وجود ندارد، اما تا به امروز هیچ کدام از ما مجبور نبودیم از 1C: Enterprise با MS Word کار کنیم. اساساً، تمام طرح‌بندی‌های فرم چاپی که من ایجاد کردم بر اساس آنها بود اسناد صفحه گستردهبنابراین من هیچ تجربه ای در انتقال داده از یک پلتفرم، مثلاً MS Word/Excel نداشتم. مجبور بودم اغلب داده‌ها را از اکسل بخوانم، اما هرگز آن‌ها را انتقال نمی‌دادم.

بعد از اجرای چند قطعه با گیتار، تصمیم گرفتیم ساز طولانی مدت را کنار بگذاریم و دست به کار شویم. پس از کمی تفکر و خواندن راهنما، مثال زیر را ترسیم کردیم:

//یک شی جدید از نوع Word.Application ایجاد کنید WordApplication = New COMObject("WORD.Application"); //یک سند جدید بر اساس الگو ایجاد کنید //در متغیر PathKTemplate مسیر کامل الگو را نشان می دهیم //ما ایجاد کردیم (فایل با پسوند نقطه) NewDocument = WordApplication .Documents.Add(PathKTemplate); //آماده شدن برای جستجوی Content Replacement = NewDocument.content.Find; //تست را جایگزین کنید //در پارامتر اول متد Execute رشته ای را که باید جایگزین شود عبور می دهیم //در نهم - رشته ای که جایگزین می شود //i.e. در WhatWeReplace، نام متغیر (به عنوان مثال، [UserName]) را ارسال می کنیم // و در آخر - مقدار آن ReplaceContent.Execute(WhatWeReplace,False,True,False,True,False,String(WhatWeReplace)); //سپس همه چیز به خواسته ما بستگی دارد //ذخیره سند NewDocument.SaveAs(PathToSave); //چاپ سند NewDocument.PrintOut(); //پس از اتمام، باید سند و خود Winword را ببندید. این کار به این صورت انجام می شود //برای متد Quit مقدار False را پاس می کنم. این بدان معنی است که ما نیازی به ذخیره سند تکمیل شده نداریم. WordApplication.application.Quit(False); WordApplication = 0;

نتایج کار

ما از گزینه استفاده از MS Word برای تولید فرم های چاپی زیبا کاملاً راضی بودیم. ما چند ساعت را صرف نوشتن رویه‌های wrapper کردیم و همچنین فرم‌های ایجاد شده قبلی را در قالب‌های MS Word دوباره کار کردیم. ما بیشتر از نتیجه راضی بودیم. همه چیز به سرعت کار می کند و مشتری ما می تواند به طور مستقل الگوهای اسناد خروجی را بدون هیچ مشکلی تغییر دهد. در صورت اشتباه (خوب اگر مشتری به طور تصادفی قالب های موجود را رها کند) امکان بازگردانی فایل های قالب اصلی را فراهم کرده ایم.

اگر تصمیم دارید از این روش در پروژه های خود استفاده کنید، بسیار مراقب باشید. استفاده از همه این موارد به یک کاربر MS Word در رایانه شما نیاز دارد. با توجه به اینکه امروزه بسیاری از شرکت ها به سمت برنامه وحشتناک OpenOffice (IMHO) سوئیچ می کنند این روشممکن است مشکلاتی ایجاد کند. خوشبختانه در این زمینه خوش شانس هستیم.

انتشار - شماآریک برگه تقلب حاوی نمونه های کد برای:

1. پر کردن قالب وردداده ها از 1C؛
2. پر کردن سرصفحه ها و پاورقی های Word با داده های 1C.
3. پر کردن جدول در Word با داده های 1C.

شروع کار

در بیشتر موارد، ما با وظایف زیر روبرو هستیم:
نیاز به باز کردن سند ورد، پر شده با داده های 1C.

برای این کار باید یک قالب سند Word تهیه کنیم. این را با قالب Word اشتباه نگیرید، فایل های خاص Word، که حاوی تنظیمات سند برای استفاده مکرر است. ما به یک سند Word معمولی با پسوندهای *.docx یا *.doc نیاز داریم. و سپس این سند را در یک طرح با داده های باینری قرار دهید.

تلاش //دریافت طرح از داده های باینری Template = GetLayout(AdditionalParameters.ContractType); FileName = GetTemporaryFileName(.docx"); Template.Write(FileName); //یک شی COM برای کار با Word ایجاد کنید ObjectWord = New COMObject("Word.Application"); ObjectWord.Documents.add(FileName); //در Word، می توانید چندین سند را در یک برنامه باز کنید، بنابراین ObjectWord.Application.Documents یک مجموعه است. اسناد باز. //در مورد ما همیشه یک سند باز است DocumentWord = ObjectWord.Application.Documents(1); DocumentWord.Activate(); Exception Report ("خطا هنگام راه اندازی برنامه "+ErrorDescription()); EndAttempt; //البته، گرفتن شی COM باید در تلاش قرار گیرد. شما هرگز نمی دانید، چیزی اشتباه خواهد شد.

خواننده ممکن است به درستی اشاره کند که از یک تماس مودال استفاده می شود و انگشت خود را به سمت نویسنده تکان دهد. و حق با او خواهد بود.

//ایجاد ساختاری از پارامترهای سند DocumentParameters = PrepareParametersStructure(); //ساختار پارامترهای سند را پر کنید FillParametersStructure(DocumentParameters);

بیایید کمی عمیق تر به اصول Word بپردازیم ...

هر سند Word به بخش هایی تقسیم می شود که از صفحات تشکیل شده است.

برای هر بخش، امکان ایجاد شماره گذاری عناصر، سرصفحه ها و پاورقی های منحصر به فرد و تنظیمات پارامتر صفحه وجود دارد. بنابراین، برای مثال، برای چرخاندن یکی از صفحات (چاپ به صورت افقی)، باید یک بخش جداگانه برای آن ایجاد کنید.

هر یک صفحه وردبه چند حوزه تقسیم می شود:

  • هدر صفحه
  • متن اصلی
  • پاورقی

لازم به ذکر است که هر بخش می تواند یک سربرگ و پاورقی منحصر به فرد برای صفحه اول داشته باشد.

//شیئی که شامل تمام متن اصلی از تمام بخشهای DocumentWord.Content //شیء شامل مجموعه ای از بخشهای سند DocumentWord.Sections //هر بخش مجموعه خاص خود را برای سرصفحه ها دارد DocumentWord.Sections(1). Headers // و مجموعه خود را برای پاورقی سرصفحه ها و پاورقی ها DocumentWord.Sections(1).Footers //در این مورد، اگر چک باکس "سرصفحه و پاورقی منحصر به فرد برای صفحه اول" علامت زده شود، مجموعه Headers و Footers حاوی دو عنصر خواهد بود.

پر کردن پارامترهای سفارشی

وقتی به این مجموعه‌ها دسترسی پیدا می‌کنیم، می‌توانیم آنها را جستجو کرده و اشیاء داخلی مانند جداول را بازیابی کنیم.

اکنون ما کم و بیش می دانیم که چگونه به مناطق Word دسترسی پیدا کنیم، می توانیم با آنها کمانچه وارد کنیم و پارامترهای خود را جایگزین کنیم:

// بیایید تمام پارامترها را مرور کنیم و آنها را در سند جایگزین کنیم For every Parameter From Document Parameters Loop PerformReplacement(DocumentWord.Content, Parameter.Key, Parameter.Value); //به دنبال وقوع پارامتر در هدر PerformReplacement(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); چرخه پایان //انجام جستجو و جایگزینی تابع ExecuteReplace(مقدار شی، پارامتر، مقدار) Object.Find.Execute(Parameter,,Value,2) EndFunction

به متد Execute نگاه کنید. هنگام جایگزینی/جستجوی مستقیم از MS Word، پارامترهای آن با کادر محاوره ای یکسان است:

و در اینجا پارامترهای اصلی (ترجمه رایگان کمک MSDN):

  1. جستجوی متن - رشته - متن جایگزین. متن ممکن است حاوی پارامترهای خاص. به عنوان مثال، ^p - پاراگراف، ^t - تب
  2. حساسیت به حروف کوچک - بولی - اگر درست باشد، جستجو به حروف بزرگ و کوچک حساس خواهد بود
  3. کل کلمات - Boolean - اگر درست باشد، کل کلمات جستجو می شوند. تکرار کلمات محاسبه نمی شود. به عنوان مثال، هنگام جستجوی کلمه home، کلمه home از قلم می افتد
  4. از حروف عام استفاده کنید - Boolean - اگر درست است، از عبارات منظم داخلی استفاده کنید.
  5. جستجوی مشابه - Boolean - اگر درست باشد، نتیجه جستجو حاوی کلمات مشابه خواهد بود
  6. جستجوی همه فرم ها - Boolean - اگر درست باشد، نتیجه جستجو حاوی اشکال مختلفی از کلمات خواهد بود.
  7. ابتدا جستجو کنید - Boolean - اگر درست باشد، از ابتدا تا انتهای سند را جستجو می کند
  8. پوشش - WdFindWrap - جهت جستجو را مشخص می کند
  9. قالب - قالب متن جستجو
  10. رشته جایگزین - رشته - رشته ای که متن اصلی به آن جایگزین می شود
  11. تعداد تعویض - WdReplace - تعیین می کند که چند بار تعویض انجام شود
  12. و غیره.

WdReplace - مقدار ثابت:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

این روش به شما اجازه نمی دهد که "رشته جایگزین" را به عنوان یک منطقه انتخاب شده دریافت کنید، اما حدود 10 برابر کندتر است. برای به دست آوردن یک منطقه انتخاب شده، می توانید از یک عملکرد استاندارد کمی تنظیم شده استفاده کنید:

//Print ManagementMSWordClient با تغییرات جزئی برای پیکربندی SCP 1.3 تابع PerformReplacement(مقدار شی، پارامتر، مقدار) Search String = "[" + Parameter + "]"; StringReplacements = String(Value); //لازم است قسمت هایی را که در آنها جایگزین Object می کنیم برجسته کنیم.Select(); //دریافت ناحیه انتخاب شده Selection = Object.Application.Selection; //همه رخدادهای پارامتر را بیابید و آن را با مقداری که نیاز داریم جایگزین کنید FindObject = Selection.Find; FindObject.ClearFormatting(); در حالی که FindObject.Execute(SearchString) حلقه اگر EmptyString(ReplacementString) سپس Selection.Delete(); Else Selection.TypeText(ReplacementString); endIf; چرخه پایان //لغو انتخاب Selection.Collapse(); EndFunction

هنگامی که منطقه انتخاب شده را دارید، می توانید سبک متن، فونت و غیره را ویرایش کنید.

//ویرایش فونت Selection.Font //ویرایش رنگ Selection.HighlightColorIndex

روش دومی نیز وجود دارد که از یک شی Word به نام فیلدها استفاده می کند. من واقعا او را دوست ندارم، زیرا ... در اسناد بزرگ، حدود 100 صفحه، این فیلدها شروع به اشکال می کنند (ناپدید می شوند، جایگزین نمی شوند مقادیر مورد نیاز) و مزخرفات دیگر. خوب، حداقل در Word 2007. اما به هر حال آن را می دهم:

هنگام تهیه یک الگو، فیلدهایی با نوع DOCVARIABLE باید در بدنه سند درج شود (با استفاده از کلیدهای داغ Ctrl+F9 می توان آن را درج کرد).

به روش ساده زیر می توانید به چنین فیلدهایی دسترسی پیدا کنید:

Word Document.Variables.Item(ParameterName).Values

پر کردن جداول با استفاده از الگو

بنابراین، ما پارامترها را در متن اصلی سند پر کرده ایم، پارامترها را در سرصفحه ها و پاورقی ها جایگزین کرده ایم، اما هنوز یک مشکل داریم - باید جدول را پر کنیم.

رویکرد توضیح داده شده در زیر فقط برای جداول با قالب شناخته شده مناسب است. آن ها می توانیم جدول و سطرهای آن را در ابتدا به هر شکلی که می خواهیم قالب بندی کنیم. اما پس از آن تغییر بسیار مشکل ساز است.

جداول از طریق مناطق سند قابل دسترسی است.

//دسترسی به اولین جدول در متن اصلی Table = DocumentWord.Content.Tables(1)

برای تنظیم قالب بندی، ساده تر است که یک جدول در قالب با یک ردیف اول خالی ایجاد کنید که متعاقباً آن را حذف می کنیم.

//داده‌هایی که باید در PM پر شوند Parameters = Document Parameters.PM Application; //باید هدر و خط اول را دست نخورده بگذاریم Iterator = 2; جدول = DocumentWord.Content.Tables(3); برای هر سطر از چرخه پارامترهای PM // به طور پیش فرض یک ردیف بالای اولین Table اضافه می کند.Rows.Add(); ردیف جدول را پر کنید (جدول، تکرار کننده، ردیف، PP، نام نامگذاری، واحد اندازه گیری، رشته قیمت، پارامترهای پی ام). تکرار کننده = تکرار کننده + 1; چرخه پایان //ساختار الگو شامل نام ستون ها و ترتیب آنهاست. روش FillTableRow(Table, RowNumber, FillValue, TemplateStructure,ValueTable) Row Array = General Purpose. گسترش RowIntoSubstringArray(TemplateStructure,"); تکرار کننده = 1; برای هر ردیف از آرایه رشته‌ها حلقه اگر ValueTable.Columns.Find(String) = Undefined AND String<>"PP" سپس Iterator = Iterator + 1; ادامه هید؛ //فراموش نکنید که Header نیز یک رشته است و هنگام شماره گذاری باید آن را حذف کنیم، در غیر این صورت، If Row = "PP" then Table.Cell(RowNumber, Iterator).Range().Text = Row(RowNumber -1)؛ تکرار کننده = تکرار کننده + 1; ادامه هید؛ endIf; Table.Cell(RowNumber, Iterator).Range().Text = Row(FillValue[Row]); تکرار کننده = تکرار کننده + 1; چرخه پایان پایان رویه

اساساً همین است. من سعی کردم مسائل اصلی را که هنگام کار با Word ایجاد می شود برجسته کنم. امیدوارم این بررسی به شما در کارتان کمک کند =)

ممنون از راهنمایی و نظرات:
,

انتقاد پذیرفته می شود. هر چه نظرات بیشتر باشد، راهنمای بهتری خواهد بود =)

در کار یک برنامه نویس 1C، این قابلیت به ندرت مورد نیاز است، اگرچه به لطف آن می توانید کاملاً حل کنید وظایف پیچیدهبا فرم های چاپی پویا و غیر دائمی. هنگام اجرای این کار، کار ایجاد قالب های Word و ترتیب نشانک ها در قالب Word به کاربران 1C اختصاص داده می شود.

که در در این مثالنشان داده خواهد شد که چگونه با استفاده از مکانیسم های 1C و یک سند Word به عنوان یک الگو، می توانید یک فرم چاپی برای خروجی داده ها به کاربران برنامه 1C ایجاد کنید.

بیایید یک الگو بر اساس یک سند Word برای 1C ایجاد کنیم. ابتدا باید نمایش نشانک ها را برای موارد بیشتر فعال کنید کار راحتبا سند:


در مرحله بعد، باید متن و چند نشانک را به فایل الگو برای 1C اضافه کنید. یک نشانک از طریق منوی "Insert" - "Bookmark" اضافه می شود. شما باید متن نشانک را انتخاب کنید، آن را کپی کنید، منوی "Insert - Bookmark" را باز کنید، متن نشانک کپی شده را جایگذاری کنید و روی "افزودن" کلیک کنید:


وقتی فایل قالب Word آماده شد، یک پردازش خارجی جدید در 1C ایجاد می کنیم، یک فرم اضافه می کنیم و کد زیر را در ماژول فرم وارد می کنیم: &OnClient Procedure When Opening(Rejection) Fill WordTemplate(); EndProcedure &OnClient Function FillTemplateWord() //تلاش برای ایجاد شی COM ObjectWord = New COMObject("Word.Application") را امتحان کنید. گزارش استثنا ("خطا در هنگام راه اندازی مایکروسافت ورد: " + ErrorDescription(), MessageStatus.Attention؛ Return Undefined; EndAttempt; //مسیر به الگو Word Object.Documents.Add("C:\Users\Konstantin\Desktop\Template.docx")؛ قالب Word = Object Word .ActiveDocument؛ //دریافت همه نشانک ها از الگو برای هر 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(); EndFunction

در نتیجه راه اندازی پردازش خارجی 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 = Form AttributesValue("Object"); Layout = ProcessObject.GetLayout("LetterTemplateOverdue"); FileName = TemporaryFileDirectory() + "\"file.doc"; Layout.Write(FileName);

به جای یک سند معمولی، این یکی را دریافت می کنم http://prntscr.com/eshgjk
من فرض می کنم که روش پیش فرض Write(,) یک فایل را با فرمت MXL می نویسد. پارامتر دوم را روی مقدار زیر تنظیم کنید: TabularDocumentFileType.DOCX، که با جزئیات بیشتر در «دستیار نحو» توضیح داده شده است.

5. در سند من پیوندهایی به فایل هایی وجود دارد که در آن قرار دارند درایو شبکه. چگونه می توانم به این فایل ها در قالب یک لینک ایجاد کنم؟
یک سوال جالب، اگر می خواهید یک ماکرو ضبط کنید و نتیجه را ببینید، پس ویژوال بیسیکافزودن هایپرلینک به شکل زیر خواهد بود:

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" پایان فرعی

شرح روش افزودن در MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word

بر این اساس، کد 1C به شرح زیر است:

تابع FillWordTemplate() //تلاش برای ایجاد یک شی COM AttemptWordObject = New COMObject("Word.Application"); گزارش استثنا ("خطا در شروع Microsoft Word: " + ErrorDescription()، MessageStatus.Attention); بازگشت تعریف نشده؛ EndAttempt; //مسیر به الگو ObjectWord.Documents.Add("C:\Users\k.blagin\Desktop\Template.docx"); TemplateWord = ObjectWord.ActiveDocument; //دریافت همه پیوندها از الگو برای هر BookmarkWord From TemplateWord.Hyperlinks Cycle Report(BookmarkWord.Name); چرخه پایان //آدرس پیوند موجود را تغییر دهید 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(); EndFunction

بسیار مفید پردازش خارجیبرای تمام تنظیمات استاندارد 1C: Enterprise 8.3، به شما امکان می دهد یک فایل Word را مطابق با الگوی انتخاب شده از فهرست ها و اسناد سیستم ایجاد کنید. با کمک آن می توانید مشخصات مختلف، قراردادهای کاری و قرارداد با پیمانکاران، کارت های گارانتی و غیره را از 1C پرینت بگیرید. با در دست داشتن Word از ساختار مورد نیاز و کمی اصلاح آن، می توانید آن را مستقیماً از 1C با پر کردن تمام پارامترهای لازم ایجاد کنید.

اصل پردازش به شرح زیر است:

  • Word ساختار مورد نظر را انتخاب کنید،
  • در آن مکان هایی از فایل که لازم است اطلاعات را از 1C درج کنید، نشانک می گذاریم،
  • پس از آماده سازی قالب، آن را به 1C (دایرکتوری فایل ها) اضافه کنید.
  • راه اندازی پر کردن الگوی چاپ در 1C،
  • با انتخاب الگوی ایجاد شده، اسناد/کتاب های مرجع لازم را چاپ کنید.

آماده سازی قالب Word

برای نشان دادن نحوه عملکرد پردازش، مشخصات چاپ قرارداد را از سند فروش کالا و خدمات تنظیم می کنیم. بیایید بگوییم که این کلمه را داریم:

ما یک مشخصات کامل از آن تشکیل خواهیم داد. ما با قرار دادن نشانک ها در مکان هایی که لازم است اطلاعات را از پایگاه داده جایگزین کنیم، شروع می کنیم:



فاصله ها را نمی توان در نام نشانک ها استفاده کرد.

هنگام چاپ، جدول محصول را نیز پر می کنیم. برای اینکه زیبا به نظر برسد، سرصفحه و یک خط خالی را بگذارید:


Word را ذخیره کرده و ببندید.

راه اندازی پر کردن قالب

اکنون مجله سند فروش را در برنامه باز کنید، به منوی چاپ بروید و روی دکمه تنظیم چاپ با استفاده از قالب Word کلیک کنید:


سفارشی سازی قالب فقط برای کاربرانی که حقوق کامل دارند در دسترس است.

در پنجره تنظیمات که باز می شود، اول از همه، اجازه دهید ایجاد کنیم فایل جدیددر برنامه (به معنای عنصر دایرکتوری است فایل ها) و Word ما را به آن پیوند دهید:


در پنجره باز شده را انتخاب کنید فایل اضافه کنید:


سپس آن را در تنظیمات قالب انتخاب کنید. پس از این، جدول نشانک ها پر می شود؛ باید منابع پر کردن داده ها را در این نشانک ها انتخاب کنیم:


از جزئیات خود سند فروش و همچنین مشتقات این جزئیات به عنوان منبع استفاده می شود:

هنگام چاپ، می توانید از جزئیات اضافی کتاب ها و اسناد مرجع نیز استفاده کنید.

لیست جزئیات موجود بسیار بزرگ است، استفاده از ورود سریع راحت است:


در نتیجه انتخاب منبع، جدول به شکل زیر خواهد بود:


انحراف بر حسب مورد و همچنین مخفف نام کامل برای مقادیر ردیف جدول موجود است:


برای چاپ جدول در Word، جدول منبع سند را انتخاب کنید:


پس از انتخاب جدول، راهنما با نام جزئیاتی که می توان از آنها برای نمایش جدول در Word استفاده کرد ظاهر می شود. تنها کاری که باید انجام دهیم این است که جزئیات لازم را که با کاما از هم جدا شده اند (به ترتیب ستون های فایل) فهرست کنیم. می توانید یک مقدار خالی در ستون بگذارید یا متن دلخواه را در آنجا بنویسید:


همه چیز اوکی است، اکنون می توانیم Word مورد نظر را چاپ کنیم.

چاپ با استفاده از یک الگوی سفارشی اکنون برای همه در دسترس است، یعنی. لازم نیست کاربران هر بار چاپ خود را تنظیم کنند.



ما می توانیم یک سند یا یک لیست را چاپ کنیم:


در فرم تنظیمات چاپ، علاوه بر ایجاد الگوهای جدید، می توانید الگوهای موجود را ویرایش کنید:


اگر چندین الگوی Word برای یک شی پیکربندی شده باشد، پس از انتخاب فرمان چاپ، پنجره ای با انتخاب مورد نیاز باز می شود:


برای جلوگیری از درگیری با حقوق دسترسی کاربر به دایرکتوری فایل هاعلاوه بر پردازش چاپ خود در Word، باید یک افزونه برای 1C (که در همان بایگانی پردازش قرار دارد) نصب کنید، که به کاربران امکان دسترسی به خواندن دایرکتوری را می دهد.

اگر سوال/نظر/پیشنهاد در رابطه با این پردازش دارید، خوشحال می شوم پاسخ دهم.

انتشار 1.1.2.2 از 15 دسامبر 2018

برای نمایش تاریخ هنگام چاپ الگو، قابلیت انتخاب فرمت اضافه شده است؛ در قسمت جدول، علاوه بر نامگذاری، اکنون می توانید مقاله و واحد اندازه گیری را نیز مشخص کنید:


اکنون می توانید قالب های غیر ضروری را حذف کنید:


انتشار 1.1.2.3 از 2019/01/29

اکنون می توان قسمت هایی از یک تاریخ را به طور جداگانه نمایش داد - روز، ماه (تعداد یا نام) و سال:


برای اشخاص حقیقی(و پیمانکاران با نوع فردی) اکنون می توانید داده های گذرنامه را نمایش دهید:


انتشار 1.1.2.4 از 03/12/2019

هنگام چاپ قسمت جدولی اسناد توزیع کالا در Word، نه تنها از جزئیات این قسمت جدولی، بلکه از هر جزئیات مورد استفاده می شود:


انتشار 1.1.2.5 از 07/12/2019

اکنون نه تنها می توان یک الگوی Word را تولید کرد، بلکه به طور خودکار آن را به شی منبع (در فایل های پیوست شده) پیوست کرد. برای این کار باید گزینه setting را انتخاب کنید در فایل های پیوست ذخیره کنید.


در پایان مراحل چاپ، فرم فایل پیوست باز می شود.


از این فرم می توانید در صورت نیاز، قالب تکمیل شده Word را برای مشاهده/ویرایش باز کنید.

این مقاله تلاشی است برای جمع آوری اطلاعات در مورد اثر (در سطح ورودی) با MS Word در یک مکان. مطالب مشابه زیادی وجود دارد و با پشتکار مناسب می توان همه آنها را پیدا کرد. می خواستم نکات اصلی را یک جا جمع کنم.

این نشریه نوعی یادداشت حاوی نمونه‌های کد برای موارد زیر است:

  1. پر کردن قالب Word با داده های 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 ایجاد کنید
WordObject = New COMObject("Word.Application");
ObjectWord.Documents.add(FileName);
//در Word، می توانید چندین سند را در یک برنامه باز کنید، بنابراین Word.Application.Documents Object مجموعه ای از اسناد باز است.
//در مورد ما، همیشه فقط یک سند باز است
DocumentWord = ObjectWord.Application.Documents(1);
DocumentWord.Activate();
Exception Report ("خطا هنگام راه اندازی برنامه "+ErrorDescription());
EndAttempt;
//البته، گرفتن شی COM باید در تلاش قرار گیرد. شما هرگز نمی دانید، چیزی اشتباه خواهد شد.

خواننده ممکن است به درستی اشاره کند که از یک تماس مودال استفاده می شود و انگشت خود را به سمت نویسنده تکان دهد. و حق با او خواهد بود.

//ساختاری از پارامترهای سند ایجاد کنید
DocumentParameters = PrepareParametersStructure();
//ساختار پارامترهای سند را پر کنید
FillParametersStructure(DocumentParameters);

بیایید کمی عمیق تر به اصول Word بپردازیم ...

هر سند Word به بخش هایی تقسیم می شود که از صفحات تشکیل شده است.

برای هر بخش، امکان ایجاد شماره گذاری عناصر، سرصفحه ها و پاورقی های منحصر به فرد و تنظیمات پارامتر صفحه وجود دارد. بنابراین، برای مثال، برای چرخاندن یکی از صفحات (چاپ به صورت افقی)، باید یک بخش جداگانه برای آن ایجاد کنید.

هر صفحه Word به چندین بخش تقسیم می شود:

  • هدر صفحه
  • متن اصلی
  • پاورقی
لازم به ذکر است که هر بخش می تواند یک سربرگ و پاورقی منحصر به فرد برای صفحه اول داشته باشد.

//Object، شامل تمام متن اصلی از تمام بخش های DocumentWord.Content است
// شی شامل مجموعه ای از بخش های سند است
DocumentWord.Sections
//هر بخش مجموعه مخصوص به خود را برای هدرها دارد
DocumentWord.Sections(1).Headers
//و مجموعه خودش برای فوترها
DocumentWord.Sections(1).Foters
//در همان زمان، اگر چک باکس "سرصفحه منحصر به فرد برای صفحه اول" علامت زده شود، مجموعه Headers و Footers حاوی دو عنصر خواهد بود.

پر کردن پارامترهای سفارشی

وقتی به این مجموعه‌ها دسترسی پیدا می‌کنیم، می‌توانیم آنها را جستجو کرده و اشیاء داخلی مانند جداول را بازیابی کنیم.

اکنون ما کم و بیش می دانیم که چگونه به مناطق Word دسترسی پیدا کنیم، می توانیم با آنها کمانچه وارد کنیم و پارامترهای خود را جایگزین کنیم:

// بیایید تمام پارامترها را مرور کنیم و آنها را در سند جایگزین کنیم
برای هر پارامتر از چرخه پارامترهای سند
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);
چرخه پایان

//عملکرد جستجو و جایگزینی را انجام دهید
PerformReplace (مقدار شی، پارامتر، مقدار)
Object.Find.Execute(Parameter,,Value,2)
EndFunction

به متد Execute نگاه کنید. هنگام جایگزینی/جستجوی مستقیم از MS Word، پارامترهای آن با کادر محاوره ای یکسان است:

(36.38 کیلوبایت) تعداد دانلود: 5

و در اینجا پارامترهای اصلی (ترجمه رایگان کمک MSDN):

  1. جستجوی متن - رشته - متن جایگزین. متن ممکن است حاوی پارامترهای خاصی باشد. به عنوان مثال، ^p - پاراگراف، ^t - تب
  2. حساسیت به حروف کوچک - بولی - اگر درست باشد، جستجو به حروف بزرگ و کوچک حساس خواهد بود
  3. کل کلمات - Boolean - اگر درست باشد، کل کلمات جستجو می شوند. تکرار کلمات محاسبه نمی شود. به عنوان مثال، هنگام جستجوی کلمه home، کلمه home از قلم می افتد
  4. از حروف عام استفاده کنید - Boolean - اگر درست است، از عبارات منظم داخلی استفاده کنید.
  5. جستجوی مشابه - Boolean - اگر درست باشد، نتیجه جستجو حاوی کلمات مشابه خواهد بود
  6. جستجوی همه فرم ها - Boolean - اگر درست باشد، نتیجه جستجو حاوی اشکال مختلفی از کلمات خواهد بود.
  7. ابتدا جستجو کنید - Boolean - اگر درست باشد، از ابتدا تا انتهای سند را جستجو می کند
  8. پوشش - WdFindWrap - جهت جستجو را مشخص می کند
  9. قالب - قالب متن جستجو
  10. رشته جایگزین - رشته - رشته ای که متن اصلی به آن جایگزین می شود
  11. تعداد تعویض - WdReplace - تعیین می کند که چند بار تعویض انجام شود
  12. و غیره.
WdReplace - مقدار ثابت:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

این روش به شما اجازه نمی دهد که "رشته جایگزین" را به عنوان یک منطقه انتخاب شده دریافت کنید، اما حدود 10 برابر کندتر است. برای به دست آوردن یک منطقه انتخاب شده، می توانید از یک عملکرد استاندارد کمی تنظیم شده استفاده کنید:

//Print ManagementMSWordClient با تغییرات جزئی برای پیکربندی SCP 1.3
تابع PerformReplacement (مقدار شی، پارامتر، مقدار)
SearchString = "[" + پارامتر + "]";
StringReplacements = String(Value);
//لازم است مناطقی را که در آنها جایگزین می کنیم انتخاب کنیم
Object.Select();
//منطقه انتخاب شده را دریافت کنید
Selection = Object.Application.Selection;
//همه رخدادهای پارامتر را پیدا کرده و آن را با مقدار مورد نیاز خود جایگزین کنید
FindObject = Selection.Find;
FindObject.ClearFormatting();
در حالی که FindObject.Execute(SearchString) حلقه بزنید
اگر EmptyString (ReplacementString) سپس
Selection.Delete();
در غیر این صورت
Selection.TypeText(ReplacementString);
endIf;
چرخه پایان
//لغو انتخاب
Selection.Collapse();
EndFunction

هنگامی که منطقه انتخاب شده را دارید، می توانید سبک متن، فونت و غیره را ویرایش کنید.

//ویرایش فونت
انتخاب. فونت
//ویرایش رنگ
Selection.HighlightColorIndex

روش دومی نیز وجود دارد که از یک شی Word به نام فیلدها استفاده می کند. من واقعا او را دوست ندارم، زیرا ... در اسناد بزرگ، حدود 100 صفحه، این فیلدها شروع به اشکال می کنند (ناپدید می شوند، مقادیر لازم را وارد نمی کنند) و مزخرفات دیگر. خوب، حداقل در Word 2007. اما به هر حال آن را می دهم:

هنگام تهیه یک الگو، فیلدهایی با نوع DOCVARIABLE باید در بدنه سند درج شود (با استفاده از کلیدهای داغ Ctrl+F9 می توان آن را درج کرد).

به روش ساده زیر می توانید به چنین فیلدهایی دسترسی پیدا کنید:

Word Document.Variables.Item(ParameterName).Values

پر کردن جداول با استفاده از الگو

بنابراین، ما پارامترها را در متن اصلی سند پر کرده ایم، پارامترها را در سرصفحه ها و پاورقی ها جایگزین کرده ایم، اما هنوز یک مشکل داریم - باید جدول را پر کنیم.

رویکرد توضیح داده شده در زیر فقط برای جداول با قالب شناخته شده مناسب است. آن ها می توانیم جدول و سطرهای آن را در ابتدا به هر شکلی که می خواهیم قالب بندی کنیم. اما پس از آن تغییر بسیار مشکل ساز است.

جداول از طریق مناطق سند قابل دسترسی است.

//دسترسی به اولین جدول در متن اصلی
جدول = DocumentWord.Content.Tables(1)

برای تنظیم قالب بندی، ساده تر است که یک جدول در قالب با یک ردیف اول خالی ایجاد کنید که متعاقباً آن را حذف می کنیم.

//داده برای پر کردن
پارامترهای PM = پارامترهای سند.
//باید هدر و خط اول را دست نخورده بگذاریم Iterator = 2;
جدول = DocumentWord.Content.Tables(3);
برای هر خط از پارامترهای چرخه PM
//به طور پیش فرض، خط بالای خط اول را اضافه می کند
Table.Rows.Add();
ردیف جدول را پر کنید (جدول، تکرار کننده، ردیف، PP، نام نامگذاری، واحد اندازه گیری، رشته قیمت، پارامترهای پی ام).
تکرار کننده = تکرار کننده + 1;
چرخه پایان
//ساختار قالب ها شامل نام ستون ها و ترتیب آنهاست
رویه پر کردن ردیف جدول (جدول، شماره ردیف، مقدار پر، ساختار الگو، جدول ارزش)
آرایه رشته ها = هدف عمومی.
تکرار کننده = 1;
برای هر ردیف از حلقه رشته ها
اگر ValueTable.Columns.Find(Row) = Undefined AND رشته "PP" سپس
تکرار کننده = تکرار کننده + 1;
ادامه هید؛
//فراموش نکنید که Cap نیز یک رشته است و هنگام شماره گذاری باید آن را حذف کنیم
ElseIf String = "PP" سپس
Table.Cell(RowNumber, Iterator).Range().Text = Row(RowNumber-1);
تکرار کننده = تکرار کننده + 1;
ادامه هید؛
endIf;
Table.Cell(RowNumber, Iterator).Range().Text = Row(FillValue[Row]);
تکرار کننده = تکرار کننده + 1;
چرخه پایان
پایان رویه

اساساً همین است. من سعی کردم مسائل اصلی را که هنگام کار با Word ایجاد می شود برجسته کنم. امیدوارم این بررسی به شما در کارتان کمک کند =)

[ برای مشاهده لینک ، لطفا ثبت نام کنید ]