К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как убрать пробелы в строке в 1С 8

Как убрать пробелы в строке в 1С 8.3: СокрЛП, СокрЛ, СокрП, СтрЗаменить, удаление неразрывных пробелов и лишних пробелов между словами. Примеры кода и ошибки.

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

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

Ниже разобраны все рабочие способы с примерами кода, включая удаление неразрывных пробелов (символ 160), которые часто приходят из Excel, веб-страниц и печатных форм, а также типичные ошибки и способы проверки результата.

Как убрать пробелы по краям строки: СокрЛП, СокрЛ и СокрП

Самая частая задача — убрать пробелы в начале и в конце строки. Для этого предназначены три функции:

  • СокрЛ(Строка) — удаляет пробелы только слева (в начале строки);
  • СокрП(Строка) — удаляет пробелы только справа (в конце строки);
  • СокрЛП(Строка) — удаляет пробелы с обеих сторон.

Пример использования:

Наименование = "   Товар с лишними пробелами   ";

Результат = СокрЛП(Наименование);

// Результат: "Товар с лишними пробелами"

Важная особенность: эти функции удаляют не только обычные пробелы, но и символы табуляции и переноса строки по краям. При этом пробелы между словами внутри строки сохраняются — функции работают только с краями.

Типичный сценарий — обработка наименования перед поиском в справочнике. Если не применить СокрЛП(), запрос по наименованию с пробелом на конце вернёт пустой результат, хотя визуально строки выглядят одинаково.

Как удалить все пробелы в строке через СтрЗаменить

Если нужно убрать пробелы полностью — и по краям, и между словами — используют функцию СтрЗаменить(), заменяя пробел на пустую строку:

СтрокаСПробелами = "1 000 500 руб";

БезПробелов = СтрЗаменить(СтрокаСПробелами, " ", "");

// Результат: "1000500руб"

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

Другой сценарий — формирование артикулов, штрихкодов и идентификаторов, где пробелы недопустимы по формату. Здесь СтрЗаменить() гарантированно убирает все вхождения символа пробела независимо от их позиции.

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

Как убрать неразрывные пробелы (символ 160)

Неразрывный пробел — главный источник «необъяснимых» ошибок сравнения строк в 1С. Он выглядит как обычный пробел, но имеет код 160 вместо 32. Такие символы приходят при копировании из Excel, браузера, Word и при загрузке данных из внешних файлов.

Удалить неразрывный пробел можно двумя способами:

// Способ 1: через код символа

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

// Способ 2: через предопределённое значение

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

Если нужно заменить неразрывный пробел на обычный (например, чтобы сохранить читаемость, но обеспечить корректное сравнение), заменяйте его на обычный пробел, а не на пустую строку:

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

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

Как убрать двойные и лишние пробелы между словами

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

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

Пока СтрНайти(ИсходнаяСтрока, "  ") > 0 Цикл

ИсходнаяСтрока = СтрЗаменить(ИсходнаяСтрока, " ", " ");

КонецЦикла;

ИсходнаяСтрока = СокрЛП(ИсходнаяСтрока);

Альтернатива — разбить строку на массив слов через СтрРазделить() с удалением пустых элементов и собрать обратно через СтрСоединить() с одиночным пробелом:

МассивСлов = СтрРазделить(ИсходнаяСтрока, " ", Ложь);

Результат = СтрСоединить(МассивСлов, " ");

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

Удаление пробелов при обмене данными и выгрузке в файлы

При выгрузке в CSV, Excel и XML пробелы в данных часто вызывают расхождения при загрузке на принимающей стороне. Перед записью значения в файл оборачивайте строки в СокрЛП() — это простая страховка от ошибок сопоставления.

Отдельный случай — числовые поля, выгружаемые как строки. Функция Формат() с параметром группировки может вставлять разделители разрядов, которые в зависимости от региональных настроек окажутся неразрывными пробелами. Чтобы получить «чистое» число, используйте форматную строку:

СтрокаЧисла = Формат(Сумма, "ЧГ=0");

// Группировка отключена, разделителей разрядов нет

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

bsl
Функция НормализоватьСтроку(Знач Строка)
    Строка = СтрЗаменить(Строка, Символы.НПП, " ");
    Пока СтрНайти(Строка, "  ") > 0 Цикл
        Строка = СтрЗаменить(Строка, "  ", " ");
    КонецЦикла;
    Возврат СокрЛП(Строка);
КонецФункции

Сравнение способов удаления пробелов

СпособЧто удаляетКогда применять
СокрЛП()Пробелы, табуляции и переносы по краямПеред сравнением и поиском в справочниках
СтрЗаменить(Строка, " ", "")Все обычные пробелыПреобразование строки в число, формирование кодов
СтрЗаменить(Строка, Символы.НПП, "")Неразрывные пробелыДанные из Excel, веб-страниц, печатных форм
Цикл замены двойных пробеловМножественные пробелы между словамиОчистка наименований, адресов, ФИО
СтрРазделить() + СтрСоединить()Множественные пробелы и краевыеНормализация текста, введённого вручную
Типичные ошибки
01
Применение СокрЛП() к строке с неразрывными пробелами внутри: края очищаются, но сравнение всё равно не проходит из-за символа 160 между словами.
02
Удаление всех пробелов в ФИО или адресе: слова склеиваются, и документ не проходит форматно-логический контроль при обмене.
03
Преобразование строки в число без удаления разделителей разрядов: Число("1 500") вызывает ошибку или неожиданный результат.
04
Сравнение строк без нормализации: «Товар» и «Товар » с пробелом на конце считаются разными значениями, и поиск дублей не срабатывает.

Как проверить результат очистки строки

После обработки строки убедитесь, что результат соответствует ожиданиям. Самый надёжный способ — проверить длину строки до и после: если после СокрЛП() длина не изменилась, но строка визуально содержит «лишние» символы, вероятно, это неразрывные пробелы или табуляции.

Контрольные точки

Как проверить результат

Длина строки после СокрЛП()
Норма

Длина уменьшилась на число краевых пробелов

Тревожный признак

Длина не изменилась — по краям могут быть неразрывные пробелы

Сравнение двух визуально одинаковых строк
Норма

Условие равенства выполняется

Тревожный признак

Строки не равны — проверьте коды символов через КодСимвола()

Преобразование строки в число
Норма

Число() возвращает корректное значение

Тревожный признак

Ошибка преобразования — остались пробелы или разделители разрядов

Для диагностики невидимых символов используйте перебор строки в цикле с выводом кода каждого символа:

Для Позиция = 1 По СтрДлина(Строка) Цикл

Сообщить(КодСимвола(Строка, Позиция));

КонецЦикла;

Код 32 — обычный пробел, 160 — неразрывный, 9 — табуляция, 10 и 13 — переносы строки. Зная коды, вы точно определите, какие символы нужно удалять.

Итог

Что важно запомнить

Краевые пробелы убирает СокрЛП(), все пробелы — СтрЗаменить() с пустой строкой, неразрывные пробелы — замена Символы.НПП. Перед сравнением и преобразованием в число строку всегда нормализуйте, а невидимые символы диагностируйте через КодСимвола().

Частые вопросы

Почему СокрЛП не удаляет пробелы в строке?

Функция СокрЛП() работает только с краями строки и не трогает пробелы между словами. Кроме того, если по краям стоят неразрывные пробелы (код 160), поведение может отличаться от ожидаемого. Проверьте коды символов через КодСимвола() и при необходимости замените Символы.НПП.

Как убрать пробелы из числа, введённого строкой?

Перед преобразованием удалите и обычные, и неразрывные пробелы: СтрЗаменить(СтрЗаменить(Строка, Символы.НПП, ""), " ", ""), а затем примените Число(). Неразрывные пробелы часто встречаются в суммах, скопированных из Excel или печатных форм.

Чем неразрывный пробел отличается от обычного?

Обычный пробел имеет код 32, неразрывный — код 160. Визуально они одинаковы, но при сравнении строк и преобразовании чисел ведут себя по-разному: строка с неразрывным пробелом не равна строке с обычным. В 1С неразрывный пробел доступен как Символы.НПП.

Как удалить табуляции и переносы строк вместе с пробелами?

Используйте последовательные замены: СтрЗаменить для Символы.Таб, Символы.ПС и Символы.ВК с заменой на пробел или пустую строку, затем сожмите множественные пробелы и примените СокрЛП(). По краям строки СокрЛП() удаляет табуляции и переносы самостоятельно.

Можно ли убрать пробелы сразу во всех элементах справочника?

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

Почему строки выглядят одинаково, но сравнение даёт Ложь?

Почти всегда причина в невидимых символах: неразрывный пробел, табуляция или пробел в конце одной из строк. Сравните длины строк через СтрДлина() и выведите коды символов обеих строк — расхождение покажет, какой именно символ мешает равенству.