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

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

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

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

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

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

Какие функции 1С работают с пробелами

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

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

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

Базовый вариант для полной очистки строки от обычных пробелов:

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

Такой код уместен, когда пробелы в данных не нужны в принципе: например, при нормализации номеров телефонов, артикулов, ИНН, номеров банковских карт перед сравнением или поиском. Удалять все пробелы из ФИО или адресов обычно не требуется — там правильнее схлопывать повторные пробелы в один и обрезать края.

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

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

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

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

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

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

Как избавиться от неразрывных пробелов

Неразрывный пробел (код 160) — главный источник «магических» ошибок: строка выглядит чистой, но сравнение не проходит, а число не преобразуется. Такие символы приходят из Excel, при копировании из браузера, из выгрузок сторонних систем. СокрЛП и замена обычного пробела их не затрагивают.

Решение — явная замена символа с кодом 160:

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

Если неразрывный пробел нужно заменить на обычный (например, в тексте для печати), заменяйте его на пробел, а не на пустую строку: СтрЗаменить(Строка, Символ(160), " "). Иначе слова склеятся: «10 000 руб.» превратится в «10000руб.».

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

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

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

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

КонецЦикла;

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

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

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

Удаление пробелов в данных таблиц и реквизитах

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

Выборка = Справочники.Номенклатура.Выбрать();

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

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

Если НовоеНаименование <> Выборка.Наименование Тогда

Объект = Выборка.ПолучитьОбъект();

Объект.Наименование = НовоеНаименование;

Объект.Записать();

КонецЕсли;

КонецЦикла;

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

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

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

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

Типичные ошибки
01
Использование СокрЛП для удаления внутренних пробелов — функция обрезает только края
02
Забытая замена Символ(160) — неразрывные пробелы остаются и ломают сравнение
03
Замена неразрывного пробела на пустую строку в тексте — слова склеиваются
04
Запись всех элементов справочника без проверки изменения — лишняя нагрузка и блокировки
05
Чистка данных в рабочей базе без резервной копии и тестового прогона
Контрольные точки

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

СтрНайти(Строка, " ")
Норма

Возвращает 0 — обычных пробелов нет

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

Больше 0 — пробелы остались

СтрНайти(Строка, Символ(160))
Норма

Возвращает 0 — неразрывных пробелов нет

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

Больше 0 — требуется замена Символ(160)

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

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

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

Равенства нет — проверьте коды символов через КодСимвола

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

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

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

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

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

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

Перед вызовом Число() выполните две замены: обычного пробела и Символ(160) на пустую строку. Excel часто вставляет неразрывный пробел как разделитель разрядов, поэтому одной замены обычного пробела недостаточно.

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

В языке запросов 1С нет функции замены подстроки, поэтому полноценно удалить пробелы запросом нельзя. Запросом можно только отобрать записи (например, через ПОДОБНО с шаблоном "% %"), а саму очистку выполняют в коде при обходе выборки.

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

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

Опасно ли массово чистить наименования в справочнике?

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

Итог

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

Все пробелы удаляет СтрЗаменить(Строка, " ", ""), а СокрЛП работает только по краям. Неразрывный пробел убирается отдельной заменой Символ(160). Массовую чистку данных выполняйте с резервной копией, тестовым прогоном и записью только изменённых элементов.