Имя: Пароль:
1C
1C 7.7
v7: работа с word через ole
0 ksa-nsk
 
06.12.17
22:33
Всех приветствую. Надо найти в абзаце ворда слово, от него выделить до начала абзаца и заменить текст.
Слово нахожу, его выделяю, дальше затык, не могу передать параметры.
Если нажимать кнопками, контрол+шифт+стрелкаВверх,
в макросе: Selection.MoveUp Unit:=wdParagraph, :=1, Extend:=wdExtend

Word = СоздатьОбъект("Word.Application");
Word.Visible = 1;
Word.ActiveDocument.Select();
Word.Selection.Find.Text = "тест";
Если Word.Selection.Find.Execute() <> 0 Тогда
Word.Selection.ExtendMode = 1; // указываем на выделение текста
Word.Selection.MoveUp();  // сама команда
Иначе
    Предупреждение("ERROR> ", 2);
КонецЕсли;

Судя по макросу, параметр Extend:=wdExtend я вроде как указал, а вот как остальные (Unit и Count) - затык.
пробовал типа Word.Selection.MoveUp(1, 1, 1); тоже облом((

может, кто сталкивался, поделитесь. В интернете ничего не нашел(((
1 Скиурус
 
06.12.17
23:32
Не надо хренью страдать с селекшенами и файндами, надо как-то так:



КлючевоеСлово = "тест";
Ренж = Word.ActiveDocument.Content;
Для Каждого Абзац Из Ренж.Paragraphs
    й = 1;
    Пока й < Абзац.Range.Words.Count И СокрП(Абзац.Range.Words(й).Text) <> КлючевоеСлово
        й = й + 1;
    КонецЦикла;
        
    Текст = ""
    Для й = й + 1 По Абзац.Range.Words.Count
        Текст = Текст + Абзац.Range.Words(i).Text
    КонецЦикла;
        
    Если Текст <> "" Тогда
        Абзац.Range.Text = "Текст для замены " + Текст;
    КонецЕсли;
КонецЦикла;

2 ksa-nsk
 
07.12.17
07:42
Спасибо за подсказку, на семерку перложить не смог, решил простыми подменами, типа
    Fnd = Word.ActiveDocument.Range().Find;
    Fnd.ClearFormatting();
    Fnd.Forward = -1;
    Fnd.Execute("Устава",,,,,,,,   , СтрокаОснование,2);
3 Масянька
 
07.12.17
08:51
(2) А чем не страивает обычные параметры (в [], например) и их замена?
4 ksa-nsk
 
07.12.17
09:12
(2) прошу привести пример, только в варианте 1с ))
5 Масянька
 
07.12.17
09:13
(4) Договор - шаблон Word.
    // формируем файл
    мWord = СоздатьОбъект("Word.Application");

    мWord.Visible = 0;
    мNewDoc = мWord.Documents;
    мШаблон = СокрЛП(Строка(КаталогШаблонов + мШаблон));
    мДок = мNewDoc.Add(мШаблон, 0, 0, 1);  
    
    // верхний колонтитул
    мКолонтитул = мДок.Sections.Item(1).Headers.Item(1).Range;
    мКолонтитул.Find.Execute("[ПечНомерДоговора]", 0,0,,,,,,,мНомерДоговора,2);
    мКолонтитул.Find.Execute("[ПечДатаДоговора]",  0,0,,,,,,,Нрег(СокрЛП(мДатаДоговора)),2);
        
    мОбъект = мДок.Content;
    // подставляем значения по тексту договора - признак замены []
    мОбъект.Find.Execute("[ПечНомерДоговора]", 0, 0,,,,,,, мНомерДоговора,2);
    мОбъект.Find.Execute("[ПечДатаДоговора]",  0, 0,,,,,,, Нрег(СокрЛП(мДатаДоговора)),2);
    мОбъект.Find.Execute("[ПечПокупатель]",       0, 0,,,,,,, СокрЛП(мПокупатель),2);
    мОбъект.Find.Execute("[ПечРуководитель]",  0, 0,,,,,,, мПечОтветственноеЛицо,2);
    мОбъект.Find.Execute("[ПечОснование]",       0, 0,,,,,,, СокрЛП(мОснование),2);      
    мОбъект.Find.Execute("[УчетФЗ44]",           0, 0,,,,,,, СокрЛП(ПоФЗ44),2);      
Ну, и далее...
6 Масянька
 
07.12.17
09:14
+ (5) [ПечНомерДоговора] и пр. - это и есть параметры, которые заполняются.
7 ksa-nsk
 
07.12.17
09:45
(5) - примерно так и сделал, просто сначала хотел найти слово в абзаце, потом от этого слова к началу абзаца все выделить и другой текст воткнуть. На клавиатуре это легко - контрол+шифт+стрелкаВверх. В макросе ода строка))). Затык только в передаче параметров в команду MoveUp()
8 Масянька
 
07.12.17
09:47
(7) Ну, так сделай "от слова к началу абзаца" параметром и, в зависимости от условий (или чего там) - меняй.
9 ksa-nsk
 
07.12.17
10:00
(8) я ж говорю - там надо 3 параметра хитрозадо передать, нигде не нашел, как.
В общем ладно, проблему решил, но все же потом еще помучаю ворд, из спортивного интереса.

Всем спасибо за отзывчивость
10 Масянька
 
07.12.17
10:01
(9) Ну, опищи свои три параметра - что есть, на что заменить.
11 ksa-nsk
 
07.12.17
11:25
(10) хорошо, в 1м посте вроде указал:
макрос выглядит
Selection.MoveUp Unit:=wdParagraph, :=1, Extend:=wdExtend
т.е. первый параметр Unit, там типа по строке, по абзацу...
второй типа Count наверно, здесь =1, это количество
третий Extend - это указание что это выделение.

Selection.MoveUp(1, 1, 1) не проходит,
Selection.MoveUp(1, 0, 1) - со вторым нулем всегда возвращает ноль, т.е. что-то пытается сделать

Если перед этим сделать
Word.Selection.ExtendMode = 1; а потом
Selection.MoveUp();
то выделится вверх ровно одна строка, но не до начала абзаца, т.е. не передан параметр Unit

муторное это дело из 1с рулить вордом, зато если получится, настроение потом хорошее))
12 Масянька
 
07.12.17
11:34
(11) Ты не понял...
Опиши задачу: например, есть абзац "[ПечПокупатель], именуемый в дальнейшем Заказчик, в лице [ПечРуководитель], действующего на основании [ПечОснование], с одной стороны и Общество с ограниченной ответственностью «Моё», именуемый в дальнейшем Исполнитель, в лице директора Меня, действующего на основании Ус¬тава, с другой стороны [УчетФЗ44] заключили договор о нижеследующем:", где [УчетФЗ44] - нужно заполнить "в соответствии с....", если нужно.
Ну, примерно как-то так.
Вполне вероятно, что можно обойтись малой кровью.
13 ksa-nsk
 
07.12.17
11:51
(12) да в принципе подменами решил, как ты и предложил, просто хотел в код засунуть типа макроса, только через 1с. Одна строка - красиво и быстро.
А так я хотел типа в твоем примере найти, например, слово "Меня", выделить от начала абзаца до этого слова и вместо этого выделения воткнуть другой текст))). Слово нахожу, выделяю, а вот сделать а-ля контрол+шифт+СтрелкаВверх - фиг вам.
14 Масянька
 
07.12.17
11:56
(13) В примере("[ПечПокупатель], именуемый в дальнейшем Заказчик, в лице [ПечРуководитель], действующего на основании [ПечОснование], с одной стороны и Общество с ограниченной ответственностью «Моё», именуемый в дальнейшем Исполнитель, в лице директора Меня, действующего на основании Ус¬тава, с другой стороны [УчетФЗ44] заключили договор о нижеследующем:") меняешь "[ЗаменаКускаАбзаца], действующего на основании Ус¬тава, с другой стороны [УчетФЗ44] заключили договор о нижеследующем:", в коде:
если меняем то [ЗаменаКускаАбзаца] = ПечПокупатель + ", именуемый в дальнейшем Заказчик, в лице " + ПечРуководитель" + ", действующего на основании " + ПечОснование + ", с одной стороны и Общество с ограниченной ответственностью «Моё», именуемый в дальнейшем Исполнитель, в лице директора Меня".
15 dk
 
07.12.17
12:06
Закладки рулят
Find.Execute - в топку
16 ksa-nsk
 
07.12.17
12:13
О! допинал))), мало ли, кому сгодится
        Word.ActiveDocument.Select();
        Word.Selection.Find.Text = СловоВхода;
        Если Word.Selection.Find.Execute() <> 0 Тогда  // нашли
            Word.Selection.ExtendMode = 1;
            Word.Selection.MoveUp(4);
ну и далее замена...
парметр нашел на http://scriptcoding.ru/2013/12/30/word-vba-selection-metody-1/