среда, 11 июля 2012 г.

Заполнение документа WORD из 1С 7.7

Потребовалось заполнить документ Word напрямую из 1С. Нашел несколько методов на pro1c.ru и mista.ru

Первый - через использование закладок Word. В принципе, простой:
1. Делаем шаблон в Word (.DOT-файл)
2. Вставляем в него необходимое количество этих самых закладок через меню "Вставка - Закладка".
3. Даем каждой закладке свой идентификатор. По нему или по номеру потом из 1С обращаемся к закладке и заполняем:
а) по номеру
Word=СоздатьОбъект("Word.Application");
Word.visible=0;
Protokol=Word.Documents.Add(КаталогИБ()+"Dogovor\Protokol.dot",0,0,1);
Protokol.Fields(1).Result.Text=СокрЛП(Протокол);
...
Protokol.Fields(5).Result.Text=НРег(Формат(ДатаТоргов,"Д (0)ДДММММГГГГ"));
Protokol.SaveAs(ИмяФайлаПротокол);
Word.visible=1;

б) по идентификатору
//*******************************************************************
Процедура ПечатьЗакладки(ИмяЗакладки, Font, Bold, Underline, Text);
  ВордДок.Bookmarks(ИмяЗакладки).Range.Font.Name = Font;
  ВордДок.Bookmarks(ИмяЗакладки).Range.Bold      = Bold;
  ВордДок.Bookmarks(ИмяЗакладки).Range.Underline = Underline;
  ВордДок.Bookmarks(ИмяЗакладки).Range.Text      = Text;
КонецПроцедуры
Если есть шаблон .dot в файле FullNameFile, то:
ВордДок = Ворд.Documents.Add(FullNameFile);
И в шаблон вставляем значения наших закладок
ПечатьЗакладки("МояЗакладка", "Times New Roman", 1, 0, СокрЛП(МояЗакладка1С));

в) еще по идетификатору
hvКодЗаказа="Привет";
docWord.Bookmarks("hvКодЗаказа").Select(); docWord.Application.Selection.TypeText(hvКодЗаказа);

Через закладки не понравилось - до заполнения не видно, как будет выглядеть форматирование документа.

Так что использовали второй, более наглядный - через поиск и замену. Создаем шаблон, и в тексте прописываем идентификаторы реквизитов, которые потом будут заменены на их значения. Для избежания случайных срабатываний заключаем идентификаторы в квадратные скобки.

Ворд=СоздатьОбъект("Word.Application"); Ворд.Visible=1; ДокВорд=Ворд.documents; ТекДокВорд=ДокВорд.Open(СокрЛП(ПутьШаблона)); //путь к шаблону (dot) Содержание=ТекДокВорд.Content; Содержание.Find.Execute("[НомерДок]",0,0,,,,,,,Строка(СокрЛП(НомерДок)),1); Содержание=ТекДокВорд.Content; // это каждый раз! Содержание.Find.Execute("[ФИО]",0,0,,,,,,,Строка(СокрЛП(ФИО)),1);
ТекДокВорд.SaveAs(ПодКакимИменемСохранитьФайл+".doc");

С 2003 офисом точно работает, под другими не пробовал.

UPD. 10.03.2017
В 2013 офисе тоже работает, проверено :).
Для замены всех встречающихся значений шаблона в тексте, необходимо установить последний параметр в 2.
Содержание.Find.Execute("[ФИО]",0,0,,,,,,,Строка(СокрЛП(ФИО)),2);
Описание здесь и здесь.
Параметр - wdReplaceAll = 2;
Поиск = ОбъектДокумент.Content.Find;
Поиск.Execute(ИмяПараметра,,,,,,,,,ЗначениеПараметра,2);

20 комментариев:

Unknown комментирует...

В Word 2007 работает на ура

Unknown комментирует...

номердок="роророророр";
Ворд=СоздатьОбъект("Word.Application");
Ворд.Visible=1;
ДокВорд=Ворд.documents;
путьшаблона="d:\dogovor.dot";
ТекДокВорд=ДокВорд.Open(СокрЛП(ПутьШаблона)); //путь к шаблону (dot)
Содержание=ТекДокВорд.Content;
Ворд=СоздатьОбъект("Word.Application");
Ворд.Visible=1;
ДокВорд=Ворд.documents;
ТекДокВорд=ДокВорд.Open(СокрЛП(ПутьШаблона)); //путь к шаблону (dot)
Содержание=ТекДокВорд.Content;
Содержание.Find.Execute("[nom_dog]",0,0,,,,,,,"номердок",2);
//Рез = текдокворд.Bookmarks.Exists("nom_dog");
// сообщить(рез);
Содержание=ТекДокВорд.Content; // это каждый раз!
фио="фиофио";
Содержание.Find.Execute("[fio]",0,0,,,,,,,"фио фио",2);
//Содержание=ТекДокВорд.Content;
ПодКакимИменемСохранитьФайл="d:\dog" ;
ТекДокВорд.SaveAs(ПодКакимИменемСохранитьФайл+".doc");

Пожалуйста, подскажите.
воспользовалась вашим кодом. Документ находит. Закладки документа находит. Но почему то не заполняет нужными реквизитами. То есть закладки fio и nom_dog остаются пустыми. Буду очень благодарна за помощь.

Коршунов Евгений комментирует...

Сократил код по минимуму, попробовал на 2016 Word-е.

Ворд=СоздатьОбъект("Word.Application");
Ворд.Visible=1;
ДокВорд=Ворд.documents;
ТекДокВорд=ДокВорд.Open("e:\dog.dotx");
Содержание=ТекДокВорд.Content;
Содержание.Find.Execute("[ФИО]",0,0,,,,,,,"Иванов",2);
ТекДокВорд.SaveAs("e:\dog.doc");

Всё отработало как положено, было [ФИО], стало Иванов
Попробуйте ещё раз, только имя диска поправьте.

Коршунов Евгений комментирует...

P.S. Это код не для использования закладок, а обычная автозамена текста.
Чтобы исключить случайные замены - текст взят в квадратные скобки.

Unknown комментирует...

А если нужно вывести таблицу в договоре каков алгоритм?

Коршунов Евгений комментирует...

Тогда надо смотреть вот сюда :)

https://infostart.ru/public/65996/
или
https://infostart.ru/public/488556/

Я сам с заполнением таблиц не работал, не было таких задач.

Максим Котов комментирует...

Как сделать цикл чтобы печатал по шаблону заявления сотрудников из списка

Коршунов Евгений комментирует...

Собственно, точно также, всю конструкцию поместить в цикл по сотрудникам.

Создание объекта Word > заполнение > печать или сохранение > закрытие.

Если сотрудников не пара тысяч - проблем быть не должно.

Unknown комментирует...

день добрый. Помогите "чайнику", никак не подставляются нужные значения. Что не так?

Ворд=СоздатьОбъект("Word.Application");
Ворд.Visible=1;
ДокВорд=Ворд.documents;
ТекДокВорд=ДокВорд.Open(СокрЛП("C:\Users\гмг\Desktop\"+"договор.dotm")); //путь к шаблону (dot)
Содержание=ТекДокВорд.Content;
//вариант1
Содержание.Find.Execute("[НомерДок]",0,0,,,,,,,Строка(СокрЛП(Код)),2);
Содержание=ТекДокВорд.Content; // это каждый раз!
//вариант2
Содержание.Find.Execute("[ФИО]",0,0,,,,,,,"иванов вася",2);
ТекДокВорд.SaveAs("C:\Users\гмг\Desktop\"+"договор1.doc");

Нужно шаблон договора заполнить нужными реквизитами.

Unknown комментирует...

Решено!
В шаблоне не ставил квадратные скобки. Все работает. Спасибо за информацию.

Максим Котов комментирует...

Я бухгалтер и нужно напечатать заявление на открытие банковской карты на каждого сотрудника. Могли бы вы прислать структуру кода при написании модуля при подборе сотрудников из списка. Всё необходимые реквизиты есть в справочнике Сотрудники.

Коршунов Евгений комментирует...

Самый простой перебор, например - https://helpf.pro/faq7/view/303.html или https://1c77progr.ru/article/obkhod-elementov-spravochnika-pereborom

А уже внутри цикла - вставляем код, который работает с Word.

Unknown комментирует...

Процедура ПечатьСправочник()


Спр = СоздатьОбъект("Справочник.Справочник");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл

а="";
в="";
с="";
а=Спр.Фамилия;
в=спр.Имя;
с=спр.Отчество;

Ворд=СоздатьОбъект("Word.Application");
Ворд.Visible=1;
ДокВорд=Ворд.documents;
ТекДокВорд=ДокВорд.Open("C:\Users\Кот\Desktop\MS_Word\MS_Word\ШАБЛОНЫ\Документ.doc");
Содержание=ТекДокВорд.Content;

Содержание.Find.Execute("[ФИО]",0,0,,,,,,,а+в+с,2);
Содержание=ТекДокВорд.Content;
Содержание.Find.Execute("[Фамилия]",0,0,,,,,,,а,2);
Содержание=ТекДокВорд.Content;
Содержание.Find.Execute("[Имя]",0,0,,,,,,,в,2);
Содержание=ТекДокВорд.Content;
Содержание.Find.Execute("[Отчество]",0,0,,,,,,,с,2);
Содержание=ТекДокВорд.Content;

ТекДокВорд.SaveAs("C:\Users\Кот\Desktop\MS_Word\MS_Word\ШАБЛОНЫ\"+а+в+с+".doc");
ТекДокВорд=ДокВорд.Close;


КонецЦикла;
КонецПроцедуры

Unknown комментирует...

Подскажите как сделать чтобы созданный документ Word после замены переменный и сохранения закрывался, чтобы не плодить много открытых документов.Спасибо

Максим Котов комментирует...

Как сделать закрытие созданного документа чтобы начался создаваться очередной. Чтобы не закрывать потом вручную 100 с лишним заявлений.

Коршунов Евгений комментирует...

Интернет подсказал такое решение, надо пробовать:

Ворд.Application.DisplayAlerts =-1;
Ворд.ActiveDocument.saveas(ПутькФайлу);
Ворд.Application.quit();

Максим Котов комментирует...

При переходе на следующая запись выдаёт Ошибку
ДокВорд=ворд.documents;
Поле агрегатного обьекта не обнаружено (documents)

Максим Котов комментирует...

Все получилось. Спасибо.

Unknown комментирует...

Добрый день!
Подскажите, пжста, как вставить таблицу из эксель файла в ворд?
То есть, суть такая, имеется два файла: Документ.dot и Таблица.xls.
Необходимо в Документ.dot вставить таблицу уже заполненную из файла Таблица.xls
Спасибо!

Коршунов Евгений комментирует...

Скорее всего, самое правильное - через чтение из Excel во временную таблицу, а потом создание и заполнение документа Word.
Это будет обычная таблица Word.