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

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

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

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

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

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

Ниже разобраны все рабочие способы с примерами кода, объяснено, как удалить неразрывный пробел (частая проблема при загрузке из Excel и при работе с числами), как проверить результат и каких ошибок стоит избегать.

Убрать пробелы в начале и конце строки: СокрЛП, СокрЛ, СокрП

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

Наименование = "  Счёт-фактура №125  ";

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

// Результат: "Счёт-фактура №125"

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

Строка = "   Артикул Т-100   ";

Сообщить(СокрЛ(Строка)); // "Артикул Т-100 "

Сообщить(СокрП(Строка)); // " Артикул Т-100"

Сообщить(СокрЛП(Строка)); // "Артикул Т-100"

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

Удалить все пробелы в строке, включая внутренние

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

НомерКарты = "4276 5500 1234 5678";

Результат = СтрЗаменить(НомерКарты, " ", "");

// Результат: "4276550012345678"

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

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

Строка = "Иванов   Иван   Иванович";

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

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

КонецЦикла;

// Результат: "Иванов Иван Иванович"

Порядок действий
  1. 1
    Определите, где находятся пробелы: по краям, внутри или везде
  2. 2
    Для краёв строки примените СокрЛП(Строка)
  3. 3
    Для удаления всех пробелов примените СтрЗаменить(Строка, " ", "")
  4. 4
    Проверьте, нет ли в строке неразрывных пробелов (Символ(160))
  5. 5
    Выполните контрольное сравнение результата с ожидаемым значением

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

Неразрывный пробел (код символа 160) — главная ловушка при обработке строк. Визуально он неотличим от обычного пробела, но СокрЛП() и замена обычного пробела на него не действуют. Такие символы часто попадают в данные при копировании из веб-страниц, Word, Excel, а также появляются в строковом представлении чисел: например, «1 250,50» содержит именно неразрывный пробел в разряде тысяч.

Удалить его можно двумя способами — через код символа или через предопределённое значение Символы.НПП:

Строка = "1 250,50"; // здесь неразрывный пробел

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

// или нагляднее:

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

// Результат: "1250,50"

Надёжная практика — удалять оба вида пробелов последовательно, особенно при загрузке данных из внешних источников:

Функция ОчиститьСтроку(Знач Строка)

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

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

Возврат Строка;

КонецФункции

Убрать пробелы при преобразовании строки в число

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

СтрокаСумма = "15 300,75"; // из файла или с формы

СтрокаСумма = СтрЗаменить(СтрокаСумма, Символы.НПП, "");

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

Сумма = Число(СтрокаСумма); // 15300,75

Обратная задача — число уже преобразовано в строку, и в нём появился неразрывный пробел как разделитель групп разрядов. Здесь помогает либо та же замена, либо форматная строка при выводе: Формат(Сумма, "ЧГ=0") отключает группировку разрядов, и пробелы в строковом представлении не появляются вовсе.

Сумма = 1250000;

СтрокаБезПробелов = Формат(Сумма, "ЧГ=0");

// "1250000" вместо "1 250 000"

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

СокрЛП()

Убирает пробелы и служебные символы по краям строки. Не трогает пробелы внутри и неразрывные пробелы в некоторых ситуациях.

СтрЗаменить()

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

Формат() с ЧГ=0

Подходит только для вывода чисел без разделителей разрядов; строки с текстом не обрабатывает.

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

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

ИскомоеНаименование = СокрЛП(НаименованиеИзФайла);

НайденныйЭлемент = Справочники.Номенклатура.НайтиПоНаименованию(

ИскомоеНаименование, Истина);

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

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

Проверка результата и отладка

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

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

Если СтрДлина(Строка) <> ОжидаемаяДлина Тогда

// ищем скрытые символы по кодам

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

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

КонецЦикла;

КонецЕсли;

Вывод кодов символов — самый быстрый способ выяснить, что именно мешает сравнению: 32 — обычный пробел, 160 — неразрывный, 9 — табуляция, 10 и 13 — переводы строк. После диагностики добавьте соответствующую замену в код очистки.

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

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

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

Совпадает с количеством видимых символов

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

Длина больше — есть скрытые символы

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

Очищенные строки равны при одинаковом тексте

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

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

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

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

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

Возвращается 0 или возникает ошибка преобразования

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

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

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

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

Используйте цикл с заменой двойного пробела на одинарный до тех пор, пока СтрНайти(Строка, " ") возвращает значение больше нуля. После цикла примените СокрЛП() для очистки краёв строки.

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

В языке запросов нет аналога СокрЛП(). Очистите значение до передачи его в параметр запроса. Если очистить нужно данные, уже хранящиеся в базе, выполните обработку перебором объектов с записью исправленных значений.

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

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

Как вывести число в строку без пробелов между разрядами?

Используйте функцию Формат(Число, "ЧГ=0") — параметр отключает группировку разрядов, и неразрывные пробелы в строковом представлении не появляются. Альтернатива — удалить их после преобразования через СтрЗаменить с Символы.НПП.

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

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

Итог

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

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