Ошибка при вызове метода контекста (Execute): Слишком длинный строковый параметр.

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




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

Показать



Помогите исправить, в гугл выдаёт что нужно разбить , а как не понимаю.
Найденные решения
6. iCortezik 8 27.09.18 08:56 Сейчас в теме

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


Показать


Вот такое решение помогло
bashirov.rs; MrEvilSkotch; user1987222; Bespechnii_kot; VKuser2513456; MarMargo; additive; Darkoder; +8 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Timur.V 81 26.09.18 15:03 Сейчас в теме
Перед заменой создай параметр
ааа = СтрЗаменить(....)
и его помести в
Замена.Execute(

Получиться
Замена.Execute("%ВодительАвтомобиль%", Ложь, Истина, Ложь, , , Истина, , Ложь, ааа, Символы.ПС, "^1")
3. iCortezik 8 26.09.18 15:10 Сейчас в теме
(2) Сделал, всё так же. как то говорят общее кол-во символов разбить на 255 ( вроде столько максимум ) с помощью цикла
4. Sashares 33 26.09.18 15:31 Сейчас в теме
Не используйте СтрШаблон.
Нафига он вам вообще нужен?
Сформируйте явно в отдельной переменной в коде строку:
мойШаблон = тВодитель.ФИО + "," + символы.ПС + тВодитель.ПаспортныеДанные + ...
5. singlych 26.09.18 16:00 Сейчас в теме
че-то типа того

Для Каждого Элемент из ЗначенияПараметров Цикл
	
	ЗначениеЭлемента = Строка(Элемент.Значение);
	Если СтрДлина(ЗначениеЭлемента) <= 255 Тогда
		Замена = Документ.Content.Find;
		Замена.Execute("<" + Элемент.Ключ + ">", Ложь, Истина, Ложь, , , Истина, , Ложь, ЗначениеЭлемента, 2);
	Иначе
		
		МассивЗначений = Новый Массив;
		
		Индекс = 0;
		НовыйКлюч = "";
		
		Пока ЗначениеЭлемента > "" Цикл
			
			МассивЗначений.Добавить(Лев(ЗначениеЭлемента, 255));
			ЗначениеЭлемента = Сред(ЗначениеЭлемента, 256);
			
			НовыйКлюч = НовыйКлюч + "<" + Элемент.Ключ + Формат(Индекс, "ЧН=0; ЧГ=") + ">";
			
			Индекс = Индекс + 1;
		КонецЦикла;
		
		Замена = Документ.Content.Find;
		Замена.Execute("<" + Элемент.Ключ + ">", Ложь, Истина, Ложь, , , Истина, , Ложь, НовыйКлюч, 2);
		
		Для Индекс = 0 По МассивЗначений.ВГраница() Цикл
			Замена = Документ.Content.Find;
			Замена.Execute("<" + Элемент.Ключ + Формат(Индекс, "ЧН=0; ЧГ=") + ">",
				Ложь, Истина, Ложь, , , Истина, , Ложь,
				МассивЗначений[Индекс], 2);
		КонецЦикла;
		
	КонецЕсли;
	
КонецЦикла;
Показать
6. iCortezik 8 27.09.18 08:56 Сейчас в теме

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


Показать


Вот такое решение помогло
bashirov.rs; MrEvilSkotch; user1987222; Bespechnii_kot; VKuser2513456; MarMargo; additive; Darkoder; +8 Ответить
12. MrEvilSkotch 03.04.24 16:01 Сейчас в теме
(6) За решение спасибо, но для будущих посетителей переделал код в отдельную процедуру и немного отшлифовал.
// Заменяет текст в документе частями, если длина больше 255 символов
//
// Параметры:
//  ТекущийДокументWORD  - WORD документ - Объект документа WORD.
//  Замена  - Результат Content.Find - Результат метода WORD документа "Content.Find;".
//  ЗаменяемыйТекст  - Строка - Строка параметра в шаблоне WORD документа (например, "<Параметр>").
//  ЗамещающийТекст  - Строка - Строка, на которую заменяем.
//
&НаКлиенте
Процедура ЗаменитьТекстЧастями(ТекущийДокументWORD, Замена, Знач ЗаменяемыйТекст, Знач ЗамещающийТекст)
	
	ПределПоСимволам = 255; // Ограничение метода Execute
	ДлинаСтроки = СтрДлина(ЗамещающийТекст);
	// Если длина строки меньше ограничения, просто заменяем, иначе проводим замену по частям.
	Если ДлинаСтроки <= ПределПоСимволам Тогда
		Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, ЗамещающийТекст);		
	Иначе
		ТекущаяПозиция = 1;
		ПределСУчетомЗамены = ПределПоСимволам - СтрДлина(ЗаменяемыйТекст);
		Пока ТекущаяПозиция <= ДлинаСтроки Цикл
			Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, Сред(ЗамещающийТекст, ТекущаяПозиция, ПределСУчетомЗамены) + ЗаменяемыйТекст);
			ТекущаяПозиция = ТекущаяПозиция + ПределСУчетомЗамены;
		КонецЦикла;
		Замена.Execute(ЗаменяемыйТекст, Ложь, Истина, Ложь,,, Истина,, Ложь, "");
	КонецЕсли;
	
	Замена = ТекущийДокументWORD.Content.Find;

КонецПроцедуры
Показать
iCortezik; +1 Ответить
13. SlavaKron 03.04.24 18:01 Сейчас в теме
(12) Это проще делается. Чтобы не было ошибки, объект Find используем только для поиска, а замену делаем методом TypeText
ОбластьДокумента = ОбъектВорд.ActiveDocument.Content;
ОбластьДокумента.Collapse(1);

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

Пока Поиск.Execute() Цикл
	ОбластьДокумента.Select();
	ОбъектВорд.Selection.TypeText(ТекстЗамены);
КонецЦикла;
Показать
14. MrEvilSkotch 03.04.24 21:42 Сейчас в теме
(13) Нет предела совершенству) Спасибо, попробую
7. Yulka_Pentagramma 16.10.19 22:01 Сейчас в теме
Execute только до 255 символов. Закладки передают сколько угодно. Проверено на Lorem Ipsum

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

такой код не передаст.
					Док.Bookmarks(СокрЛП("Имущество")).Select();
					Док.Application.Selection.TypeText(Имущество);


Вот этот передает.
user1088651; Amara; hydra88; +3 Ответить
8. hydra88 28.02.20 10:32 Сейчас в теме
(7)
Док.Bookmarks(СокрЛП("Имущество")).Select(); Док.Application.Selection.TypeText(Имущество);

Спасибо огромное! Очень помогло!
9. Yulka_Pentagramma 28.02.20 12:15 Сейчас в теме
(8) с закладками свои тонкости... я на эти грабли понаступала не так давно... хочу предостеречь...)

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

И ещё, если копипастите документ при создании, то есть несколько раз заполняете форму одного документа и новую форму вставляете в конец первого, то закладка второго прикрепится к первой закладке. Надеюсь, что смогла мысль выразить))))
Эту неприятность я поборола сохранением всех печатаемых документов в одну папку, а потом пользователю открываю папку с этими документами.
10. hydra88 03.03.20 06:24 Сейчас в теме
(9)Мысль понял, но таких сложностей у меня нет) Заполняю симметричную форму план-задания на альбомном листе и использовал закладки с окончаниями "-Лев" и "-Прав". А в целом идея с закладками прекрасна!!!
11. VKuser2513456 10.08.23 09:47 Сейчас в теме
Замена = MSWord.Application.Selection.Find;

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

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

// вся строка замены уже содержиться в макете
// теперь удаляем саму строку поиска
Замена.Execute(СтрокаПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, ""); 
Показать
user1626759; +1 Ответить
15. jollyk 24.12.24 18:35 Сейчас в теме
Тут на сайте есть статья о том что при формировании документов надо использовать метод замены текста. Типа это правильней, быстрее, удобнее, не глючит на большом количестве текста. Я согласен с тем что шаблоны выглядят удобней и ориентироваться в них проще. В остальном одни минусы быстрота работы и вот эта невозможность замены на длинные строки. Используйте переменные word.
За свою практику на документах в ~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();
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот