Официальный
1С:Франчайзи

task@MoscowSoft.com
Меню
Каталог Наши клиенты Акции Покупки Компания Статьи Контакты

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

Представляем наши разработки:

Универсальные переносы данных 1С (перенос документов, остатков и справочной информации):

Данные программы разработаны в нашей компании. Позволяют комфортно выполнить переход со старых программ 1С на новые. В отличие от типовых переносов фирмы 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;  КонецФункции   

Источник

:..

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