Вход | Регистрация

1С:Предприятие ::

Метки:

1C и Word!!! Help

Я
   Alena
16.02.04 - 15:51
Надо из документа 1с открыть , к примеру, документ Word "заявление", где заранее есть некий текст и добавятся данные из 1с, к примеру, наименование клиента. Как это сделать?
 
 
   GrayT
 
1 - 16.02.04 - 15:55
Оле. Лучше если этот некий текст будет в поле ввода - искать проще будет. Делал обратную задачу из 1С печатал договора в Ворд
   Alena
2 - 16.02.04 - 16:01
это не обратная задача! Это то что надо! Я наверное плохо объяснила...
Я делаю через СоздатьОбъект(Word.Application) (синтаксис забыла, программка дома осталась). Создаю документ ворд, где вставляю поле с именем, а из 1с в это поле пытаюсь передать значение. Не выходит!
   GrayT
 
3 - 16.02.04 - 16:36
В документе ДоговорПодряда - проц Печать();
        сзОЛЕ = СоздатьОбъект("СписокЗначений");
        сзОЛЕ.ДобавитьЗначение("Договор подряда.dot", "Word");//Файл шаблон, ОЛЕ сервер

        
        сзОЛЕ.ДобавитьЗначение(Формат(ДатаДок,"Д(0)ДДММММГГГГ"),                  "ДатаДок");
        сзОЛЕ.ДобавитьЗначение(НомерДок ,                                         "НомерДок");
        сзОЛЕ.ДобавитьЗначение(?(ПустоеЗначение(Контрагент.ПолнНаименование)=0,
                                                Контрагент.ПолнНаименование,
                                                Контрагент.Наименование),         "Контрагент");
        сзОЛЕ.ДобавитьЗначение(Контрагент.ВЛице ,                                 "ВЛице");
        сзОЛЕ.ДобавитьЗначение(Контрагент.НаОсновании,                            "НаОсновании");
        сзОЛЕ.ДобавитьЗначение(ТипизированноеСодержание.ПолнНаименование ,        "Содержание1");
        сзОЛЕ.ДобавитьЗначение(ПроизвольноеСодержание,                            "Содержание2");
        сзОЛЕ.ДобавитьЗначение(Формат(ДатаАкта,"Д(0)ДДММММГГГГ"),                 "ДатаАкта");
        сзОЛЕ.ДобавитьЗначение(глСуммаПрописью(СуммаДоговора)  ,                  "СуммаДоговора");
        текКонтрагент = ?(ПустоеЗначение(Контрагент.ПолнНаименование)=0,
                                                Контрагент.ПолнНаименование,
                                                Контрагент.Наименование);
        сзОЛЕ.ДобавитьЗначение(текКонтрагент,                                    "КонтрагентСАдресом");
        ОткрытьФормуМодально("Обработка.ОЛЕ", сзОЛЕ);

//Модальность вроде для того чтоб Ворд на верху остался


Обработка приОткрытии()
    Перем Закладка, ТектВывода, сз;
    СтатусВозврата(0);
    сз = Форма.Параметр;
    ФайлШаблон = ""; ОЛЕ_Объект = "";
    Если ТипЗначенияСтр(сз)<>"СписокЗначений" Тогда
        Сообщить("Для формирования документа передайте подготовленный список значений", "!!!"); Возврат;
    ИначеЕсли сз.РазмерСписка()=0 Тогда
        Сообщить("Для формирования документа передайте подготовленный список значений", "!!!"); Возврат;
    Иначе
        ФайлШаблон = сз.ПолучитьЗначение(1, ОЛЕ_Объект);
        
        Если ВРег(ОЛЕ_Объект) <> "WORD" Тогда
            Сообщить("OLE объект "+ОЛЕ_Объект+" не поддерживается", "!!!"); Возврат;
        КонецЕсли; 
        
        Если ФС.СуществуетФайл(КаталогИБ()+"\Шаблоны\" + ФайлШаблон) = 0 Тогда
            Сообщить("Нет файла - шаблона " + ФайлШаблон, "!!!"); Возврат;
        КонецЕсли
            
    КонецЕсли;

    OLE = СоздатьОбъект(ОЛЕ_Объект+".Application");
       OLE.Documents.Add(""""+КаталогИБ()+"\Шаблоны\" + ФайлШаблон + """");
    Для Индекс = 2 по сз.РазмерСписка() цикл
        ТекстВывода = сз.ПолучитьЗначение(Индекс, Закладка);
       //Если OLE.ActiveDocument.Bookmarks(СокрЛП(Закладка)).Exists()=0 Тогда  // Проверяем - существует ли закладка

       //    Сообщить("Не найдена закладка "+Закладка,"!!!" ); Продолжить;

       //КонецЕсли;

        Попытка
            OLE.ActiveDocument.Bookmarks(СокрЛП(Закладка)).Select(); //выделим выбранную закладку

            OLE.Selection.TypeText(СокрЛП(ТекстВывода));             // выведем на место выделения текст

        Исключение
            Сообщить("Не найдена закладка "+Закладка,"!!!" );
        КонецПопытки;    
    КонецЦикла;

    OLE.Visible=1; /// видимость - True

    OLE.ActiveDocument.Activate();/// активизировать!!!

    OLE="";/// ссылочку прибить

--------------------------

Договор подряда.dot - Шаблон Ворд документа, в котором вставлены поля (ДатаДок, контрагент, В лице и т.д.)
   Шершень
 
4 - 16.02.04 - 17:38
(3) Нельзя ли проще? Если я так понял, то (0) имеет в вордовом файле "рыбу" типа:

........................................................
ЗАЯВЛЕНИЕ

Я, <имярек>, обязуюсь приходить на работу вовремя и не прогуливать.

........................................................

и вместо <имярек> нужно подставить из 1С конкретное ФИО, чтобы получился документ. Если так, то рулит метод Find объекта Range, вызываемый с настройкой на замену текста. Подробности интересуют?
   Bzzzzz
 
5 - 16.02.04 - 17:44
(4) Да,интересуют
   Шершень
 
6 - 16.02.04 - 18:36
(5) В (3) апшипся маленько: Find - это объект. Применительно к рыбе в (3):

Процедура Сформировать()
    Word = СоздатьОбъект("Word.Application");
    Word.Visible = 0;
    Word.Documents.Open("D:\Fish.doc",,-1); //путь, есс-но, свой

    Fnd = Word.ActiveDocument.Range().Find;
    Fnd.ClearFormatting();
    Fnd.Forward = -1;
    Fnd.Execute("<имярек>",,,,,,,,,"Иванов И.И",2);//9 запятых!

    Word.Visible = -1;    
    Word.Activate();//док. готов - можно печатать

КонецПроцедуры

вместо <имярек> будет подставлено Иванов И.И
Так замещаются и другие шаблоны подстановки.
   shura
 
7 - 16.02.04 - 19:19
Полу ОФФ: А вот я как-то посмотрел на rtf-овский док в ФАР-е по Ф3 и подумал: а если его открывать в 1С как текст и там производить замену (средствами 1С)? И безо всяких Оль. И, наверное, быстрее. Единственное, надо вместо буковок русских писать их коды...
Давно хотел это попробовать, но все осталось в стадии мыслЕй.
   romix
8 - 16.02.04 - 20:46
В ворде есть такая шняга, как макрорекордер (Макросы - Записать). Я включаю этот макрорекордер, потом начинаю делать всякие вещи (например, искать слово "ИмяРек" поиском по Ctrl-F). Рекордер создает макрос, из которого можно подчерпнуть нужные способы, как работать с объектом. То же в Excel.
   GrayT
 
9 - 16.02.04 - 21:22
(6) - можно короче. Тока я рвал кусок из рабочей проги, обработка печатает пофигу по какому шаблону - только успевай шаблоны рисовать. Из конфы печатается с десяток разных документов. Плюс всякие там проверки (наличие "рыб", файлов и т.д) . И коментарии. Если все это викинуть, то получиться короче. А на счет Find - не селен я в VBA. Спасибо что научил.
(7)А с ртф-ом идея интересная - надо будет попробовать


Список тем форума
Рекламное место пустует  
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует