Имя: Пароль:
1C
1С v8
Что можно придумать вместо СтрСоединить в 8.2. для сохранения быстродействия?
0 1S_User
 
26.03.19
12:09
Дано. У клиента 8.2, поскольку соответствующего платформенного механизма в 8.2 еще нет, приходится самостоятельно формировать сообщения в формате JSON, достаточно большие. Приходится делать достаточно большое количество конкатенаций. При этом СтрСоединить, которая выдает единую строку из массива, в 8.2. нет. Рекурсивная конкатенация больших текстов много тысяч раз работает ну очень медленно. Кто-нибудь с подобным сталкивался? Что можно придумать вместо стандартной для 8.3 СтрСоединить так, чтобы сохранилась ее главная фишка - быстрое объединение большого количества строк в одну?  Вызывать какой-то виндовский механизм, скорее всего, тоже не лучший вариант, т.к. на эти вызовы тоже время понадобится.
1 Вафель
 
26.03.19
12:10
записьxml
2 Ёпрст
 
26.03.19
12:13
а чего просто платформу не обновить до 8.3 ?
3 MM
 
26.03.19
12:22
Больше всего времени тратится на присоединение строки, часто небольшой, к основному тексту. Это время тратится на то, чтобы выделить место под новую расширенную строку, а потом скопировать в него строку слева (большУю), а потом докопировать правую строку. Способ оптимизации состоит в том, чтобы соединять маленькие строки друг с другом, а когда этот временный буфер вырастит, то присоединить его к основной строке большого размера. Размер временного буфера можно подобрать экспериментально, чтобы лишний раз не копировать большую строку без необходимости. Временные буферы могут быть вложены друг в друга, но и без этого вы заметите существенное ускорение.
4 APXi
 
26.03.19
12:30
Пиши в файл
5 1S_User
 
26.03.19
13:20
(3) Да, видимо, буду копать именно в эту сторону. (4) Думаешь, множественная файловая операция будет быстрее?
6 1S_User
 
26.03.19
13:21
(1) Среда, с которой интеграция, принимает именно JSON. (2) Контора огромная, очень много работ будет перед тем, как перевести.
7 Cyberhawk
 
26.03.19
13:25
Пиши строки в массив, потом по массиму бежишь и сбрасываешь в файл
8 Провинциальный 1сник
 
26.03.19
13:26
По-моему, ЗаписьФайла лучше, чем соединять строки в мегастроку.
9 1S_User
 
26.03.19
13:28
(7) (8) Спс, попробую и такой вариант. В принципе, да, запись в конец даже мегафайлов занимает мало времени. Надо проверить. Было интересно, как это эсники реализовали в СтрСоединить (в самой платформе).
10 FIXXXL
 
26.03.19
13:29
(6) как вариант, сделай XDTO-пакет, а его потом преобразуй в джейсон
11 1S_User
 
26.03.19
13:29
(10) Нету в 8.2. такой возможности - запись xdto в json. Отсюда и вся свистопляска.)
12 rintik
 
26.03.19
13:32
Интересно посмотреть СтрШаблон("%1%2", Значение1,Значение2) разница в быстродействии есть?
13 Провинциальный 1сник
 
26.03.19
13:35
(8) То есть ЗаписьТекста, поправлюсь
14 FIXXXL
 
26.03.19
13:37
(11) ФабрикаXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектХДТО) не работает?
нету 8.2 в округе...
15 1S_User
 
26.03.19
13:44
(14) Если бы работало, проблем бы не было.) (12) Если сравнивать с множеством СтрЗаменить(), то да, есть. Видимо, замену выполняет за 1 прогон, а не за много.
16 Eiffil123
 
26.03.19
14:17
Используй модель последовательного доступа к тексту (запись в файл).

Текст.ЗаписатьСтроку("Добро пожаловать!");
Записываемая строка. После записи строки в файл помещается разделитель строк.
17 APXi
 
26.03.19
14:57
(5) да, думаю быстрее будет в вашем случае
18 MM
 
26.03.19
15:02
В (1) имеется ввиду использование метода ЗаписьXML (XMLWriter) ЗаписатьБезОбработки (WriteRaw), который не производит лишних перемещений строк в памяти. С его помощью можно формировать строку не только с XML.
19 1S_User
 
26.03.19
15:18
Короче, вот так я сделал
20 1S_User
 
26.03.19
15:20
Функция ОбъединитьМассивСтрок82(МасСтрок)
    ТекстДок = Новый ТекстовыйДокумент;
    Для Каждого Строка Из МасСтрок Цикл
        ТекстДок.ДобавитьСтроку(Строка);
    КонецЦикла;
    Возврат ТекстДок.ПолучитьТекст();  
КонецФункции
21 Вафель
 
26.03.19
15:20
(18) причем этот метод работает БЫСТРЕЕ чем СтрСоединить
22 1S_User
 
26.03.19
15:20
Минус в том, что лишние символы переноса строк (а некоторые нужны, так что через стрзаменить так просто не удалишь), но JSON ни нисколько не мешают. В принципе несколько мегабайт текста обрабатывает быстрее секунды (против нескольких минут). Наверное, можно и лучше сделатЬ, но мне это уже не так интересно.)
23 1S_User
 
29.03.19
17:27
Но через ЗаписьXML на больших объемах работает многократно быстрее.
24 Eiffil123
 
29.03.19
18:04
(23) используй ЗаписьТекста. Он должен быть шустрее, чем записьXML, т.к. не выполняет всяких xml-преобразований.
25 Вафель
 
29.03.19
18:05
(24) так там же raw пишится, тоже без преобразований
26 Garykom
 
гуру
29.03.19
18:14
А кто подскажет какой объект (содержащий несколько строк) дает минимальный мусор после "ЗначениеВСтрокуВнутр" ?
27 Вафель
 
29.03.19
18:18
(26) соедини строки через спецсимвол
28 Garykom
 
гуру
29.03.19
18:59
(27) Не понял.
Я то типа берем СЗ или некую Структура/Массив из строк и ЗначениеВСтрокуВнутр(Массив).
Далее правим результат операциями над строками через СтрЗаменить()
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn