Имя: Пароль:
1C
1C 7.7
v7: Заполнение документа Word из 1С 7.7
,
0 zenon46
 
19.03.21
16:18
Доброго дня! Не могу побороть проблемку, пытаюсь реализовать заполнение документа Word из 1С 7.7, создал документ, добавил туда закладку https://prnt.sc/10pyx50.
В СЗ добавил необходимый параметр и его значение. Далее вот такой код, перебирает СЗ и ищет в документе закладки и ПО ИДЕЕ должен заменить закладку на значение, а получается что вставляется значение и закладка сдвигается https://prnt.sc/10pyznq. Что я делаю не так ?

    // Формируем договор
    Word.Documents.Add(пШаблон);
    Документ = Word.ActiveDocument;
    
    // Заменяем параметры
    КоличествоПараметров = пПараметры.РазмерСписка();
    Для Счетчик = 1 По КоличествоПараметров Цикл
        СтрЗамены = пПараметры.ПолучитьЗначение(Счетчик,СтрПоиска);
        Попытка
            Документ.Bookmarks(СтрПоиска).Select();
            Документ.Application.Selection.TypeText(СтрЗамены);                
        Исключение    
            Сообщить("Не найдена закладка " + СтрПоиска);
        КонецПопытки;
    КонецЦикла;
1 Злопчинский
 
19.03.21
16:25
я делл проще. без всяких закладок. просто фнкцией найти и заменить. а в тектсе договора писал
тралалая %ФИО%
2 zenon46
 
19.03.21
16:33
(1) есть пример ?
3 Масянька
 
19.03.21
16:34
(1) Поддерживаю предыдущего оратора.
В тексте Word нужные параметры отделяются - [Параметр] (например). И поиском меняются на нужные.
4 Масянька
 
19.03.21
16:35
(2) мWord = СоздатьОбъект("Word.Application");

мWord.Visible = 0;

мNewDoc = мWord.Documents;

мДок = мNewDoc.Add("D:\1С\БД клиентов\КС\1Сv7\Db\Договора\Шаблоны\Типовой_КуплиПродажи_1.dot", 0, 0, 1);  

мОбъект = мДок.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);
5 zenon46
 
19.03.21
16:37
(4) выходит обязательно иметь dot, получается.
6 Kigo_Kigo
 
19.03.21
16:39
(5) не, не обязательно, но работать не будет :)))))
7 Масянька
 
19.03.21
16:40
(5) А как собираетесь сохранять?
8 zenon46
 
19.03.21
16:52
Сделал так, без dot файла. Вроде работает.
    // Инициализация Microsoft Word
    Попытка
        WordApp=СоздатьОбъект("Word.Application");
        NewDoc=WordApp.Documents;
    Исключение
        Сообщить("Не удалось установить связь с Microsoft Word !!!");
        Возврат;
    КонецПопытки;    
    
    Док=NewDoc.Add(пШаблон);
    
    //Заполнение текстового поля
    Fnd = WordApp.ActiveDocument.Range().Find;
    Fnd.ClearFormatting();
    Fnd.Forward = -1;    
    
    // Заменяем параметры
    КоличествоПараметров = пПараметры.РазмерСписка();
    Для Счетчик = 1 По КоличествоПараметров Цикл
        СтрЗамены = пПараметры.ПолучитьЗначение(Счетчик,СтрПоиска);
        Попытка
            Fnd.Execute("["+СтрПоиска+"]",,,,,,,,,СтрЗамены,2);
        Исключение    
            Сообщить("Не найдена закладка " + СтрПоиска);
        КонецПопытки;
    КонецЦикла;
    
    // Показываем договор
    WordApp.Visible = 1;
    WordApp.Activate();
9 Злопчинский
 
19.03.21
17:03
(8) а при чем здесь dot
обычный файл с обычным текстом
открыл заменой заменил, записал куда надо.
10 Масянька
 
19.03.21
17:07
(8) (9) У меня задача была - договора. Создание, хранение.
Есесьно, шаблон договора, а заполнение и хранение - файл.
11 Злопчинский
 
19.03.21
19:09
(10) ну, простой вордовский обычный _доковский_ файл. где тексте стоит последовательность символов %НОМЕРДОГОВОРА% - это faqk играет роль шаблона. из 1Сины открыли, командами поиска и замены макровордовскими заменили строку %НОМЕРДОК% на нужный номер и сохранили под именем нужным (контрагента, номера договора итд). Без всяких dot шаблонов и закладок. я делал так, тупо и примитивно. вроде работало.
12 tgu82
 
19.03.21
19:10
(9,10) Ну так и есть. Там же "поле" есть. Пишешь в нем имяполя и потом через ОЛЕ из 1С его подставляешь. Сначала делаешь шаблонный файл для все уже есть только вместо значения Поля а потом из 1С присваиваешь значения этим полям и все сохраняешь готовый документ. Я так и делал в договорах при приеме на работу: сотрудники руководитель должность и т.д.
13 alyuev
 
23.03.21
16:43
Я делал так:

Книга.Bookmarks(ИмяЗакладки).Range().Text=ТекстЗакладки
14 alyuev
 
23.03.21
16:46
А текст заменял через

Финд = Word.Selection.Find

и далее

Финд.Execute(ИмяПерем,,,,,,,,,ВсеЧасти,2);


но там заморочка с длинными строками более 255 символов. Приходилось резать по кусочкам.