Ошибка при вызове метода контекста (Execute): Слишком длинный строковый параметр.
{ВнешняяОбработка.*****.МодульОбъекта(25)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft Word): Слишком длинный строковый параметр.
Замена.Execute("%ВодительАвтомобиль%", Ложь, Истина, Ложь, , , Истина, , Ложь, СтрЗаменить( СтрШаблон( "%1,
|%2,
|%3%4,
|%5%6",
тВодитель.ФИО,
тВодитель.ПаспортныеДанные, // Тут ругается, тут если ввести много ошибка
?(ЕстьАвто, "Автомобиль: " + тВодитель.Автомобиль.МаркаАвтомобиля, ""),
?(ЕстьАвто, ", гос. номер: " + тВодитель.Автомобиль.ГосНомер, ""),
?(ЕстьПрицеп, "Прицеп: " + тВодитель.Автомобиль.Прицеп.МаркаАвтомобиля, ""),
?(ЕстьПрицеп, ", гос. номер: " + тВодитель.Автомобиль.Прицеп.ГосНомер, "")
)
, Символы.ПС, "^1")
);
ПоказатьПомогите исправить, в гугл выдаёт что нужно разбить , а как не понимаю.
Найденные решения
Данные - СтрЗаменить....
///**Лебедев**//////////////////////////////////////////////////////////// //////////////////////////////////////
ДлинаСтроки = СтрДлина(Данные); //Высчитывает длину строки
ТекущаяПозиция = 1; // Переменная позициии ( 1 символ )
СтрокаПоиска = "%ВодительАвтомобиль%";
Пока ТекущаяПозиция <= ДлинаСтроки Цикл // Делает проверку, если позиция меньше всей длины
Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, Сред(Данные, ТекущаяПозиция, 235) + СтрокаПоиска); // Выводит на макет
ТекущаяПозиция = ТекущаяПозиция + 235; // Прибавляет к текущий позиции 235 символов.
КонецЦикла;
Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, ""); // Задаёт пустую строку если нечем заполнять
///**Лебедев**//////////////////////////////////////////////////////////// ////////////////////////////////////
ПоказатьВот такое решение помогло
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
че-то типа того
Для Каждого Элемент из ЗначенияПараметров Цикл
ЗначениеЭлемента = Строка(Элемент.Значение);
Если СтрДлина(ЗначениеЭлемента) <= 255 Тогда
Замена = Документ.Content.Find;
Замена.Execute("<" + Элемент.Ключ + ">", Ложь, Истина, Ложь, , , Истина, , Ложь, ЗначениеЭлемента, 2);
Иначе
МассивЗначений = Новый Массив;
Индекс = 0;
НовыйКлюч = "";
Пока ЗначениеЭлемента > "" Цикл
МассивЗначений.Добавить(Лев(ЗначениеЭлемента, 255));
ЗначениеЭлемента = Сред(ЗначениеЭлемента, 256);
НовыйКлюч = НовыйКлюч + "<" + Элемент.Ключ + Формат(Индекс, "ЧН=0; ЧГ=") + ">";
Индекс = Индекс + 1;
КонецЦикла;
Замена = Документ.Content.Find;
Замена.Execute("<" + Элемент.Ключ + ">", Ложь, Истина, Ложь, , , Истина, , Ложь, НовыйКлюч, 2);
Для Индекс = 0 По МассивЗначений.ВГраница() Цикл
Замена = Документ.Content.Find;
Замена.Execute("<" + Элемент.Ключ + Формат(Индекс, "ЧН=0; ЧГ=") + ">",
Ложь, Истина, Ложь, , , Истина, , Ложь,
МассивЗначений[Индекс], 2);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Показать
Данные - СтрЗаменить....
///**Лебедев**//////////////////////////////////////////////////////////// //////////////////////////////////////
ДлинаСтроки = СтрДлина(Данные); //Высчитывает длину строки
ТекущаяПозиция = 1; // Переменная позициии ( 1 символ )
СтрокаПоиска = "%ВодительАвтомобиль%";
Пока ТекущаяПозиция <= ДлинаСтроки Цикл // Делает проверку, если позиция меньше всей длины
Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, Сред(Данные, ТекущаяПозиция, 235) + СтрокаПоиска); // Выводит на макет
ТекущаяПозиция = ТекущаяПозиция + 235; // Прибавляет к текущий позиции 235 символов.
КонецЦикла;
Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, ""); // Задаёт пустую строку если нечем заполнять
///**Лебедев**//////////////////////////////////////////////////////////// ////////////////////////////////////
ПоказатьВот такое решение помогло
(6) За решение спасибо, но для будущих посетителей переделал код в отдельную процедуру и немного отшлифовал.
// Заменяет текст в документе частями, если длина больше 255 символов
//
// Параметры:
// ТекущийДокументWORD - WORD документ - Объект документа WORD.
// Замена - Результат Content.Find - Результат метода WORD документа "Content.Find;".
// ЗаменяемыйТекст - Строка - Строка параметра в шаблоне WORD документа (например, "<Параметр>").
// ЗамещающийТекст - Строка - Строка, на которую заменяем.
//
&НаКлиенте
Процедура ЗаменитьТекстЧастями(ТекущийДокументWORD, Замена, Знач ЗаменяемыйТекст, Знач ЗамещающийТекст)
ПределПоСимволам = 255; // Ограничение метода Execute
ДлинаСтроки = СтрДлина(ЗамещающийТекст);
// Если длина строки меньше ограничения, просто заменяем, иначе проводим замену по частям.
Если ДлинаСтроки <= ПределПоСимволам Тогда
Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, ЗамещающийТекст);
Иначе
ТекущаяПозиция = 1;
ПределСУчетомЗамены = ПределПоСимволам - СтрДлина(ЗаменяемыйТекст);
Пока ТекущаяПозиция <= ДлинаСтроки Цикл
Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, Сред(ЗамещающийТекст, ТекущаяПозиция, ПределСУчетомЗамены) + ЗаменяемыйТекст);
ТекущаяПозиция = ТекущаяПозиция + ПределСУчетомЗамены;
КонецЦикла;
Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, "");
КонецЕсли;
Замена = ТекущийДокументWORD.Content.Find;
КонецПроцедуры
Показать
(12) Это проще делается. Чтобы не было ошибки, объект Find используем только для поиска, а замену делаем методом TypeText
ОбластьДокумента = ОбъектВорд.ActiveDocument.Content;
ОбластьДокумента.Collapse(1);
Поиск = ОбластьДокумента.Find;
Поиск.Forward = True;
Поиск.Text = ТекстПоиска;
Пока Поиск.Execute() Цикл
ОбластьДокумента.Select();
ОбъектВорд.Selection.TypeText(ТекстЗамены);
КонецЦикла;
Показать
Execute только до 255 символов. Закладки передают сколько угодно. Проверено на Lorem Ipsum
такой код не передаст.
Вот этот передает.
Замена = Док.Content.Find;
Замена.Execute("""Имущество""", Ложь, Истина, Ложь, , , Истина, , Ложь, Имущество);
Имущество = Неопределено;
такой код не передаст.
Док.Bookmarks(СокрЛП("Имущество")).Select();
Док.Application.Selection.TypeText(Имущество);
Вот этот передает.
(8) с закладками свои тонкости... я на эти грабли понаступала не так давно... хочу предостеречь...)
Если в документе несколько закладок с одним именем, то все они вставятся в первую. Поэтому, у меня в документе закладки - Имущество1, Имущество2 и т.д.
И ещё, если копипастите документ при создании, то есть несколько раз заполняете форму одного документа и новую форму вставляете в конец первого, то закладка второго прикрепится к первой закладке. Надеюсь, что смогла мысль выразить))))
Эту неприятность я поборола сохранением всех печатаемых документов в одну папку, а потом пользователю открываю папку с этими документами.
Если в документе несколько закладок с одним именем, то все они вставятся в первую. Поэтому, у меня в документе закладки - Имущество1, Имущество2 и т.д.
И ещё, если копипастите документ при создании, то есть несколько раз заполняете форму одного документа и новую форму вставляете в конец первого, то закладка второго прикрепится к первой закладке. Надеюсь, что смогла мысль выразить))))
Эту неприятность я поборола сохранением всех печатаемых документов в одну папку, а потом пользователю открываю папку с этими документами.
Замена = MSWord.Application.Selection.Find;
//Высчитывает длину строк
ДлинаСтрокиЗамены = СтрДлина(ТекстЗамена);
ДлиннаТекстаПоиска = СтрДлина(ТекстПоиск);
ДлиннаВставляемойстроки = 255 - ДлиннаТекстаПоиска;
// Делает проверку, если позиция меньше всей длины
ТекущаяПозиция = 1;
Пока ТекущаяПозиция <= ДлинаСтрокиЗамены Цикл
// срока замены содержит часть "большой строки" + саму изначальную строку поиска
СтрокаЗаменыВЦикле = Сред(ТекстЗамена, ТекущаяПозиция, ДлиннаВставляемойстроки) + СтрокаПоиска;
// Выводим на макет
Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, СтрокаЗаменыВЦикле);
// Прибавляет к текущий позиции количество символов вставляемой строки.
ТекущаяПозиция = ТекущаяПозиция + ДлиннаВставляемойстроки;
КонецЦикла;
// вся строка замены уже содержиться в макете
// теперь удаляем саму строку поиска
Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "");
Показать
Тут на сайте есть статья о том что при формировании документов надо использовать метод замены текста. Типа это правильней, быстрее, удобнее, не глючит на большом количестве текста. Я согласен с тем что шаблоны выглядят удобней и ориентироваться в них проще. В остальном одни минусы быстрота работы и вот эта невозможность замены на длинные строки. Используйте переменные word.
За свою практику на документах в ~50 страниц ни разу не ловил глюков формирования. Добавляются через Втавка - Экспресс блоки - Поле - DocVariable Не забывайте "Doc.Fields.Update()" иначе переменные не обновятся.
За свою практику на документах в ~50 страниц ни разу не ловил глюков формирования. Добавляются через Втавка - Экспресс блоки - Поле - DocVariable Не забывайте "Doc.Fields.Update()" иначе переменные не обновятся.
ОбъектПриложение = Получить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();
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот