Столкнулся с проблемой, что большие строки в 1С очень долго обрабатываются. Например, вот этот алгоритм ищет все точки запятые в кавычках и заменяет на запятые.

```1c
    СтрокаТекстаРезультат = ";
    Кавычка = Ложь;
    Для НомерСимвола = 1 По СтрДлина(СтрокаТекста) Цикл
    ТекСимвол = Сред(СтрокаТекста,НомерСимвола,1);
    Если ТекСимвол = "" Тогда
    Кавычка = НЕ(Кавычка);
    КонецЕсли;
    Если ((ТекСимвол = ";") ИЛИ (ТекСимвол = Символы.ПС)) И Кавычка Тогда
    ТекСимвол = ",";
    КонецЕсли;
    СтрокаТекстаРезультат = СтрокаТекстаРезультат + ТекСимвол;
    КонецЦикла;
    Возврат(СтрокаТекстаРезультат);
```

На файле размером 4 Мб работает несколько часов. Кто сталкивался с подобной проблемой?
---
Kutuzov, в статье "Опять двойка" есть описание и обсуждение этой проблемы. И объяснение ее природы. В комментарии http://forum.infostart.ru/forum24/topic75023/message908183/#message908183 приведен код для использования ЗаписьXML. Это действительно самый быстрый способ.
---
Самое интересное - скорость обработки возрастает не линейно, а в прогрессии.

Кстати. А вариант в вашем случае отрабатывает практически мгновенно:

```1c
    Сообщить("Начало 3:" + ТекущаяДата());
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.Прочитать("c:\upload\1.txt");
    СтрокаТекста = ТекстДок.ПолучитьСтроку(1);
    СтрокаТекстаРезультат = СтрЗаменить(СтрокаТекста, ";", ",");
    СтрокаТекстаРезультат = СтрЗаменить(СтрокаТекстаРезультат, "" + Символы.ПС + "", ",");
    Сообщить(СтрокаТекстаРезультат);
    Сообщить("Конец 3:" + ТекущаяДата());
```
---
Kutuzov, в статье "Опять двойка" есть описание и обсуждение этой проблемы. И объяснение ее природы. В комментарии http://forum.infostart.ru/forum24/topic75023/message908183/#message908183 приведен код для использования ЗаписьXML. Это действительно самый быстрый способ.
---
ildarovich, спасибо, век живи - век учись!
---
А что тебе во 2 ответе не понравилось?
---
Для слияния строк используй ЗаписьXML ЗаписатьБезОбработки

http://www.forum.mista.ru/topic.php?id=689081#25
---
А зачем на каждом шаге цикла:

```1c
    Для НомерСимвола = 1 По СтрДлина(СтрокаТекста) Цикл
```

Требуется вычислять длину СтрокаТекста?
Может так корректнее?

```1c
    нДлина = СтрДлина(СтрокаТекста);
    Для НомерСимвола = 1 По нДлина Цикл
```
---
Это в Пока-цикле вычисляется каждый обход, в Для-цикле - лишь один раз.
---
как вариант использовать ЧтениеТекста - читать и обрабатывать файл построчно
---
spezc, не годится, т.к. в кавычках может оказаться и символ перевода строки, который тоже необходимо обработать - заменить на запятую.
---
Kutuzov, как в строке появится символ переноса строки? Это уже другая строка будет :)
---
Да и добавлять лучше не по одному элементу а сразу копировать диапазон
Например
http://www.forum.mista.ru/topic.php?id=560193#1
---
Но вообще для твоего алгоритма достаточно

```1c
    Стр=СтрЗаменить(Стр,"";","",");
    Стр=СтрЗаменить(Стр,""+Символы.ПС,"",");
```
---
про фоновые процессы была недавно статья, разбить куски и распараллелить
---
В условиях в первую очередь надо ставить такое, что отрабатывается всегда и быстро. Т. е. не:

```1c
    Если ((ТекСимвол = ";") ИЛИ (ТекСимвол = Символы.ПС)) И Кавычка Тогда
```

а:

```1c
    Если Кавычка И ((ТекСимвол = ";") ИЛИ (ТекСимвол = Символы.ПС)) Тогда
```

P.S.: это не решение проблемы, а так, небольшая оптимизация.