Top.Mail.Ru
Меню
Каталог Программы 1С Опыт и отзывы Услуги Компания Статьи Контакты

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

Основатель и генеральный директор компании MoscowSoft, Сорокин Сергей
Сорокин Сергей, Генеральный директор MoscowSoft  31.03.2018 Актуальность проверена: 03.11.2024   5 мин. Прочитать позже
Подобрать перенос данных 1С

Специализируемся на переносах данных 1С с 2015г.

Подобрать перенос данных 1С >>

Интеграция 1С с маркетплейсами

Специализируемся на интеграциях 1С с маркетплейсами с 2021г.

Изучить продукты >>

Давайте рассмотрим на примерах как это делается! Мне известно 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;  КонецФункции   

MoscowSoft логотип

Нужна помощь?

Если не получается разобраться с вопросом самостоятельно, обратитесь к нам. Получите бесплатную консультацию эксперта!

Основатель и генеральный директор компании MoscowSoft, Сорокин Сергей
Сорокин Сергей, Генеральный директор MoscowSoft

Возврат к списку