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

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

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

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

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

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

Ниже разобраны все основные сценарии: обрезка краёв, полное удаление пробелов, схлопывание повторных пробелов, очистка неразрывных пробелов и обработка строк в запросах. Примеры кода работают как в тонком клиенте, так и на сервере, в конфигурациях на обычных и управляемых формах.

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

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

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

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

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

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

КонецЕсли;

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

Признак того, что пробелы по краям мешают работе, — «невидимые» расхождения при сравнении: строки выглядят одинаково, но условие Строка1 = Строка2 возвращает Ложь. Перед сравнением всегда оборачивайте обе строки в СокрЛП().

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

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

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

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

Функция чувствительна к регистру, но для пробела это не имеет значения. Учтите, что СтрЗаменить обрабатывает только тот символ, который вы указали: обычный пробел с кодом 32. Табуляцию, неразрывный пробел и другие невидимые символы придётся удалять отдельными вызовами.

Для комплексной очистки удобно вызывать замену последовательно:

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

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

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

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

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

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

Удаление выполняется через функцию Символ(), которая возвращает символ по его коду:

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

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

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

Чтобы определить, какой именно символ «портит» строку, используйте функцию КодСимвола() — она возвращает код символа в указанной позиции. Пройдитесь по строке циклом и выведите коды подозрительных позиций:

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

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

КонецЦикла;

Код 32Обычный пробел

Удаляется СокрЛП и СтрЗаменить с обычным пробелом

Код 160Неразрывный пробел

Удаляется только через Символ(160), типичен для Excel и веба

Код 9Табуляция

Часто встречается в текстовых выгрузках, удаляется СокрЛП по краям

Коды 10 и 13Перевод строки и возврат каретки

Появляются при копировании многострочного текста

Схлопывание повторных пробелов внутри строки

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

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

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

КонецЦикла;

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

Такой подход корректно обрабатывает любое количество повторных пробелов и не требует регулярных выражений, которых во встроенном языке 1С нет. Функция СтрНайти() возвращает позицию первого вхождения подстроки или 0, если вхождение не найдено, поэтому цикл завершится, когда двойных пробелов не останется.

Этот приём полезен при нормализации наименований товаров и контрагентов перед поиском дублей: сначала СокрЛП(), затем схлопывание, затем при необходимости приведение к одному регистру через ВРег() или НРег().

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

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

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

Запрос = Новый Запрос("ВЫБРАТЬ СОКРЛП(Товары.Наименование) КАК Наименование ИЗ Справочник.Товары КАК Товары");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

КонецЦикла;

При выгрузке в файлы (CSV, Excel, XML) пробелы в данных могут нарушить формат на стороне приёмника. Рекомендуется очищать строковые поля перед записью: обрезать края через СокрЛП() и удалять недопустимые для формата символы. При загрузке — наоборот, очищать сразу после чтения, до записи в базу, чтобы «грязные» данные не попадали в справочники и документы.

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

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

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

Вторая частая проблема — попытка удалить неразрывный пробел обычной заменой пробела. Внешне строка очищается, но сравнение по-прежнему не работает. Всегда проверяйте данные из внешних источников на символ с кодом 160.

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

Типичные ошибки
01
Вызов СокрЛП(Строка) без присваивания — строка не меняется
02
Замена обычного пробела при наличии неразрывного — сравнение строк по-прежнему ложно
03
Преобразование в число без удаления Символ(160) — ошибка преобразования значения
04
Попытка использовать СтрЗаменить в тексте запроса — такой функции в языке запросов нет

Проверить результат очистки можно выводом длины строки до и после обработки через СтрДлина() или выводом кодов символов. Если после очистки длина не совпадает с ожидаемой — в строке остались невидимые символы, определите их коды через КодСимвола().

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

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

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

Равна количеству видимых символов

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

Больше — остались невидимые символы

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

Результат Истина

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

Ложь — проверьте коды символов

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

Выполняется без ошибки

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

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

Итог

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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