Имя: Пароль:
1C
 
Ошибка при выводе печатной формы в формате word: Слишком длинный строковый параметр 1с
, ,
0 Natali15
 
24.05.22
15:54
Есть таблица товаров в счете покупателя, ее нужно вывести в строку через запятую, код написала такого вида:
Запрос1 = Новый Запрос("
        |ВЫБРАТЬ
        |    СчетНаОплатуПокупателюТовары.Ссылка КАК Ссылка,
        |    СчетНаОплатуПокупателюТовары.Номенклатура КАК Номенклатура,
        |    СчетНаОплатуПокупателюТовары.Номенклатура КАК НоменклатураНаименование
        |ИЗ
        |    Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары
        |ГДЕ
        |    СчетНаОплатуПокупателюТовары.Ссылка = &Ссылка");

        Запрос1.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
        РезультатЗапроса = Запрос1.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        НаименованиеТоваров = Новый Массив;
        Пока Выборка.Следующий() Цикл
            НаименованиеТоваров.Добавить(Выборка.НоменклатураНаименование);
            СтрокаИзМассива = СтрСоединить(НаименованиеТоваров, ", ");
        КонецЦикла;
        
        Replace = Doc.Content.Find;        
        Структура.Вставить("FindText", "{НаименованиеТоваров}");
            Replace.Execute(Структура.FindText,,,,,,,,,СтрокаИзМассива);

Ошибка происходит на последней строчке если много товаров в таблице, в предприятии выдает "Слишком длинный строковый параметр 1с", как можно решить эту проблему?
1 PLUT
 
24.05.22
16:03
(0) искать по частям. это фича

с3.14жжено откуда-то из тырнета

//костыль: (Microsoft Word): String parameter too long
    ДлинаСтроки = СтрДлина(ТекстЗамены); //Высчитывает длину строки
    ТекущаяПозиция = 1; // Переменная позициии ( 1 символ )
    
    Пока ТекущаяПозиция <= ДлинаСтроки Цикл // Делает проверку, если позиция меньше всей длины            
    
        Замена.Execute(    КлючПоиска, //строка поиска
                        Ложь,       //учитывать регистр
                        Истина,     //только слово целиком
                        Ложь,       //если искомый текст является особым оператором поиска
                        Ложь,       //для поиска слов, которые похожи на поиск текста
                        Ложь,       //чтобы операция поиска обнаружила все формы искомого текста
                        Истина,     //для поиска вперед
                        ,           //Определяет, что происходит, если поиск начинается с точки, отличной от начала документа, и достигнут конец документа
                        Ложь,
                        Сред(ТекстЗамены, ТекущаяПозиция, 235) + КлючПоиска //Замещающий текст
                    );
        
        ТекущаяПозиция = ТекущаяПозиция + 235; // Прибавляет к текущий позиции 235 символов.    
        
    КонецЦикла;
    Замена.Execute(КлючПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "");
2 PLUT
 
24.05.22
16:06
(1) вернее "вставлять" по частям
3 PLUT
 
24.05.22
16:11
+(1) в вашем случае

КлючПоиска = "{НаименованиеТоваров}";
4 Natali15
 
24.05.22
16:33
(3) Да, видела этот код, но не понимаю, где именно мне нужно его применить, после цикла?
5 PLUT
 
24.05.22
16:34
(4) вот этот код творчески заменить на магию из (1)

Replace = Doc.Content.Find;        
        Структура.Вставить("FindText", "{НаименованиеТоваров}");
            Replace.Execute(Структура.FindText,,,,,,,,,СтрокаИзМассива);
6 Natali15
 
24.05.22
16:34
(5) спасибо, сейчас попробую
7 PLUT
 
24.05.22
16:38
(6) адаптированный г.внокод для (5)

//костыль: (Microsoft Word): String parameter too long

    КлючПоиска = "{НаименованиеТоваров}";
    
    ТекстЗамены = СтрокаИзМассива;
    
    Replace = Doc.Content.Find;
    Replace.ClearFormatting();

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

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

    
        Replace.Execute(    КлючПоиска,//строка поиска

                        Ложь,      //учитывать регистр

                        Истина,    //только слово целиком

                        Ложь,      //если искомый текст является особым оператором поиска

                        Ложь,      //для поиска слов, которые похожи на поиск текста

                        Ложь,      //чтобы операция поиска обнаружила все формы искомого текста

                        Истина,    //для поиска вперед

                        ,          //Определяет, что происходит, если поиск начинается с точки, отличной от начала документа, и достигнут конец документа

                        Ложь,
                        Сред(ТекстЗамены, ТекущаяПозиция, 235) + КлючПоиска//Замещающий текст

                    );
        
        ТекущаяПозиция = ТекущаяПозиция + 235;// Прибавляет к текущий позиции 235 символов.    

        
    КонецЦикла;
    Replace.Execute(КлючПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "");
8 Natali15
 
24.05.22
16:52
(7) Также эту же ошибку выдает
9 PLUT
 
24.05.22
16:53
(8) текст ашипки какой?
10 Natali15
 
24.05.22
16:56
11 Natali15
 
24.05.22
16:56
12 Natali15
 
24.05.22
16:58
(9) https://ibb.co/4sv8k55  на этом месте останавливается
13 Выпрь
 
24.05.22
17:02
заменять частями
наименование товара - стр1:стр2:стр3...
и уже каждут стрN на свою подстроку
14 PLUT
 
24.05.22
17:02
(12) попробуйте уменьшить длину "части" с 235 до 200 букв

//костыль: (Microsoft Word): String parameter too long


    КлючПоиска = "{НаименованиеТоваров}";
    
    ТекстЗамены = СтрокаИзМассива;
    
    Replace = Doc.Content.Find;
    Replace.ClearFormatting();

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


    ТекущаяПозиция = 1// Переменная позициии ( 1 символ )

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


    
        Replace.Execute(    КлючПоиска//строка поиска


                        Ложь,      //учитывать регистр


                        Истина,    //только слово целиком


                        Ложь,      //если искомый текст является особым оператором поиска


                        Ложь,      //для поиска слов, которые похожи на поиск текста


                        Ложь,      //чтобы операция поиска обнаружила все формы искомого текста


                        Истина,    //для поиска вперед


                        ,          //Определяет, что происходит, если поиск начинается с точки, отличной от начала документа, и достигнут конец документа


                        Ложь,
                        Сред(ТекстЗамены, ТекущаяПозиция, 200) + КлючПоиска//Замещающий текст


                    );
        
        ТекущаяПозиция = ТекущаяПозиция + 200// Прибавляет к текущий позиции 200 символов.    


        
    КонецЦикла;
    Replace.Execute(КлючПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "");
15 PLUT
 
24.05.22
17:03
//костыль: (Microsoft Word): String parameter too long


    КлючПоиска = "{НаименованиеТоваров}";
    
    ТекстЗамены = СтрокаИзМассива;
    
    Replace = Doc.Content.Find;
    Replace.ClearFormatting();

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


    ТекущаяПозиция = 1// Переменная позициии ( 1 символ )

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


    
        Replace.Execute(    КлючПоиска//строка поиска


                        Ложь,      //учитывать регистр


                        Истина,    //только слово целиком


                        Ложь,      //если искомый текст является особым оператором поиска


                        Ложь,      //для поиска слов, которые похожи на поиск текста


                        Ложь,      //чтобы операция поиска обнаружила все формы искомого текста


                        Истина,    //для поиска вперед


                        ,          //Определяет, что происходит, если поиск начинается с точки, отличной от начала документа, и достигнут конец документа


                        Ложь,
                        Сред(ТекстЗамены, ТекущаяПозиция, 200) + КлючПоиска//Замещающий текст


                    );
        
        ТекущаяПозиция = ТекущаяПозиция + 200// Прибавляет к текущий позиции 200 символов.    


        
    КонецЦикла;
    Replace.Execute(КлючПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "");
16 PLUT
 
24.05.22
17:04
сцуко, что-то код при копипасте криво вставляется. попытка номер три

КлючПоиска = "{НаименованиеТоваров}";
    
    ТекстЗамены = СтрокаИзМассива;
    
    Replace = Doc.Content.Find;
    Replace.ClearFormatting();

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

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

    
        Replace.Execute(    КлючПоиска,//строка поиска

                        Ложь,      //учитывать регистр

                        Истина,    //только слово целиком

                        Ложь,      //если искомый текст является особым оператором поиска

                        Ложь,      //для поиска слов, которые похожи на поиск текста

                        Ложь,      //чтобы операция поиска обнаружила все формы искомого текста

                        Истина,    //для поиска вперед

                        ,          //Определяет, что происходит, если поиск начинается с точки, отличной от начала документа, и достигнут конец документа

                        Ложь,
                        Сред(ТекстЗамены, ТекущаяПозиция, 200) + КлючПоиска//Замещающий текст

                    );
        
        ТекущаяПозиция = ТекущаяПозиция + 200; // Прибавляет к текущий позиции 200 символов.    

        
    КонецЦикла;
    Replace.Execute(КлючПоиска, Ложь, Истина, Ложь, , , Истина, , Ложь, "");
17 Natali15
 
24.05.22
17:17
(14) Все получилось! Спасибо Вам. Объясните, пожалуйста, как повлияло уменьшение длины?
18 PLUT
 
24.05.22
17:22
(17) ну там магия 1С

поиском по {ШляпаКакаяТо} ищется позиция куда вставляем. берем из длинной строки только часть 200 символов и добавляем к этой части {ШляпаКакаяТо}. в найденную позицию вставляем эту часть со шляпой.

и так в цикле, пока всё не вставим

а в последней строке кода {ШляпаКакаяТо} заменяется на ""
19 PLUT
 
24.05.22
17:24
а ноги растут отсюда:

При замене текста в файле Word, если количество символов вставляемого текста больше 255 возникает ошибка String Parameter too long.
20 ptiz
 
24.05.22
17:32
Я так делаю:

Процедура ВывестиСтруктуруВWord(Структура, MSWord)

    Поиск = MSWord.Selection.Find;
    Поиск.Wrap = 1;
    
    Для каждого КлючИЗначение Из Структура Цикл
        
        MSWord.Selection.HomeKey(6);
        Результат = Поиск.Execute("[" + КлючИЗначение.Ключ + "]");
        Пока Результат = Истина Цикл
        
            MSWord.Selection.Text = КлючИЗначение.Значение;
        
            MSWord.Selection.HomeKey(6);
            Результат = Поиск.Execute("[" + КлючИЗначение.Ключ + "]");
        КонецЦикла;
    
    КонецЦикла;

КонецПроцедуры
21 PLUT
 
24.05.22
17:33
(20) попробуй в своё "я так делаю" в структуру запихать что-то длиннее 255 символов (ну там строку длиной 500 к примеру)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.