Разработка и Конфигурация · 9 мин
Как в 1С удалить все пробелы из строки
Как в 1С удалить все пробелы из строки: СтрЗаменить, СокрЛП, регулярные выражения. Примеры кода, неразрывные пробелы, типичные ошибки и проверка результата.
Задача удалить пробелы из строки в 1С возникает постоянно: при очистке номеров документов, подготовке данных к обмену, нормализации ИНН, телефонов и артикулов перед сравнением. Во встроенном языке 1С нет отдельной функции «удалить все пробелы», поэтому используют комбинации штатных функций: СтрЗаменить, СокрЛП, СокрЛ, СокрП, а в сложных случаях — обход строки посимвольно или регулярные выражения через COM-объект.
Важно сразу различать два разных действия: удаление всех пробелов, включая пробелы внутри строки, и удаление только начальных и конечных пробелов. Для первого случая подходит СтрЗаменить(Строка, " ", ""), для второго — СокрЛП. Смешение этих задач — самая частая причина ошибок, когда из ФИО или адреса исчезают нужные разделители.
Отдельная ловушка — неразрывный пробел (символ с кодом 160). Он визуально неотличим от обычного, но СтрЗаменить с обычным пробелом его не удаляет, и СокрЛП с ним тоже не всегда справляется. Такие символы регулярно приходят из Excel, веб-страниц и печатных форм, и их нужно обрабатывать явно.
Удаление всех пробелов через СтрЗаменить
Основной способ убрать все пробелы из строки — функция СтрЗаменить. Она заменяет все вхождения подстроки на другую подстроку. Если строка замены пустая, пробелы просто исчезают:
Результат = СтрЗаменить("12 345 678", " ", ""); // "12345678"
Функция работает быстро и подходит для массовой обработки в циклах: очистки номеров телефонов, кодов, артикулов перед записью в базу или сравнением. Учтите, что СтрЗаменить возвращает новую строку, а не изменяет исходную переменную — результат нужно присвоить.
Типичный пример — нормализация ИНН или КПП, пришедших из внешнего файла, где пользователи могли вставить пробелы для читаемости. Перед проверкой длины и записью в справочник строку очищают, иначе сравнение с уже существующими данными даст ложное несовпадение.
Строка = "7 912 345-67-89";
Результат = СтрЗаменить(Строка, " ", "");
// Результат: "7912345-67-89"Удаление пробелов по краям: СокрЛП, СокрЛ, СокрП
Если нужно убрать только начальные и конечные пробелы, сохранив пробелы внутри строки, используют семейство функций сокращения:
СокрЛ(Строка)— удаляет пробелы слева;СокрП(Строка)— удаляет пробелы справа;СокрЛП(Строка)— удаляет пробелы с обеих сторон.
Эти функции незаменимы при обработке пользовательского ввода: человек может случайно добавить пробел в начале или конце наименования, и без СокрЛП в базе появятся визуально одинаковые, но технически разные строки. Это ломает поиск, дублирует элементы справочников и искажает отчёты.
Важный нюанс: СокрЛП удаляет не только обычные пробелы, но и символы табуляции, перевода строки и возврата каретки по краям строки. Это удобно при чтении многострочных текстов из файлов, но нужно помнить, чтобы случайно не потерять значимые переводы строк на границах.
Неразрывные пробелы и другие невидимые символы
Неразрывный пробел (код 160) — главный источник «необъяснимых» ошибок сравнения строк в 1С. Он попадает в данные при копировании из Excel, браузера, PDF и из чисел, отформатированных с разделителями разрядов: например, «1 000 000» в ячейке Excel часто содержит именно неразрывные пробелы.
Удаляется он так же через СтрЗаменить, но с явным указанием символа:
Результат = СтрЗаменить(Строка, Символ(160), "");
Для надёжной очистки строки, пришедшей извне, обычно пишут универсальную функцию, удаляющую оба типа пробелов, а иногда и табуляции с символами переноса строки, если они не нужны:
Функция УдалитьВсеПробелы(Строка)
Результат = СтрЗаменить(Строка, " ", "");
Результат = СтрЗаменить(Результат, Символ(160), "");
Результат = СтрЗаменить(Результат, Символы.Таб, "");
Возврат Результат;
КонецФункцииПосимвольная обработка и регулярные выражения
Когда нужно удалить не только пробелы, но и любые «лишние» символы — например, оставить в телефоне только цифры — удобен посимвольный обход строки. Он медленнее СтрЗаменить, но даёт полный контроль над тем, что остаётся в результате:
Функция ОставитьТолькоЦифры(Строка)
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункцииДругой вариант — регулярные выражения через COM-объект VBScript.RegExp. Способ мощный: одним шаблоном \s+ удаляются все пробельные символы разом, включая табуляции и неразрывные пробелы. Но у него есть ограничения: COM-объекты недоступны на Linux-сервере и в веб-клиенте, поэтому для кроссплатформенного кода этот подход не подходит.
В тонком клиенте на Windows регулярное выражение вызывается так: создаётся COM-объект, задаётся шаблон "\s+" со свойством Global = Истина, и метод Replace заменяет совпадения на пустую строку. Перед внедрением проверьте, где именно будет выполняться код — на клиенте или на сервере, и под какой операционной системой.
Выбор способа под конкретную задачу
Правильный метод зависит от того, что за данные вы обрабатываете и откуда они пришли. Один и тот же приём, корректный для артикула, испортит адрес. Ориентируйтесь на происхождение строки и на требования к результату.
Как выбрать действие
Отдельно проверяйте тип входного значения. Если в функцию может попасть число или Неопределено, сначала приведите значение к строке через Строка(Значение) или проверьте тип — иначе получите ошибку выполнения в момент обработки.
Проверка результата и типичные ошибки
После очистки убедитесь, что строка действительно не содержит пробельных символов. Простая проверка — сравнить длину до и после, а также поискать в результате остаточные символы: СтрНайти(Результат, " ") и СтрНайти(Результат, Символ(160)) должны вернуть 0.
Как проверить результат
Уменьшилась ровно на количество удалённых пробелов
Длина не изменилась — вероятно, в строке неразрывные пробелы
Очищенная строка равна эталону
Строки визуально одинаковы, но не равны — есть скрытые символы
СтрНайти по пробелу и Символ(160) возвращает 0
Найдены вхождения — очистка неполная
Ещё одна рабочая рекомендация: оформите очистку строки как отдельную функцию в общем модуле и переиспользуйте её во всех местах обработки. Тогда исправление — например, добавление нового невидимого символа — потребуется внести в одном месте, а не искать по всей конфигурации.
Что важно запомнить
Все пробелы из строки удаляет СтрЗаменить(Строка, " ", ""), краевые пробелы — СокрЛП. Неразрывный пробел убирается отдельно через Символ(160). Для цифровых кодов удобен посимвольный обход, регулярные выражения — только для Windows-клиента. Не применяйте полное удаление пробелов к текстам, где пробел значим.
Частые вопросы
Почему СокрЛП не удаляет пробелы внутри строки?
Так задумано: СокрЛП обрабатывает только начало и конец строки. Пробелы между словами она не трогает. Для удаления пробелов внутри используйте СтрЗаменить с пустой строкой замены.
Строки выглядят одинаково, но сравнение говорит, что они разные. Что делать?
Почти наверняка в одной из строк есть неразрывный пробел (код 160) или табуляция. Удалите их через СтрЗаменить(Строка, Символ(160), "") и сравните длины строк — разница в длине при визуально одинаковом тексте указывает на скрытые символы.
Как удалить пробелы из числа, чтобы потом выполнить расчёт?
Сначала очистите строку от обычных и неразрывных пробелов, затем преобразуйте её в число через Число(). Если в строке могут быть другие символы, проверьте её описанием типа или попыткой преобразования, чтобы не получить ошибку.
Работает ли СтрЗаменить на сервере и в веб-клиенте?
Да, СтрЗаменить, СокрЛП и посимвольный обход — встроенные функции языка и работают везде: на сервере, в тонком, толстом и веб-клиенте, на Windows и Linux. Ограничения есть только у COM-объектов вроде VBScript.RegExp.
Как удалить двойные пробелы, оставив одинарные?
Используйте цикл: пока СтрНайти(Строка, " ") больше нуля, выполняйте Строка = СтрЗаменить(Строка, " ", " "). Цикл нужен, потому что один проход не обработает три и более пробела подряд полностью.
Можно ли удалить пробелы сразу в запросе 1С?
В языке запросов нет функции замены подстроки. Обычно данные выбирают запросом, а пробелы удаляют уже в коде при обходе результата. Либо пробелы убирают заранее — при записи данных в базу, что предпочтительнее.