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

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем ishimova, 25 июн 2009.

  1. TopicStarter Overlay
    ishimova
    Offline

    ishimova

    Регистрация:
    25 июн 2009
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Процедура :
    Код:
    	//Создание объекта Word документ
    WordApp=СоздатьОбъект("Word.Application");
    NewDoc=WordApp.Documents;           
    //Открітие файла
    Док=NewDoc.Add(сокрЛП(ТабЗнач.Путь));
    //Заполнение текстового поля
    Док.FormFields("номер_документа").Result =СокрЛП(ТекЭлем.код); 
    Док.FormFields("текущая_дата").Result =СокрЛП(строка(ТекущаяДата())); 
    
    //Сохранение 
    НовоеИмя=  сред(сокрЛП(ТабЗнач.Путь),НайтиПосл(сокрЛП(ТабЗнач.Путь), "\")+1);
    НовоеИмя=СтрЗаменить(НовоеИмя,".","1.");
    Док.SaveAs(сокрЛП(КаталогИБ()+НовоеИмя),0); 
    //Выход
    Док.Application.Quit();  
    
    
    Заполняет конкретные закладки в документе "номер_документа" "текущая_дата", а как прочитать все существующие закладки в Worde и заполнить их.
    Например : определить количество закладок
    Код:
    КолЗакладок=Док.FormFields().dim;
    
    потом организовать цикл:

    Код:
    для инд=1 по колЗакладок цикл
    имяЗакладки= Док.FormFields(инд).имя;
    Док.FormFields(имяЗакладки).Result =НайтиЗначениеПоИмениЗакладки(имяЗакладки);
    конеццикла;
    
    
    Помогите пожалуйста!!!
  2. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Если интересно, стукни в личку.... еще в 2005 реализовывал подобный проект, но из-за массы ограничений в использовании закладок, пришлось от этого отказаться. Использовал простую возможность замены (та которая по CTRL+H).
  3. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Пример решения:
    Код:
    //W@-17.10.05---------------------------------------------
    //Печать()
    Процедура Печать()               
    Если ВидДоговора.Выбран() = 0 тогда
    Предупреждение("Не выбран вид договора!!!", 10);
    Возврат;
    КонецЕсли;    
    
    Если (ПустоеЗначение(ВидДоговора.КаталогДляСохранения) = 1) или
    (ПустоеЗначение(ВидДоговора.ИмяШаблона) = 1) тогда
    Предупреждение("Установите файл шаблона и папку созранения", 10);
    Возврат;
    КонецЕсли;    
    
    Если ПустоеЗначение(ДатаДоговора) = 1 тогда
    ДатаДоговора = РабочаяДата();
    КонецЕсли;
    ФтЧисло  = "Ч10";
    ФтПЧисло = "ЧП10";
    ФтДата   = "Д(0)DDMMYYYY";
    ФтПрДата   = "Д(0)DDMMMMYYYY";
    Закладки = СоздатьОбъект("СписокЗначений");   
    Закладки.УдалитьВсе();
    
    //Значения для организации
    Рук = СоздатьОбъект("Справочник.Сотрудники");
    Рук = Константа.Руководитель.Получить(ДатаДоговора).ТекущийЭлемент();
    Рук.ИспользоватьДату(ДатаДоговора);
    Пад = СоздатьОбъект("Справочник.Падежи");
    Пад.ИспользоватьВладельца(Рук);
    Пад.НайтиПоКоду("Р",1);        
    ФамРукР = СокрЛП(Пад.Наименование) + " " + Лев(Рук.Имя,1) + "." + Лев(Рук.Отчество,1) + ".";
    ФамРук = СокрЛП(Рук.Фамилия) + " " + Лев(Рук.Имя,1) + "." + Лев(Рук.Отчество,1) + ".";
    РС = СоздатьОбъект("Справочник.БанковскиеСчета");
    РС.ВыбратьЭлементы();
    Банк = СоздатьОбъект("Справочник.Банки");
    Банк = РС.БанкОрганизации.ТекущийЭлемент();
    Рекв = Шаблон("[Константа.НазваниеОрганизации], [Константа.АдресОрганизации], тел [Константа.ТелефоныОрганизации]. "
    + "Р/с [РС.Номер] в [Банк.Наименование], [Банк.Адрес], код [Банк.Код]. "
    + "УНП [Константа.УННОрганизации], ОКПО [Константа.КодОКПО].");
    //Значения для контрорганизации  
    Контр = СоздатьОбъект("Справочник.Контрагенты");
    Контр = Владелец.ТекущийЭлемент();
    Контр.ИспользоватьДату(ДатаДоговора);
    КонтрРС = СоздатьОбъект("Справочник.РасчетныеСчета");
    КонтрРС.ИспользоватьВладельца(Контр);
    КонтрРС.ВыбратьЭлементы();
    КонтрБанк = СоздатьОбъект("Справочник.Банки");
    КонтрБанк = РС.БанкОрганизации.ТекущийЭлемент();
    КонтрРекв = Шаблон("[Контр.ПолнНаименование], [Контр.ЮридическийАдрес], тел [Контр.Телефоны]. "
    + "Р/с [КонтрРС.Номер] в [КонтрБанк.Наименование], [КонтрБанк.Адрес], код [КонтрБанк.Код]. "
    + "УНП [Контр.УНН], ОКПО [Контр.ОКПО].");
    
    //Значения закладок документа
    Закладки.Установить("ДоговорНомер",          СокрЛП(Номер) + ?(НомерГод=1,"-"+ДатаГод(ДатаДоговора),""));
    Закладки.Установить("ДоговорДата",           Формат(ДатаДоговора,ФтДата));
    Закладки.Установить("ДоговорДатаПр",         Формат(ДатаДоговора,ФтПрДата));
    Закладки.Установить("СуммаНДС",              Формат(НДС,ФтЧисло));
    Закладки.Установить("СуммаНДСПр",            Формат(НДС,ФтПЧисло));
    Закладки.Установить("СуммаСНДС",             Формат(СуммаСНДС,ФтЧисло));
    Закладки.Установить("СуммаСНДСПр",           Формат(СуммаСНДС,ФтПЧисло));
    Закладки.Установить("Сумма",                 Формат(Сумма,ФтЧисло));
    Закладки.Установить("СуммаПр",               Формат(Сумма,ФтПЧисло)); 
    Закладки.Установить("ЦельПриобретения",      ЦельПриобретения.ПредставлениеВида());
    Закладки.Установить("ВТечение",              Формат(СрокВыполнения,ФтЧисло) + ОкончаниеР(СрокВыполнения));
    Закладки.Установить("ДатаПрейскуранта",      Константа.ДатаПрейскуранта);
    //данные об организации	
    Закладки.Установить("Организация",            Константа.НазваниеОрганизации);
    Закладки.Установить("ФИОРуководителя",        ФамРук);
    Закладки.Установить("ФИОРуководителяР",       ФамРукР);
    Закладки.Установить("ДолжностьРуководителя",  Рук.Должность);
    Закладки.Установить("ДолжностьРуководителяР", Рук.ДолжностьР);
    Закладки.Установить("НаОсновании",            Константа.НаОсновании.Получить(ДатаДоговора));
    Закладки.Установить("РеквизитыИсполнителя",   Рекв);
    //данные об контрагенте
    Закладки.Установить("КонтрОрганизация",            Контр.ПолнНаименование);
    Закладки.Установить("КонтрФИОРуководителя",        Контр.ФИОи);
    Закладки.Установить("КонтрФИОРуководителяР",       Контр.ФИОр);
    Закладки.Установить("КонтрДолжностьРуководителя",  Контр.ДолжностьИ);
    Закладки.Установить("КонтрДолжностьРуководителяР", Контр.ДолжностьР);
    Закладки.Установить("КонтрНаОсновании",            Контр.НаОсновании);
    Закладки.Установить("РеквизитыЗаказчика",          КонтрРекв);     
    //дополнительные данные  
    Доп = СоздатьОбъект("Справочник.ДопЗакладки");
    Доп.ИспользоватьВладельца(ТекущийЭлемент());
    Доп.ВыбратьЭлементы();
    Пока Доп.ПолучитьЭлемент() = 1 цикл
    Закладки.Установить(Доп.Наименование, Доп.Значение);
    КонецЦикла; //Пока ( Доп.ПолучитьЭлемент() = 1 )
    
    //Создание документа и заполнение закладок
    Попытка
    Кл =ЛЕВ(СтрЗаменить(Владелец.Наименование,Симв(34)," "),30);
    Дог=СокрП(ВидДоговора.КаталогДляСохранения)+"\"+СокрЛП(Номер)+"-"+ДатаГод(ДатаДоговора)+"_"+СокрЛП(Кл)+".doc";
    blank=СокрЛП(ВидДоговора.ИмяШаблона);
    Если ФС.СуществуетФайл(Дог)=1 Тогда
    Флаг=Вопрос("Файл договора уже существует! Переписать?",3);
    Если Флаг=6 Тогда	// Да
    ИначеЕсли Флаг=7 Тогда	// Нет
    Wd=СоздатьОбъект("Word.Application");
    Wd.Visible=1;
    wd.Documents.open(Дог); 
    Возврат;
    Иначе
    Возврат;
    КонецЕсли;
    КонецЕсли;
    
    ///////////////////////////////////////////
    Wd=СоздатьОбъект("Word.Application");    //
    Wd.Visible=1;                            //
    wd.Documents.open(blank);                //
    ActDoc=wd.ActiveDocument;                //
    ActDoc.saveas(Дог);                      //
    wd.Documents(Дог).activate();            //
    ActDoc=wd.ActiveDocument;                //
    ///////////////////////////////////////////
    
    //Замена всех закладок по документу
    Для ц = 1 по  Закладки.РазмерСписка() цикл         
    Закл = "";
    Значение = СокрЛП(Закладки.ПолучитьЗначение(ц,Закл));
    рез = findBkm(actdoc,wd,Закл,Значение);			
    Если рез = 1 тогда
    Вставлено = Вставлено + 1;
    ИначеЕсли Рез = -1 тогда
    Пропущено = Пропущено + 1;
    КонецЕсли;
    КонецЦикла;  //Для ц = 1 до Закладки.
    
    //Замена всех повторяющихся закладок 
    Если ВидДоговора.КолвоЦиклов > 0 тогда
    Для П = 1 по ВидДоговора.КолвоЦиклов цикл
    Для ц = 1 по  Закладки.РазмерСписка() цикл         
    Закл = "";
    Значение = СокрЛП(Закладки.ПолучитьЗначение(ц,Закл));
    Закл = Закл + Строка(П);
    Рез = findBkm(actdoc,wd,Закл,Значение);			
    Если рез = 1 тогда
    Вставлено = Вставлено + 1;
    ИначеЕсли Рез = -1 тогда
    Пропущено = Пропущено + 1;
    КонецЕсли;
    КонецЦикла;  //Для ц = 1 до Закладки.
    КонецЦикла;  //Для П			
    КонецЕсли;
    
    //Заполнение табличной части
    Спр = СоздатьОбъект("Справочник.ДанныеДоговора");
    Спр.ИспользоватьВладельца(ТекущийЭлемент());
    Спр.ВыбратьЭлементы();
    
    Если actdoc.Bookmarks.Exists("Таблица")<>0 тогда
    actdoc.Bookmarks("Таблица").select(); //переход на закладку в первой ячейке таблицы 
    actdoc.Bookmarks("Таблица").Delete();
    Пока Спр.ПолучитьЭлемент()=1 Цикл                              
    wd.selection.endof(); 
    wd.selection.insertrows(1);
    wd.selection.gotonext(5);
    
    wd.selection.insertafter(Спр.Код);                       //1 колонка
    wd.selection.next(1, 2).select(); // переход на следующую ячейку 
    wd.selection.insertafter(Спр.Номенклатура.Наименование); //2 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(Спр.Колво);	                 //3 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(Спр.Цена);                      //4 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(Формат(Спр.Цена * Спр.Колво,ФтЧисло));          //5 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(Спр.СтавкаНДС);                 //6 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(Формат(Спр.Цена * Спр.Колво * Спр.СтавкаНДС / 100,ФтЧисло));//7 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(Спр.СуммаСНДС);			     //8 колонка
    КонецЦикла;                               
    Если actdoc.Bookmarks.Exists("Итого")<>0 тогда
    actdoc.Bookmarks("Итого").select();
    actdoc.Bookmarks("Итого").Delete();
    wd.selection.Text = "";
    wd.selection.insertafter(Колво);	    //3 колонка
    wd.selection.next(1, 2).select(); 
    wd.selection.insertafter("Х");          //4 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(Сумма);        //5 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter("Х");          //6 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(НДС);			//7 колонка
    wd.selection.next(1, 1).select(); 
    wd.selection.insertafter(СуммаСНДС);	//8 колонка
    КонецЕсли
    КонецЕсли;
    wd.Selection.HomeKey(6);     
    ActDoc.saveas(Дог);
    Исключение  
    Предупреждение(ОписаниеОшибки());
    КонецПопытки;
    
    Если ВывестиРез = 1 тогда
    Сообщить ("Закладок вставлено: " + Вставлено, "i");
    Сообщить ("Закладок пропущено: " + Пропущено, "i");
    КонецЕсли;
    КонецПроцедуры//Печать()        
    
    
  4. TopicStarter Overlay
    ishimova
    Offline

    ishimova

    Регистрация:
    25 июн 2009
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Не, ты сначала создаешь СЗ.ЗАкладки из всех возможных закладок, и их значений
    Потом по циклу перебираешь каждое значение СЗ и вставляешь в документ
    А я незнаю какие закладки сделает юзер в своем документе. Мне надо прочитать все имеющиеся закладки в документе, а потом уже заполнить их. Как заполнить - я знаю.
    А как их прочитать???
  5. Бухгалтерский угодник
    Online

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Word.ActiveDocument.Bookmarks.Item(счетчик);

    счетчик - бесконечный цикл до возникновения ошиби
  6. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Действительно еще не все выложил :)
    Код:
    // W@-17.10.05------------------------------------------   
    // Поиск закладки в приложении "word", в документе "actdoc" 
    // с именем "NaimBkm". Если закладка найдена, текст закладки убирается,
    // на его место вставляется текст "InsText". Если текст закладки начинается
    // на "м", тогда текст выводится в нижнем регистре.
    // Возращаемый результат:
    //  1 - закладка найдена, текст вставлен
    //  0 - закладка не найдена
    // -1 - закладка найдена, но текст не вставлен
    Function findBkm(actdoc,word,NaimBkm,InsText)
    Рез = actdoc.Bookmarks.Exists(NaimBkm);      //Если "Рез = 0" - Закладка не найдена
    Если Рез <> 0 Тогда                          
    Если ПустоеЗначение(InsText) = 1 тогда   
    Возврат -1;                          //Закладка найдена, но текст не вставлен
    Иначе
    Рез = 1;                             //Закладка найдена, все в порядке
    КонецЕсли;
    actdoc.Bookmarks(NaimBkm).select();  
    actdoc.Bookmarks(NaimBkm).Delete();		
    фл = Лев(word.Selection.Text,1);
    Если фл = "м" тогда
    InsText = Нрег(InsText);
    КонецЕсли;
    word.Selection.Text = "";       
    word.Selection.InsertAfter (InsText);
    КонецЕсли;  
    Возврат Рез;
    КонецФункции
    
    
    Отсюда вывод: Открываем ворд, вводим "Bookmarks" и смотрим примеры его вызовов.
    Например
    или вот еще
    Этого должно с головой хватить.
  7. corvin-nik
    Offline

    corvin-nik

    Регистрация:
    2 фев 2010
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    А мне не хватит :unsure:

    Есть шаблон договора, как из него получить документ Word, выгрузив данные по нескольким работникам, при этом нужно не несколько документов договоров, а именно один документ, но с несколькими договорами по работникам.

    Помогите, пожалуйста.
  8. Бухгалтерский угодник
    Online

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Самое простое - скопируйте шаблон на следующую страницу и заполните заново
    Код:
    Selection.WholeStory
    Selection.Copy
    Selection.InsertBreak Type:=wdPageBreak
    Selection.PasteAndFormat (wdPasteDefault)
    
    
  9. corvin-nik
    Offline

    corvin-nik

    Регистрация:
    2 фев 2010
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    а что это за оператор? не могу нигде найти. может быть подскажите, где вообще можно почитать насчет работы 1С с MS Office?
    заранее благодарю!
  10. corvin-nik
    Offline

    corvin-nik

    Регистрация:
    2 фев 2010
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    И еще один вопрос, если позволите.
    Можно ли использовать шаблон Word для создания документа в 1С, и как это сделать, если возможность есть?
    То бишь есть шаблон, из которого обработчиком копируем строки, в заранее определенные места подставляем значения и формируем документ в 1С. Возможно ли так сделать?
  11. Бухгалтерский угодник
    Online

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    что за оператор? - макрос Word
    Можно ли использовать шабло для создания документа... Можно... но люди как правило подобные задачи выполняют для Excel
  12. Time dont wait
    Offline

    Time dont wait Опытный в 1С

    Регистрация:
    20 окт 2009
    Сообщения:
    192
    Симпатии:
    0
    Баллы:
    26
  13. EternallyYoung
    Offline

    EternallyYoung

    Регистрация:
    5 апр 2012
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    как из шаблона документа Word перебрать все закладки и, например, записать их (количество закладок заранее неизвестно, пользователь их кол-во меняет).
  14. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Пробуй так:
    Код:
    КоличествоЗакладок = actdoc.Bookmarks.Count;
    Для пц = 1 По КоличествоЗакладок Цикл
    Сообщить(actdoc.Bookmarks(пц).Name);
    КонецЦикла;
    

Поделиться этой страницей