среда, 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 комментариев:

  1. номердок="роророророр";
    Ворд=СоздатьОбъект("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 остаются пустыми. Буду очень благодарна за помощь.

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

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

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

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

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

    ОтветитьУдалить
  5. Тогда надо смотреть вот сюда :)

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

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

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

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

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

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

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

    Ворд=СоздатьОбъект("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");

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

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

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

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

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

    ОтветитьУдалить
  12. Процедура ПечатьСправочник()


    Спр = СоздатьОбъект("Справочник.Справочник");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 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;


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

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

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

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

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

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

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

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

    ОтветитьУдалить