Потребовалось заполнить документ Word напрямую из 1С. Нашел несколько методов на pro1c.ru и mista.ru
Первый - через использование закладок Word. В принципе, простой:
1. Делаем шаблон в Word (.DOT-файл)
2. Вставляем в него необходимое количество этих самых закладок через меню "Вставка - Закладка".
3. Даем каждой закладке свой идентификатор. По нему или по номеру потом из 1С обращаемся к закладке и заполняем:
Через закладки не понравилось - до заполнения не видно, как будет выглядеть форматирование документа.
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КодЗаказа);
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;
ТекДокВорд.SaveAs(ПодКакимИменемСохранитьФайл+".doc");
С 2003 офисом точно работает, под другими не пробовал.
UPD. 10.03.2017
В 2013 офисе тоже работает, проверено :).
Для замены всех встречающихся значений шаблона в тексте, необходимо установить последний параметр в 2.
Содержание.Find.Execute("[ФИО]",0,0,,,,,,,Строка(СокрЛП(ФИО)),2);
Описание здесь и здесь.
Параметр - wdReplaceAll = 2;
Поиск = ОбъектДокумент.Content.Find; Поиск.Execute(ИмяПараметра,,,,,,,,,ЗначениеПараметра,2);
20 комментариев:
В Word 2007 работает на ура
номердок="роророророр";
Ворд=СоздатьОбъект("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. Это код не для использования закладок, а обычная автозамена текста.
Чтобы исключить случайные замены - текст взят в квадратные скобки.
А если нужно вывести таблицу в договоре каков алгоритм?
Тогда надо смотреть вот сюда :)
https://infostart.ru/public/65996/
или
https://infostart.ru/public/488556/
Я сам с заполнением таблиц не работал, не было таких задач.
Как сделать цикл чтобы печатал по шаблону заявления сотрудников из списка
Собственно, точно также, всю конструкцию поместить в цикл по сотрудникам.
Создание объекта Word > заполнение > печать или сохранение > закрытие.
Если сотрудников не пара тысяч - проблем быть не должно.
день добрый. Помогите "чайнику", никак не подставляются нужные значения. Что не так?
Ворд=СоздатьОбъект("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");
Нужно шаблон договора заполнить нужными реквизитами.
Решено!
В шаблоне не ставил квадратные скобки. Все работает. Спасибо за информацию.
Я бухгалтер и нужно напечатать заявление на открытие банковской карты на каждого сотрудника. Могли бы вы прислать структуру кода при написании модуля при подборе сотрудников из списка. Всё необходимые реквизиты есть в справочнике Сотрудники.
Самый простой перебор, например - https://helpf.pro/faq7/view/303.html или https://1c77progr.ru/article/obkhod-elementov-spravochnika-pereborom
А уже внутри цикла - вставляем код, который работает с Word.
Процедура ПечатьСправочник()
Спр = СоздатьОбъект("Справочник.Справочник");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 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;
КонецЦикла;
КонецПроцедуры
Подскажите как сделать чтобы созданный документ Word после замены переменный и сохранения закрывался, чтобы не плодить много открытых документов.Спасибо
Как сделать закрытие созданного документа чтобы начался создаваться очередной. Чтобы не закрывать потом вручную 100 с лишним заявлений.
Интернет подсказал такое решение, надо пробовать:
Ворд.Application.DisplayAlerts =-1;
Ворд.ActiveDocument.saveas(ПутькФайлу);
Ворд.Application.quit();
При переходе на следующая запись выдаёт Ошибку
ДокВорд=ворд.documents;
Поле агрегатного обьекта не обнаружено (documents)
Все получилось. Спасибо.
Добрый день!
Подскажите, пжста, как вставить таблицу из эксель файла в ворд?
То есть, суть такая, имеется два файла: Документ.dot и Таблица.xls.
Необходимо в Документ.dot вставить таблицу уже заполненную из файла Таблица.xls
Спасибо!
Скорее всего, самое правильное - через чтение из Excel во временную таблицу, а потом создание и заполнение документа Word.
Это будет обычная таблица Word.
Отправить комментарий