Создание документов Word средствами 1С

31.03.2018

 

Давайте рассмотрим на примерах как это делается! =) Мне известно 2 способа: 
1. Путем замены шаблонного текста в макете Wordа. 
2. Путем вставки текста с помощью закладок в Wordе, 

В первом случае сразу скажу, что длина строки передаваемая в функцию замены, довольно небольшая  255 символов, да и расстановка шаблонных выражений в макете Word занимает довольно много времени. Через процедуру Content.Find.Execute.




Во втором случае длина, насколько мне известно неограниченна, также воськаться с закладками намного быстрее и удобнее, чем расставлять шаблонный текст. Используя Bookmarks().select(). Поэтому давайте на коде рассмотрим второй пример. 

И так, для начала необходимо добавить Word макет к документу. Добавляем макет с помощью конструктора макетов указав Active document и выбрав соответствующий макет. 

Называем его Акт. Открываем макет в 1Ске, ставим курсор в нужном месте, переходим в меню Вставка закладка нажимаем добавить закладку к примеру у меня это НарушенияТекст 

Теперь кидаем на форму документа кнопку Сформировать и по нажатию на нее пишем код который открывает наш макет Word ищем закладку по имени и вставляет туда текст: 

Код 1C v 8.х
 //инициализация часть 1  СсылкаМакет = ПолучитьМакет(Акт);  MSWord = СсылкаМакет.Получить();  Попытка  СсылкаМакет = MSWord.Application.Documents(1);  СсылкаМакет.Activate();   //выгружаем табличную часть с нарушениями в строку часть 2  str = Новый COMОбъект(ADODB.Stream);  str.Open();  СтрочкаТаблицы = ЭлементыФормы.Нарушения.ТекущиеДанные;  Для Каждого СтрочкаТаблицы Из Нарушения Цикл  str.WriteText( + СтрочкаТаблицы.Описание +  Нарушены требования СНИПФЗГОСТ:  + СтрочкаТаблицы.СНИПФЗГОСТ  +  Статья:  + СтрочкаТаблицы.ЧастьСтатья  + Символ(13),0);  КонецЦикла;  str.Position = 0;  НарушенияТекст = str.readText();  //вставляем в закладку текст с нарушениями часть 3  MSWord.Bookmarks(НарушенияТекст).select();  MSWord.Application.selection.TypeText(НарушенияТекст);  //открыть Word часть 4  СсылкаМакет.Application.Visible = Истина;  СсылкаМакет.Activate();  Исключение  //если ошибка   Сообщить(ОписаниеОшибки());  MSWord.Application.Quit();  КонецПопытки;   


Это пример вывода множества строчек из табличной части  одной строкой, если нужно просто выгрузить какой-то реквизит то можно пропустить часть 2 и перейти к части 3. 

Для выгрузки табличной части в форме таблицы можно использовать функцию автоформата, примеру код выгрузки табличной части документа Предписание: 

Код 1C v 8.х
 Word = MSWord.Application;  Документ = Word.ActiveDocument();  //Переместиться вниз на 22 строк  Word.selection.MoveDown(,22);  Документ.Paragraphs.Add();  //подготовка таблицы:  Rng = Word.selection.Range;  //Формируем заголовок:  Rng.I_nsertAfter(№ п/п*Установленные нарушения и меры по их устранению*Основания);   Rng.I_nsertParagraphAfter();  //сама таблица  СтрочкаТаблицы = ЭлементыФормы.НарушенияПредписание.ТекущиеДанные;  Для Каждого СтрочкаТаблицы из НарушенияПредписание Цикл   Rng.I_nsertAfter(Строка(СтрочкаТаблицы.НомерСтроки)+*+СтрочкаТаблицы.Описание + ;  + СтрочкаТаблицы.Предписание +* + СтрочкаТаблицы.СНИПФЗГОСТ +   + СтрочкаТаблицы.ЧастьСтатья);  Rng.I_nsertParagraphAfter();   КонецЦикла;   Rng.ConvertToTable(*);  Документ.Tables(1).AutoFormat(17); //номер таблицы в шаблоне  Word.Visible = Истина;   


Ну вот и все =) 
Автор: saylolpls



Еще способ Active document 
В Конфигураторе Макеты - правый клик - Добавить 
Тип макета: Active document 
Создать новый - Документ Microsoft Word 

Меню Вставка - Поле - Автоматизация - DocVariable 
Написать имя поля в графе "Новое имя:" ДатаПриказа 

В модуле формы документа создаем кнопку, и в ее обработчике пишем: 

Код 1C v 8.х
 Процедура ОсновныеДействияФормыWord(Кнопка)     АктивныйДокумент = ПолучитьМакет("Макет");     КомОбъект = АктивныйДокумент.Получить();          КомОбъект.Application.Visible=1;     КомОбъект.Variables.Item("ДатаПриказа").Value="24.01.2007";     КомОбъект.Fields.UpDate();     КомОбъект.PrintOut(); //распечатать документ     //Ожидание окончания отправки на печать...     Пока objWord.Application.BackgroundPrintingStatus<>0 Цикл       Предупреждение("Ожидание",1);     КонецЦикла;       КомОбъект.Application.Quit(); //закрыть Word     КомОбъект = 0;  КонецПроцедуры     



2) добавляем не поле, а Закладку 
Меню Вставка - Закладка и далее указываем ее имя ("ИмяЗакл") 

Код 1C v 8.х
 Процедура ОсновныеДействияФормыWord(Кнопка)     АктивныйДокумент = ПолучитьМакет("Макет");     КомОбъект = АктивныйДокумент.Получить();     КомОбъект.Application.Visible=1;     КомОбъект.Bookmarks(СокрЛП("ИмяЗакл")).select();     КомОбъект.Application.selection.TypeText(СокрЛП("тест проверка"));  КонецПроцедуры   




Код 1C v 8.2 УП
 // Параметры договора обозначены в тексте переменными вида "[%НомерДоговора%]"  Функция ПечатьДокумента() Экспорт             Договор = ПолучитьМакет("ActiveDocument_ДоговорПоставки"); // получим макет-ActiveDocument       MSWord = Договор.Получить();        Попытка  	Doc = MSWord.Application.Documents(1);          Doc.Activate();                   Replace = Doc.Content.Find;                        FindText = "{НомерДоговора}";     // что искать - имя_шаблона          MatchCase = Ложь;                 // использовать регулярные выражения                  MatchWholeWord = Истина;          // искать слово целиком          MatchWildcards = Ложь;            // испоьзовать регулярные выражения           MatchSoundsLike = Неопределено;   // искать созвучные           MatchAllWordForms = Неопределено; // искать все формы слова          Forward = Истина;                 // искать вперед          Wrap = Неопределено;              // что должен вернуть Find-объект           Format_ = Ложь;                   // использовать форматирование          ReplaceWith = "N777";             // текст, на который надо заменить имя_шаблона                    // кратко:                  //Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,НомерДоговора);                            Replace.Execute(              FindText,               MatchCase,               MatchWholeWord,               MatchWildcards,               MatchSoundsLike,               MatchAllWordForms,               Forward,              Wrap,              Format_,              НомерДоговора);                        MSWord.Application.Visible = Истина;          MSWord.Activate();      Исключение          Сообщить(ОписаниеОшибки());          MSWord.Application.Quit();          КонецПопытки;             возврат 0;  КонецФункции   

Источник

:..

Назад к списку новостей