Разработка и Конфигурация · 10 мин
Как убрать пробел из строки в 1С
Как убрать пробелы из строки в 1С: функции СокрЛП, СокрЛ, СокрП, СтрЗаменить. Удаление неразрывных пробелов, пробелов в числах и типовые ошибки с примерами кода.
Пробелы в строках — одна из самых частых причин ошибок при обработке данных в 1С: лишние символы мешают сравнению строк, поиску в справочниках, загрузке данных из файлов и выгрузке в другие системы. Пользователь мог ввести значение с пробелом в конце, файл Excel мог содержать неразрывные пробелы, а номер документа — пробелы между группами цифр.
Во встроенном языке 1С есть несколько штатных инструментов для удаления пробелов: функции СокрЛП(), СокрЛ(), СокрП() и СтрЗаменить(). Каждая решает свою задачу, и неправильный выбор приводит к тому, что часть пробелов остаётся или, наоборот, удаляются нужные символы.
Ниже разобраны все рабочие способы с примерами кода, объяснено, как удалить неразрывный пробел (частая проблема при загрузке из Excel и при работе с числами), как проверить результат и каких ошибок стоит избегать.
Убрать пробелы в начале и конце строки: СокрЛП, СокрЛ, СокрП
Функция СокрЛП() удаляет незначащие символы (пробелы, табуляции, переносы строк) слева и справа от строки. Это самый востребованный способ: его применяют при сравнении пользовательского ввода, поиске по наименованию и подготовке данных к записи.
Наименование = " Счёт-фактура №125 ";
Результат = СокрЛП(Наименование);
// Результат: "Счёт-фактура №125"
Если нужно убрать пробелы только с одной стороны, используют частные варианты: СокрЛ() — слева, СокрП() — справа. Это полезно, когда пробелы с другой стороны несут смысл, например при выравнивании текста в отчётах или формировании фиксированных форматов обмена.
Строка = " Артикул Т-100 ";
Сообщить(СокрЛ(Строка)); // "Артикул Т-100 "
Сообщить(СокрП(Строка)); // " Артикул Т-100"
Сообщить(СокрЛП(Строка)); // "Артикул Т-100"
Важно понимать: СокрЛП() не трогает пробелы внутри строки. Если значение «Иванов Иван» содержит двойной пробел между словами, после сокращения он останется. Для таких случаев нужен другой подход.
Удалить все пробелы в строке, включая внутренние
Чтобы убрать каждый пробел в строке — и по краям, и между словами — используют функцию СтрЗаменить(): она заменяет все вхождения подстроки на указанное значение, в данном случае на пустую строку.
НомерКарты = "4276 5500 1234 5678";
Результат = СтрЗаменить(НомерКарты, " ", "");
// Результат: "4276550012345678"
Такой приём типичен при обработке номеров банковских карт, телефонов, артикулов и штрихкодов, где пробелы используются только для визуального разделения групп символов. Перед записью в базу их удаляют, чтобы обеспечить единообразный формат хранения и корректный поиск.
Если нужно убрать только повторяющиеся (двойные, тройные) пробелы, заменяя их одним, применяют цикл:
Строка = "Иванов Иван Иванович";
Пока СтрНайти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;
// Результат: "Иванов Иван Иванович"
- 1Определите, где находятся пробелы: по краям, внутри или везде
- 2Для краёв строки примените СокрЛП(Строка)
- 3Для удаления всех пробелов примените СтрЗаменить(Строка, " ", "")
- 4Проверьте, нет ли в строке неразрывных пробелов (Символ(160))
- 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"
Сравнение вариантов
Убирает пробелы и служебные символы по краям строки. Не трогает пробелы внутри и неразрывные пробелы в некоторых ситуациях.
Удаляет любые указанные символы в любом месте строки, включая неразрывный пробел. Требует точно знать, что заменять.
Подходит только для вывода чисел без разделителей разрядов; строки с текстом не обрабатывает.
Пробелы в запросах и при поиске в справочниках
При поиске элемента справочника по наименованию лишний пробел приводит к тому, что элемент не находится — и код создаёт дубль. Поэтому значение перед поиском принято нормализовать: сократить пробелы и при необходимости привести регистр.
ИскомоеНаименование = СокрЛП(НаименованиеИзФайла);
НайденныйЭлемент = Справочники.Номенклатура.НайтиПоНаименованию(
ИскомоеНаименование, Истина);
В тексте запроса функция сокращения пробелов недоступна напрямую, поэтому очистку выполняют до передачи параметра в запрос. Если «грязные» данные уже лежат в базе, их исправляют разовой обработкой: перебором элементов справочника с записью очищенного наименования. Перед такой обработкой обязательно сделайте резервную копию информационной базы — массовое изменение данных отменить штатными средствами нельзя.
Проверка результата и отладка
Главная сложность с пробелами — их невидимость. Чтобы убедиться, что строка очищена, проверяйте не только внешний вид, но и длину строки функцией СтрДлина(): если длина больше ожидаемой, в строке есть скрытые символы.
Строка = СокрЛП(ИсходнаяСтрока);
Если СтрДлина(Строка) <> ОжидаемаяДлина Тогда
// ищем скрытые символы по кодам
Для Позиция = 1 По СтрДлина(Строка) Цикл
Сообщить(КодСимвола(Строка, Позиция));
КонецЦикла;
КонецЕсли;
Вывод кодов символов — самый быстрый способ выяснить, что именно мешает сравнению: 32 — обычный пробел, 160 — неразрывный, 9 — табуляция, 10 и 13 — переводы строк. После диагностики добавьте соответствующую замену в код очистки.
Как проверить результат
Совпадает с количеством видимых символов
Длина больше — есть скрытые символы
Очищенные строки равны при одинаковом тексте
Строки визуально одинаковы, но сравнение ложно
Число() возвращает корректное значение
Возвращается 0 или возникает ошибка преобразования
Частые вопросы
Почему СокрЛП не убирает пробел в конце строки?
Скорее всего, в конце строки стоит не обычный пробел, а неразрывный (код 160) или табуляция из внешнего источника. Проверьте код последнего символа функцией КодСимвола() и удалите символ явно через СтрЗаменить(Строка, Символы.НПП, "").
Как убрать пробелы только между словами, оставив одиночные?
Используйте цикл с заменой двойного пробела на одинарный до тех пор, пока СтрНайти(Строка, " ") возвращает значение больше нуля. После цикла примените СокрЛП() для очистки краёв строки.
Как удалить пробелы в запросе 1С?
В языке запросов нет аналога СокрЛП(). Очистите значение до передачи его в параметр запроса. Если очистить нужно данные, уже хранящиеся в базе, выполните обработку перебором объектов с записью исправленных значений.
Чем отличается СокрЛП от СтрЗаменить при удалении пробелов?
СокрЛП() убирает незначащие символы только по краям строки и не требует указывать, что именно удалять. СтрЗаменить() работает по всей строке, но заменяет строго указанный символ или подстроку — каждый вид пробела нужно обрабатывать отдельным вызовом.
Как вывести число в строку без пробелов между разрядами?
Используйте функцию Формат(Число, "ЧГ=0") — параметр отключает группировку разрядов, и неразрывные пробелы в строковом представлении не появляются. Альтернатива — удалить их после преобразования через СтрЗаменить с Символы.НПП.
Можно ли убрать пробелы сразу во всех элементах справочника?
Да, пишется простая обработка: запрос выбирает все элементы, в цикле наименование очищается через СокрЛП() и СтрЗаменить(), объект записывается. Перед запуском на рабочей базе обязательно создайте резервную копию и сначала проверьте обработку на копии базы.
Что важно запомнить
Пробелы по краям строки удаляет СокрЛП(), все пробелы в строке — СтрЗаменить(Строка, " ", ""), а неразрывный пробел требует отдельной замены через Символы.НПП. Перед преобразованием строки в число и массовой чисткой справочников очищайте данные заранее и делайте резервную копию.