Как удалить переносы строк из строки в 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в среде 1С:Предприятие программисты часто сталкиваются с необходимостью очистки текстовых данных. Одной из самых распространенных задач является удаление или замена переносов строк. Это критично при формировании файлов выгрузки (например, CSV или XML), подготовке данных для передачи через API или просто для корректного отображения информации в интерфейсе. Рассмотрим подробно, почему стандартные методы иногда не срабатывают и какие способы решения существуют.

Метод 1: Использование стандартной функции СтрЗаменить

Самый простой и очевидный способ — использование встроенной функции СтрЗаменить. Мы передаем в нее исходную строку, символ, который хотим заменить, и символ, на который производится замена (обычно это пробел или пустая строка).

Разберем ситуацию, когда стандартные константы Символы.ПС (перевод строки) или Символы.ВК (возврат каретки) не помогают. Это часто случается, если текст был скопирован из веб-браузеров или специфических текстовых редакторов. В таких случаях в строке может содержаться символ конца абзаца с кодом 182.

Проанализируем пример кода для комплексной очистки:


// Замена стандартных переносов строк
Текст = СтрЗаменить(Текст, Символы.ПС, " ");
Текст = СтрЗаменить(Текст, Символы.ВК, " ");

// Замена специфического символа абзаца (ASCII 182)
Текст = СтрЗаменить(Текст, Символ(182), " ");

Важный нюанс: использование Символ(182) часто является «спасительным» решением, когда визуально разрыв строки есть, но программно Символы.ПС его не находит.

Метод 2: Современный подход через СтрРазделить и СтрСоединить

Если мы работаем на платформе 1С:Предприятие 8.3.6 и выше, нам доступен более элегантный и производительный метод. Вместо многократного вызова функции замены, мы можем разбить строку в массив и сразу собрать её обратно с нужным разделителем.

Рассмотрим этот процесс пошагово:

  1. Разбиваем исходный текст на части, используя символ переноса как разделитель.
  2. Используем параметр Ложь, если хотим сохранить пустые строки, или Истина, чтобы полностью исключить пустые фрагменты.
  3. Соединяем элементы массива в одну строку, вставляя пробел между ними.

МассивСтрок = СтрРазделить(ИсходнаяСтрока, Символы.ПС, Истина);
Результат = СтрСоединить(МассивСтрок, " ");

Этот метод работает быстрее на больших объемах данных и делает код более читаемым.

Метод 3: Обработка текста в цикле (для старых версий или специфической логики)

Иногда требуется более тонкая обработка, например, когда нужно пронумеровать строки или добавить специфические условия при склейке. В таких случаях можно использовать цикл по количеству строк. Однако, проанализируем ситуацию с производительностью: метод СтрПолучитьСтроку работает достаточно медленно на больших текстах, так как каждый раз пересчитывает символы с начала документа.

Посмотрим на пример реализации:


СтрокаБезПереносов = "";
КолСтрок = СтрЧислоСтрок(ИсходныйТекст);

Для Счетчик = 1 по КолСтрок Цикл
    ТекущаяСтрока = СтрПолучитьСтроку(ИсходныйТекст, Счетчик);
    СтрокаБезПереносов = СтрокаБезПереносов + ТекущаяСтрока + " ";
КонецЦикла;

Совет: используйте этот метод только в том случае, если объем текста невелик (несколько килобайт), иначе выполнение операции может затянуться.

Метод 4: Удаление лишнего переноса при формировании CSV

Рассмотрим частный случай: при записи данных в текстовый файл (например, через объект ТекстовыйДокумент) в конце часто остается лишний перевод строки, который может мешать принимающей стороне. Выясним причину: метод ДобавитьСтроку всегда добавляет разделитель в конце.

Чтобы убрать последний перенос, можно использовать следующий прием:


КоличествоСтрок = Файл_CSV.КоличествоСтрок();
Если КоличествоСтрок > 0 Тогда
    ПоследняяСтрока = Файл_CSV.ПолучитьСтроку(КоличествоСтрок);
    Файл_CSV.УдалитьСтроку(КоличествоСтрок);
    // Устанавливаем разделитель вручную или записываем строку без него
    Файл_CSV.УстановитьТекст(Файл_CSV.ПолучитьТекст() + ПоследняяСтрока);
КонецЕсли;

Метод 5: Использование регулярных выражений (RegExp)

Для максимально надежной очистки текста от любых невидимых символов (табуляций, разных видов переносов, неразрывных пробелов) лучше всего подходят регулярные выражения. В 1С это реализуется через COM-объект VBScript.RegExp (актуально для Windows-серверов).

Разберем, как это работает:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;

// Шаблон [\\r\\n\\t]+ находит любые комбинации ВК, ПС и табуляции
RegExp.Pattern = "[\r\n\t]+";
Результат = RegExp.Replace(ИсходнаяСтрока, " ");

Этот способ позволяет одной командой очистить текст сразу от всех «мусорных» символов, включая Символ(13), Символ(10) и Символ(9).

Особенности кроссплатформенности и спецсимволы

При работе с переносами строк важно учитывать среду выполнения. В Windows стандартом является комбинация Символы.ВК + Символы.ПС, тогда как в Linux используется только Символы.ПС. Если ваша база данных работает на Linux-сервере, а клиенты подключаются с Windows, всегда делайте последовательную замену:

  1. Сначала заменяйте комбинацию Символы.ВК + Символы.ПС на пробел.
  2. Затем отдельно Символы.ПС на пробел.
  3. И в завершение проверьте наличие Символ(160) — это неразрывный пробел, который часто визуально выглядит как обычный пробел, но ломает форматирование при выгрузке.

Подведем итог: для большинства задач в 1С 8.3 оптимальным выбором будет связка СтрРазделить и СтрСоединить. Если же текст содержит нестандартные символы, полученные извне, используйте СтрЗаменить с кодом Символ(182) или регулярные выражения для полной очистки.

← На главную