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

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

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

Метод №1: Использование современного подхода (СтрРазделить и СтрСоединить)

Этот способ является наиболее предпочтительным в современных версиях платформы 1С 8.3. Мы будем использовать связку функций, которые позволяют «разобрать» строку на массив слов, отсекая пустые элементы, а затем собрать их обратно в единую строку через один пробел. Давайте проанализируем логику этого метода:

  1. Мы вызываем СтрРазделить, передавая строку-источник и символ-разделитель (пробел).
  2. Критически важным параметром является третий аргумент функции — Ложь. Он указывает платформе, что пустые строки, возникшие из-за наличия нескольких пробелов подряд, нужно игнорировать.
  3. На выходе мы получаем массив строк, содержащий только значимые слова.
  4. Функция СтрСоединить объединяет элементы массива обратно в строку, вставляя между ними строго один пробел.

ТестСтр = "Строка    со  многими    пробелами.";
МассивСлов = СтрРазделить(ТестСтр, " ", Ложь);
СтрБезЛишних = СтрСоединить(МассивСлов, " ");
// Результат: "Строка со многими пробелами."

Этот метод отличается высокой читаемостью кода и оптимальной производительностью, так как платформа выполняет все операции на внутреннем уровне.

Метод №2: Использование цикла с поиском (Классический подход)

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


Функция УбратьЛишниеПробелы(Стр)
    Пробел = " ";
    // Цикл работает, пока в строке есть два пробела подряд
    Пока Найти(Стр, Пробел + Пробел) <> 0 Цикл
        Стр = СтрЗаменить(Стр, Пробел + Пробел, Пробел);
    КонецЦикла;
    Возврат СокрЛП(Стр); // Удаляем пробелы по краям
КонецФункции

Обратите внимание на использование функции СокрЛП в конце обработки. Она обязательна, так как цикл Найти/СтрЗаменить убирает только внутренние «лишние» пробелы, но не затрагивает начальные и конечные символы строки.

Метод №3: Рекурсивный подход (Не рекомендуется)

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


Функция СЖПРОБЕЛЫ(Стр)
    Если Найти(Стр, "  ") Тогда
        Стр = СтрЗаменить(Стр, "  ", " ");
        Возврат СЖПРОБЕЛЫ(Стр); // Рекурсивный вызов
    КонецЕсли;
    Возврат Стр;
КонецФункции

Важно понимать: такой подход несет риски переполнения стека при работе с очень длинными строками (например, при импорте больших текстовых файлов). Кроме того, накладные расходы на создание новых контекстов исполнения делают этот метод медленнее и менее надежным по сравнению с обычным циклом или методами работы с массивами строк.

Важные нюансы при работе со строками

При обработке пробелов мы рекомендуем учитывать следующие моменты:

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

← На главную