{ВнешняяОбработка.*****.МодульОбъекта(25)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft Word): Слишком длинный строковый параметр.

```1c
    Замена.Execute("%ВодительАвтомобиль%", Ложь, Истина, Ложь, , , Истина, , Ложь, СтрЗаменить( СтрШаблон( "%1,
    |%2,
    |%3%4,
    |%5%6",
    тВодитель.ФИО,
    тВодитель.ПаспортныеДанные, // Тут ругается, тут если ввести много ошибка
    ?(ЕстьАвто, "Автомобиль: " + тВодитель.Автомобиль.МаркаАвтомобиля, "),
    ?(ЕстьАвто, ", гос. номер: " + тВодитель.Автомобиль.ГосНомер, "),
    ?(ЕстьПрицеп, "Прицеп: " + тВодитель.Автомобиль.Прицеп.МаркаАвтомобиля, "),
    ?(ЕстьПрицеп, ", гос. номер: " + тВодитель.Автомобиль.Прицеп.ГосНомер, ")
    )
    , Символы.ПС, "^1")
    );
```

Помогите исправить, в гугл выдаёт что нужно разбить , а как не понимаю.
---
```1c
    Данные - СтрЗаменить....
    ///**Лебедев**////////////////////////////////////////////////////////////­//////////////////////////////////////

    ДлинаСтроки = СтрДлина(Данные); //Высчитывает длину строки
    ТекущаяПозиция = 1; // Переменная позициии ( 1 символ )
    СтрокаПоиска = "%ВодительАвтомобиль%";

    Пока ТекущаяПозиция <= ДлинаСтроки Цикл // Делает проверку, если позиция меньше всей длины
    Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, Сред(Данные, ТекущаяПозиция, 235) + СтрокаПоиска); // Выводит на макет
    ТекущаяПозиция = ТекущаяПозиция + 235; // Прибавляет к текущий позиции 235 символов.
    КонецЦикла;

    Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "); // Задаёт пустую строку если нечем заполнять

    ///**Лебедев**////////////////////////////////////////////////////////////­////////////////////////////////////
```

Вот такое решение помогло
---
Перед заменой создай параметр
ааа = СтрЗаменить(....)
и его помести в
Замена.Execute(

Получиться
Замена.Execute("%ВодительАвтомобиль%", Ложь, Истина, Ложь, , , Истина, , Ложь, ааа, Символы.ПС, "^1")
---
Сделал, всё так же. как то говорят общее кол-во символов разбить на 255 ( вроде столько максимум ) с помощью цикла
---
Не используйте СтрШаблон.
Нафига он вам вообще нужен?
Сформируйте явно в отдельной переменной в коде строку:
мойШаблон = тВодитель.ФИО + "," + символы.ПС + тВодитель.ПаспортныеДанные + ...
---
че-то типа того

```1c
    Для Каждого Элемент из ЗначенияПараметров Цикл

    ЗначениеЭлемента = Строка(Элемент.Значение);
    Если СтрДлина(ЗначениеЭлемента) <= 255 Тогда
    Замена = Документ.Content.Find;
    Замена.Execute("<" + Элемент.Ключ + ">", Ложь, Истина, Ложь, , , Истина, , Ложь, ЗначениеЭлемента, 2);
    Иначе

    МассивЗначений = Новый Массив;

    Индекс = 0;
    НовыйКлюч = ";

    Пока ЗначениеЭлемента > " Цикл

    МассивЗначений.Добавить(Лев(ЗначениеЭлемента, 255));
    ЗначениеЭлемента = Сред(ЗначениеЭлемента, 256);

    НовыйКлюч = НовыйКлюч + "<" + Элемент.Ключ + Формат(Индекс, "ЧН=0; ЧГ=") + ">";

    Индекс = Индекс + 1;
    КонецЦикла;

    Замена = Документ.Content.Find;
    Замена.Execute("<" + Элемент.Ключ + ">", Ложь, Истина, Ложь, , , Истина, , Ложь, НовыйКлюч, 2);

    Для Индекс = 0 По МассивЗначений.ВГраница() Цикл
    Замена = Документ.Content.Find;
    Замена.Execute("<" + Элемент.Ключ + Формат(Индекс, "ЧН=0; ЧГ=") + ">",
    Ложь, Истина, Ложь, , , Истина, , Ложь,
    МассивЗначений[Индекс], 2);
    КонецЦикла;

    КонецЕсли;

    КонецЦикла;
```
---
```1c
    Данные - СтрЗаменить....
    ///**Лебедев**////////////////////////////////////////////////////////////­//////////////////////////////////////

    ДлинаСтроки = СтрДлина(Данные); //Высчитывает длину строки
    ТекущаяПозиция = 1; // Переменная позициии ( 1 символ )
    СтрокаПоиска = "%ВодительАвтомобиль%";

    Пока ТекущаяПозиция <= ДлинаСтроки Цикл // Делает проверку, если позиция меньше всей длины
    Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, Сред(Данные, ТекущаяПозиция, 235) + СтрокаПоиска); // Выводит на макет
    ТекущаяПозиция = ТекущаяПозиция + 235; // Прибавляет к текущий позиции 235 символов.
    КонецЦикла;

    Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "); // Задаёт пустую строку если нечем заполнять

    ///**Лебедев**////////////////////////////////////////////////////////////­////////////////////////////////////
```

Вот такое решение помогло
---
За решение спасибо, но для будущих посетителей переделал код в отдельную процедуру и немного отшлифовал.

```1c
    // Заменяет текст в документе частями, если длина больше 255 символов
    //
    // Параметры:
    // ТекущийДокументWORD - WORD документ - Объект документа WORD.
    // Замена - Результат Content.Find - Результат метода WORD документа "Content.Find;".
    // ЗаменяемыйТекст - Строка - Строка параметра в шаблоне WORD документа (например, "<Параметр>").
    // ЗамещающийТекст - Строка - Строка, на которую заменяем.
    //
    &НаКлиенте
    Процедура ЗаменитьТекстЧастями(ТекущийДокументWORD, Замена, Знач ЗаменяемыйТекст, Знач ЗамещающийТекст)

    ПределПоСимволам = 255; // Ограничение метода Execute
    ДлинаСтроки = СтрДлина(ЗамещающийТекст);
    // Если длина строки меньше ограничения, просто заменяем, иначе проводим замену по частям.
    Если ДлинаСтроки <= ПределПоСимволам Тогда
    Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, ЗамещающийТекст);
    Иначе
    ТекущаяПозиция = 1;
    ПределСУчетомЗамены = ПределПоСимволам - СтрДлина(ЗаменяемыйТекст);
    Пока ТекущаяПозиция <= ДлинаСтроки Цикл
    Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, Сред(ЗамещающийТекст, ТекущаяПозиция, ПределСУчетомЗамены) + ЗаменяемыйТекст);
    ТекущаяПозиция = ТекущаяПозиция + ПределСУчетомЗамены;
    КонецЦикла;
    Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, ");
    КонецЕсли;

    Замена = ТекущийДокументWORD.Content.Find;

    КонецПроцедуры
```
---
Это проще делается. Чтобы не было ошибки, объект Find используем только для поиска, а замену делаем методом TypeText
```1c
    ОбластьДокумента = ОбъектВорд.ActiveDocument.Content;
    ОбластьДокумента.Collapse(1);

    Поиск = ОбластьДокумента.Find;
    Поиск.Forward = True;
    Поиск.Text = ТекстПоиска;

    Пока Поиск.Execute() Цикл
    ОбластьДокумента.Select();
    ОбъектВорд.Selection.TypeText(ТекстЗамены);
    КонецЦикла;
```
---
Нет предела совершенству) Спасибо, попробую
---
Execute только до 255 символов. Закладки передают сколько угодно. Проверено на Lorem Ipsum

```1c
    Замена = Док.Content.Find;
    Замена.Execute(""Имущество"", Ложь, Истина, Ложь, , , Истина, , Ложь, Имущество);
    Имущество = Неопределено;
```

такой код не передаст.

```1c
    Док.Bookmarks(СокрЛП("Имущество")).Select();
    Док.Application.Selection.TypeText(Имущество);
```

Вот этот передает.
---
Док.Bookmarks(СокрЛП("Имущество")).Select(); Док.Application.Selection.TypeText(Имущество);
Спасибо огромное! Очень помогло!
---
с закладками свои тонкости... я на эти грабли понаступала не так давно... хочу предостеречь...)

Если в документе несколько закладок с одним именем, то все они вставятся в первую. Поэтому, у меня в документе закладки - Имущество1, Имущество2 и т.д.

И ещё, если копипастите документ при создании, то есть несколько раз заполняете форму одного документа и новую форму вставляете в конец первого, то закладка второго прикрепится к первой закладке. Надеюсь, что смогла мысль выразить))))
Эту неприятность я поборола сохранением всех печатаемых документов в одну папку, а потом пользователю открываю папку с этими документами.
---
Мысль понял, но таких сложностей у меня нет) Заполняю симметричную форму план-задания на альбомном листе и использовал закладки с окончаниями "-Лев" и "-Прав". А в целом идея с закладками прекрасна!!!
---
```1c
    Замена = MSWord.Application.Selection.Find;

    //Высчитывает длину строк
    ДлинаСтрокиЗамены = СтрДлина(ТекстЗамена);
    ДлиннаТекстаПоиска = СтрДлина(ТекстПоиск);
    ДлиннаВставляемойстроки = 255 - ДлиннаТекстаПоиска;

    // Делает проверку, если позиция меньше всей длины
    ТекущаяПозиция = 1;
    Пока ТекущаяПозиция <= ДлинаСтрокиЗамены Цикл

    // срока замены содержит часть "большой строки" + саму изначальную строку поиска
    СтрокаЗаменыВЦикле = Сред(ТекстЗамена, ТекущаяПозиция, ДлиннаВставляемойстроки) + СтрокаПоиска;

    // Выводим на макет
    Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, СтрокаЗаменыВЦикле);

    // Прибавляет к текущий позиции количество символов вставляемой строки.
    ТекущаяПозиция = ТекущаяПозиция + ДлиннаВставляемойстроки;
    КонецЦикла;

    // вся строка замены уже содержиться в макете
    // теперь удаляем саму строку поиска
    Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, ");
```
---
Тут на сайте есть статья о том что при формировании документов надо использовать метод замены текста. Типа это правильней, быстрее, удобнее, не глючит на большом количестве текста. Я согласен с тем что шаблоны выглядят удобней и ориентироваться в них проще. В остальном одни минусы быстрота работы и вот эта невозможность замены на длинные строки. Используйте переменные word.
За свою практику на документах в ~50 страниц ни разу не ловил глюков формирования. Добавляются через Втавка - Экспресс блоки - Поле - DocVariable Не забывайте "Doc.Fields.Update()" иначе переменные не обновятся.

```1c
    ОбъектПриложение = ПолучитьCOMОбъект("d:\0\тест.docx");

    ОбъектПриложение.Application.Visible = 0;
    WordApp = ОбъектПриложение.Application;

    Doc = ОбъектПриложение.Application.Documents(1);
    Doc.Activate();
    Doc.Variables("переменная1").Value = "Строка текста5";

    ОбъектПриложение.Application.Visible = 1;

    //Обновить документ
    Doc.Fields.Update();
```