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

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

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

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

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

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

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

Удаление пробелов по краям строки: СокрЛ, СокрП, СокрЛП

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

Типовой пример использования при обработке пользовательского ввода:

Наименование = СокрЛП(Наименование);

Если ПустаяСтрока(Наименование) Тогда

Сообщить("Наименование не заполнено");

КонецЕсли;

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

На практике СокрЛП() применяется в подавляющем большинстве случаев. Отдельные СокрЛ() и СокрП() нужны редко — например, когда ведущие пробелы несут смысл (выравнивание в текстовом отчёте), а хвостовые нужно убрать.

Удаление всех пробелов внутри строки

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

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

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

Типичная задача — очистка числа, введённого с пробелами-разделителями разрядов («1 250 000»):

СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", "");

СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(160), "");

Попытка

ЗначениеЧисло = Число(СтрокаЧисла);

Исключение

Сообщить("Не удалось преобразовать значение в число");

КонецПопытки;

Здесь дополнительно удалён неразрывный пробел — без этого преобразование строки из Excel часто завершается ошибкой.

1c
СтрокаБезПробелов = СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, Символ(160), " "), "  ", " ");

Неразрывный пробел и другие «невидимые» символы

Неразрывный пробел (код 160) визуально неотличим от обычного, но СтрЗаменить(Строка, " ", "") его не удаляет — это другой символ. Он постоянно встречается в данных, скопированных из Excel, веб-страниц, Word, а также в числах, отформатированных с разделителями разрядов.

Для удаления неразрывного пробела заменяйте его явно через Символ(160):

Строка = СтрЗаменить(Строка, Символ(160), " "); // заменить на обычный пробел

Строка = СокрЛП(Строка);

Помимо кода 160, в загружаемых данных встречаются табуляция (Символ(9)), неразрывный узкий пробел и другие служебные символы. Универсальный подход — последовательно заменить все известные «невидимые» символы на обычный пробел, а затем применить СокрЛП().

Сжатие повторных пробелов до одного

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

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

Пока СтрНайти(Строка, " ") > 0 Цикл

Строка = СтрЗаменить(Строка, " ", " ");

КонецЦикла;

Строка = СокрЛП(Строка);

Цикл работает, потому что замена двойного пробела на одиночный постепенно «схлопывает» любые последовательности. Три пробела подряд превращаются в два, затем в один. Условие выхода — отсутствие двойных пробелов, которое проверяется через СтрНайти().

Альтернативный вариант — разложить строку через СтрРазделить(Строка, " ", Ложь) с пропуском пустых элементов и собрать обратно через СтрСоединить(). Такой способ быстрее на длинных строках с большим количеством повторных пробелов.

Порядок действий для нормализации строки
  1. 1
    Замените неразрывные пробелы Символ(160) на обычные
  2. 2
    Сожмите повторные пробелы циклом СтрЗаменить или через СтрРазделить/СтрСоединить
  3. 3
    Примените СокрЛП для очистки краёв
  4. 4
    Проверьте результат функцией ПустаяСтрока или сравнением с эталоном

Пробелы в запросах и при сравнении строк

В языке запросов 1С нет прямого аналога СокрЛП() для произвольной очистки. Есть функция СОКРЛП() (в запросах она доступна и работает аналогично), но для замены пробелов внутри строки штатных средств запроса нет. Поэтому нормализацию обычно выполняют на встроенном языке до записи данных или после выборки.

Критичный момент — сравнение строк. Условие Если Наименование1 = Наименование2 вернёт «Ложь», если в одной строке есть хвостовой пробел. При сопоставлении данных из файлов и базы всегда приводите обе стороны к одному виду:

Если СокрЛП(НаименованиеИзФайла) = СокрЛП(НаименованиеИзБазы) Тогда

// совпадение

КонецЕсли;

Для поиска дублей в справочниках полезно хранить нормализованное представление: без пробелов по краям, со сжатыми внутренними пробелами и в одном регистре (ВРег()). Это существенно снижает количество ложных «различий» при обмене и загрузке.

Сравнение вариантов

СокрЛП()

Убирает незначащие символы по краям. Подходит для пользовательского ввода и наименований. Не трогает пробелы внутри.

СтрЗаменить(Строка, " ", "")

Удаляет все обычные пробелы. Подходит для кодов, номеров и чисел. Не работает с неразрывным пробелом.

Замена Символ(160) + СокрЛП

Универсальная очистка данных из Excel и веба. Требует явной обработки кода 160.

СтрРазделить + СтрСоединить

Сжатие повторных пробелов без цикла. Эффективно на длинных строках, но требует больше кода.

Частые ошибки и проверка результата

Самая распространённая ошибка — попытка убрать неразрывный пробел обычной заменой пробела. Код выполняется без ошибок, но строка не меняется, и причина неочевидна, потому что символы визуально идентичны. Диагностика — вывести коды символов строки:

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

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

КонецЦикла;

Вторая частая ошибка — забыть, что функции возвращают новое значение. Вызов СокрЛП(Строка); без присваивания результата ничего не меняет. Правильно: Строка = СокрЛП(Строка);.

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

Типичные ошибки
01
Замена обычного пробела не удаляет неразрывный — строка не меняется без видимой причины
02
Вызов СокрЛП(Строка) без присваивания результата — исходная строка остаётся прежней
03
Удаление всех пробелов из текстовых наименований — слова склеиваются
04
Нормализация только при записи, но не при сравнении — поиск дублей не срабатывает
Контрольные точки

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

Длина строки после очистки
Норма

СтрДлина уменьшилась на ожидаемое число символов

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

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

Сравнение с эталоном
Норма

СокрЛП обеих строк даёт Истина

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

Строки визуально равны, но сравнение ложно — проверьте коды символов

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

Число() выполняется без исключения

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

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

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

Почему СтрЗаменить не убирает пробел, хотя он виден?

Скорее всего, это неразрывный пробел (код 160) или табуляция. Обычная замена символа пробела на них не действует. Используйте СтрЗаменить(Строка, Символ(160), "") или выведите коды символов строки через КодСимвола(), чтобы точно определить, что находится в строке.

Чем СокрЛП отличается от СокрЛ и СокрП?

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

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

В языке запросов доступна функция СОКРЛП для очистки краёв строки. Замены пробелов внутри строки в запросе нет — такую обработку выполняют на встроенном языке до записи данных или после выборки результата запроса.

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

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

Изменяет ли СокрЛП исходную переменную?

Нет. Функция возвращает новую строку, а исходное значение остаётся прежним. Чтобы применить результат, присвойте его обратно: Строка = СокрЛП(Строка);.

Как сжать несколько пробелов подряд до одного?

Используйте цикл: пока СтрНайти(Строка, " ") > 0, выполняйте замену двойного пробела на одиночный. Либо разбейте строку через СтрРазделить(Строка, " ", Ложь) и соберите обратно через СтрСоединить с разделителем из одного пробела.

Итог

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

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