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

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

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

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

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

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

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

Какие бывают пробелы и почему это важно

Прежде чем очищать строку, полезно понять, какой именно символ мешает. В данных 1С встречаются минимум три разных «пробела»: обычный пробел (код 32), неразрывный пробел (код 160, часто приходит из Excel и веб-страниц) и символ табуляции (код 9). Визуально все они выглядят как отступ, но функция СокрЛП и замена обычного пробела неразрывный не трогают.

Определить код символа можно функцией КодСимвола. Например, если строка «Иванов Иван» не находится при поиске, проверьте код символа между словами: если это 160, перед вами неразрывный пробел, и менять его нужно отдельно.

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

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

ИсходнаяСтрока = "7 8 9 0 1 2 3 4 5 6";

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

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

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

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

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

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

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

Наименование = СокрЛП("   Стул офисный   ");

// Результат: "Стул офисный"

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

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

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

Строка = СтрЗаменить(Строка, Символ(160), " "); // неразрывный → обычный

Строка = СтрЗаменить(Строка, Символ(160), ""); // или удалить полностью

Строка = СтрЗаменить(Строка, Символ(9), ""); // удалить табуляцию

Часто удобнее не удалять неразрывные пробелы, а заменять их на обычные — тогда дальше строку можно обрабатывать стандартными СокрЛП и сравнивать с другими значениями. Такой приём особенно полезен при загрузке наименований из Excel.

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

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

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

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

КонецЦикла;

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

Этот приём хорошо подходит для ФИО, адресов и наименований товаров, где пробелы нужны, но их количество должно быть нормализовано. Цикл безопасен: как только двойных пробелов не останется, СтрНайти вернёт 0 и цикл завершится.

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

Универсальная функция очистки строки

На практике удобно оформить очистку как отдельную функцию в общем модуле, чтобы не дублировать код в обработках загрузки:

Функция УбратьВсеПробелы(Знач Строка) Экспорт

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

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

Пока СтрНайти(Результат, " ") > 0 Цикл

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

КонецЦикла;

Возврат СокрЛП(Результат);

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

Если нужно удалить пробелы полностью (для ИНН, номеров), добавьте в конце замену обычного пробела на пустую строку. Параметр объявлен с Знач, чтобы функция не меняла исходную переменную вызывающего кода — это защищает от неожиданных побочных эффектов.

Маршрут решения

Как выбрать способ очистки

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

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

После очистки проверьте результат не «на глаз», а программно. Надёжные признаки: длина строки (СтрДлина) совпадает с ожидаемой, сравнение с эталоном даёт Истина, поиск по очищенному значению находит нужный элемент справочника.

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

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

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

Сравнение даёт Истина

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

Строки визуально одинаковы, но сравнение ложно — ищите скрытые символы через КодСимвола

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

Длина уменьшилась на число удалённых пробелов

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

Длина не изменилась — результат СтрЗаменить не присвоен переменной

Поиск элемента справочника по строке
Норма

Элемент находится

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

Не находится — остались неразрывные пробелы или разный регистр

Типичные ошибки
01
Вызов СтрЗаменить без присваивания результата — исходная строка не меняется, функция возвращает новую
02
Попытка удалить неразрывный пробел заменой обычного — символы с кодами 32 и 160 разные, замена не срабатывает
03
Удаление всех пробелов из ФИО или наименований — слова слипаются в одно
04
Очистка данных только при выводе, а не при записи — в базе остаются грязные значения, ломающие поиск и обмен

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

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

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

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

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

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

Как убрать пробелы в числе, например «1 234 567»?

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

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

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

Чем СтрЗаменить отличается от СтрЗаменитьВхождения?

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

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

Перенос строки — это символы с кодами 13 и 10 или константа Символы.ПС. Удалите их заменой: СтрЗаменить(Строка, Символы.ПС, " "), а затем нормализуйте пробелы циклом и примените СокрЛП.

Итог

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

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