Как объединить многострочный текст в одну строку в 1С и убрать переносы?

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

При импорте данных в 1С из внешних источников, таких как Excel, CSV или текстовые файлы, разработчики часто сталкиваются с проблемой «невидимых» символов. Текст, который в ячейке Excel выглядит как обычное наименование, в 1С может превратиться в многострочную структуру. Это происходит из-за наличия управляющих символов переноса строки. В этой статье мы подробно разберем, как очистить строку от переносов и объединить фрагменты текста в одну сплошную строку несколькими способами.

Метод 1. Классическое использование функции СтрЗаменить

Первое, что приходит на ум — воспользоваться стандартной функцией СтрЗаменить. Однако новички часто совершают ошибку, пытаясь удалить только символ перевода строки Символы.ПС. Проанализируем ситуацию: в операционных системах Windows перенос строки обычно кодируется парой символов: Возврат каретки (CR — Carriage Return) и Перевод строки (LF — Line Feed). В 1С им соответствуют системные константы Символы.ВК и Символы.ПС.

Рассмотрим пример кода, который надежно удаляет оба типа символов:


// Очистка строки от всех типов переносов
Наименование = "Тип" + Символы.ВК + Символы.ПС + "Значение";
Результат = СтрЗаменить(СтрЗаменить(Наименование, Символы.ВК, ""), Символы.ПС, "");
// На выходе получим: "ТипЗначение"

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

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

Начиная с версии платформы 8.3.6, у разработчиков появились мощные инструменты для работы со строками. Посмотрим на метод, который выглядит более элегантно и работает быстрее при обработке больших объемов текста. Мы можем разбить строку в массив по символам переноса, а затем собрать её обратно.

Разберем этот процесс по шагам:

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

// Элегантное решение через массив
Разделители = Символы.ВК + Символы.ПС;
МассивСтрок = СтрРазделить(ИсходнаяСтрока, Разделители, Ложь);
Результат = СтрСоединить(МассивСтрок, "");

Этот метод предпочтителен, так как он позволяет избежать множественных вложенных вызовов СтрЗаменить, если типов нежелательных символов становится больше (например, добавляются табуляция или неразрывные пробелы).

Метод 3. Очистка строки с помощью регулярных выражений (RegExp)

Иногда стандартных функций платформы недостаточно, особенно если в строке встречаются специфические непечатаемые символы из Excel или веб-страниц. В таких случаях мы можем воспользоваться объектом VBScript.RegExp. Это позволит нам описать шаблон всех символов, которые нужно удалить, одной короткой фразой.

Проанализируем пример использования регулярных выражений в 1С:


// Использование RegExp для полной очистки
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;

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

Преимущество этого метода в том, что одним проходом мы можем удалить не только переносы, но и символы табуляции (Символы.Таб), которые также часто «ломают» верстку отчетов или загрузку в колонки.

Метод 4. Работа с неразрывными пробелами

Выясним причину, по которой иногда после удаления переносов строка всё равно ведет себя странно. Часто в данных из Excel встречается неразрывный пробел (код символа 160). Визуально он выглядит как обычный пробел, но функции поиска и замены обычного пробела его не видят.

Для борьбы с ним добавим в наш код замену символа Символы.НПП:


// Удаляем неразрывные пробелы вместе с переносами
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.ВК, "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, Символы.ПС, "");

Метод 5. Использование функций БСП

Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), вам не нужно изобретать велосипед. Проанализируем возможности общего модуля СтроковыеФункцииКлиентСервер. Там уже реализованы функции для глубокой очистки текста.

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


// Использование готового инструмента БСП
Результат = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ИсходнаяСтрока, Символы.ПС);
Результат = СтроковыеФункцииКлиентСервер.СократитьПробелы(Результат);

Функция СократитьПробелы особенно полезна, так как она не только удаляет лишние пробелы по краям (как стандартная СокрЛП), но и убирает двойные пробелы внутри строки, превращая текст в аккуратную единую линию.

Почему СокрЛП не помогает?

Важно помнить, что функция СокрЛП (или TrimAll) эффективно удаляет пробелы и переносы строк только по краям (в начале и в конце) строки. Если символ переноса находится между словами (например, «Тип[ПС]Значение»), СокрЛП его проигнорирует. Поэтому для задачи «схлопывания» многострочного текста в одну строку использование СтрЗаменить или СтрСоединить является обязательным.

Рекомендации при импорте из Excel

Если вы регулярно сталкиваетесь с «грязными» данными из Excel, мы рекомендуем подготовить данные еще на этапе чтения файла. Если используется COM-соединение, можно применить функцию Excel CLEAN (ПЕЧСИМВ), которая удаляет большинство непечатаемых символов. Однако, как показывает практика, обработка внутри 1С с помощью вышеуказанных методов является наиболее надежным и контролируемым способом.

← На главную