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

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

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

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

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

Важно сразу различать два разных действия: удаление всех пробелов, включая пробелы внутри строки, и удаление только начальных и конечных пробелов. Для первого случая подходит СтрЗаменить(Строка, " ", ""), для второго — СокрЛП. Смешение этих задач — самая частая причина ошибок, когда из ФИО или адреса исчезают нужные разделители.

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

Удаление всех пробелов через СтрЗаменить

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

Результат = СтрЗаменить("12 345 678", " ", ""); // "12345678"

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

Типичный пример — нормализация ИНН или КПП, пришедших из внешнего файла, где пользователи могли вставить пробелы для читаемости. Перед проверкой длины и записью в справочник строку очищают, иначе сравнение с уже существующими данными даст ложное несовпадение.

bsl
Строка = "7 912 345-67-89";
Результат = СтрЗаменить(Строка, " ", "");
// Результат: "7912345-67-89"

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

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

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

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

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

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

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

Удаляется он так же через СтрЗаменить, но с явным указанием символа:

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

Для надёжной очистки строки, пришедшей извне, обычно пишут универсальную функцию, удаляющую оба типа пробелов, а иногда и табуляции с символами переноса строки, если они не нужны:

bsl
Функция УдалитьВсеПробелы(Строка)
	Результат = СтрЗаменить(Строка, " ", "");
	Результат = СтрЗаменить(Результат, Символ(160), "");
	Результат = СтрЗаменить(Результат, Символы.Таб, "");
	Возврат Результат;
КонецФункции

Посимвольная обработка и регулярные выражения

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

bsl
Функция ОставитьТолькоЦифры(Строка)
	Результат = "";
	Для Позиция = 1 По СтрДлина(Строка) Цикл
		Символ = Сред(Строка, Позиция, 1);
		Если СтрНайти("0123456789", Символ) > 0 Тогда
			Результат = Результат + Символ;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
КонецФункции

Другой вариант — регулярные выражения через COM-объект VBScript.RegExp. Способ мощный: одним шаблоном \s+ удаляются все пробельные символы разом, включая табуляции и неразрывные пробелы. Но у него есть ограничения: COM-объекты недоступны на Linux-сервере и в веб-клиенте, поэтому для кроссплатформенного кода этот подход не подходит.

В тонком клиенте на Windows регулярное выражение вызывается так: создаётся COM-объект, задаётся шаблон "\s+" со свойством Global = Истина, и метод Replace заменяет совпадения на пустую строку. Перед внедрением проверьте, где именно будет выполняться код — на клиенте или на сервере, и под какой операционной системой.

Выбор способа под конкретную задачу

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

Маршрут решения

Как выбрать действие

Строка — код, номер, ИНН, телефон, пробелы внутри не нужныИспользуйте СтрЗаменить(Строка, " ", "") плюс удаление Символ(160)
Нужно убрать только случайные пробелы по краям ввода пользователяПримените СокрЛП перед записью или сравнением
Данные пришли из Excel, браузера или PDF и сравнение "не срабатывает"Добавьте удаление неразрывного пробела Символ(160) и табуляции
Нужно оставить только цифры или только определённые символыИспользуйте посимвольный обход с проверкой допустимых символов
Код работает только на Windows-клиенте и нужен сложный шаблонРассмотрите регулярные выражения через VBScript.RegExp

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

Проверка результата и типичные ошибки

После очистки убедитесь, что строка действительно не содержит пробельных символов. Простая проверка — сравнить длину до и после, а также поискать в результате остаточные символы: СтрНайти(Результат, " ") и СтрНайти(Результат, Символ(160)) должны вернуть 0.

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

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

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

Уменьшилась ровно на количество удалённых пробелов

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

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

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

Очищенная строка равна эталону

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

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

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

СтрНайти по пробелу и Символ(160) возвращает 0

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

Найдены вхождения — очистка неполная

Типичные ошибки
01
Использование СокрЛП там, где нужно удалить пробелы внутри строки — пробелы в середине остаются, и сравнение номеров не срабатывает
02
Игнорирование неразрывного пробела Символ(160) — строки выглядят одинаково, но не равны, поиск дублей не работает
03
Отсутствие присвоения результата: вызов СтрЗаменить(Строка, " ", "") без записи в переменную не меняет исходную строку
04
Удаление всех пробелов из наименований и адресов — данные склеиваются и теряют читаемость без возможности восстановления
05
Использование COM-регулярных выражений в серверном коде на Linux — код падает с ошибкой создания объекта

Ещё одна рабочая рекомендация: оформите очистку строки как отдельную функцию в общем модуле и переиспользуйте её во всех местах обработки. Тогда исправление — например, добавление нового невидимого символа — потребуется внести в одном месте, а не искать по всей конфигурации.

Итог

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

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

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

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

Так задумано: СокрЛП обрабатывает только начало и конец строки. Пробелы между словами она не трогает. Для удаления пробелов внутри используйте СтрЗаменить с пустой строкой замены.

Строки выглядят одинаково, но сравнение говорит, что они разные. Что делать?

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

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

Сначала очистите строку от обычных и неразрывных пробелов, затем преобразуйте её в число через Число(). Если в строке могут быть другие символы, проверьте её описанием типа или попыткой преобразования, чтобы не получить ошибку.

Работает ли СтрЗаменить на сервере и в веб-клиенте?

Да, СтрЗаменить, СокрЛП и посимвольный обход — встроенные функции языка и работают везде: на сервере, в тонком, толстом и веб-клиенте, на Windows и Linux. Ограничения есть только у COM-объектов вроде VBScript.RegExp.

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

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

Можно ли удалить пробелы сразу в запросе 1С?

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