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

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

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

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

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

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

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

Удаление пробелов в начале и конце строки

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

  • СокрЛ(Строка) — удаляет пробелы слева (в начале строки);
  • СокрП(Строка) — удаляет пробелы справа (в конце строки);
  • СокрЛП(Строка) — удаляет пробелы с обеих сторон одновременно.

Пример использования:

Наименование = "   Кресло офисное   ";

Результат = СокрЛП(Наименование);

// Результат: "Кресло офисное"

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

// ТолькоСлева: "Кресло офисное "

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

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

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

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

Артикул = "АБВ 123 456";

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

// Результат: "АБВ123456"

Вместо литерала пробела " " можно использовать Символ(32) — это явно показывает, что удаляется именно символ с кодом 32, а не случайный символ, попавший в код. Такой стиль предпочтительнее в командной разработке, потому что пробел в кавычках легко потерять при чтении.

Типичные сценарии, где нужно удалить все пробелы: нормализация номеров телефонов перед сравнением, очистка артикулов и штрихкодов, подготовка строки для преобразования в число через Число(). Например, строка "1 234 567,89" не преобразуется в число, пока из неё не убраны разделители разрядов.

СтрокаСуммы = "1 234 567,89";

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

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

Сумма = Число(ЧистаяСтрока);

Неразрывный пробел и другие «невидимые» символы

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

Для удаления неразрывного пробела нужна отдельная замена:

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

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

Также в данных встречаются табуляция (код 9), перенос строки (код 10) и возврат каретки (код 13). Универсальная функция очистки строки может выглядеть так:

Функция ОчиститьСтроку(Знач Строка) Экспорт

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

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

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

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

Возврат СокрЛП(Строка);

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

Чтобы понять, какие именно символы скрыты в строке, пройдите по ней циклом и выведите коды символов:

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

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

Сообщить("Позиция " + Позиция + ": код " + Код);

КонецЦикла;

Удаление пробелов в запросах

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

ВЫБРАТЬ

СОКРЛП(Номенклатура.Наименование) КАК Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

Убрать пробелы внутри строки штатными средствами запроса нельзя. Если требуется сравнение без учёта пробелов внутри, данные обычно выгружают в таблицу значений и обрабатывают кодом, либо нормализуют значения заранее при записи в базу. Более надёжный подход — хранить данные уже очищенными, выполняя СокрЛП() в обработчиках ПередЗаписью или при загрузке.

Для поиска с учётом возможных лишних пробелов по краям в условии запроса можно применять ПОДОБНО с шаблоном, но это замедляет выборку на больших таблицах, так как индекс не используется.

Сравнение способов

СокрЛП()

Убирает пробелы, табуляции и переносы по краям строки. Не трогает внутренние пробелы и неразрывный пробел.

СтрЗаменить()

Удаляет или заменяет любые символы в любом месте строки, включая неразрывные пробелы. Требует явного указания кода символа.

СОКРЛП() в запросе

Работает на стороне СУБД, удобен в отчётах. Не умеет убирать пробелы внутри строки.

Удаление пробелов между словами до одного

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

Вариант через многократную замену двойных пробелов:

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

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

КонецЦикла;

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

Вариант через разбиение на слова — предпочтителен, если пробелов много, так как цикл замен работает медленнее на длинных строках:

МассивСлов = СтрРазделить(Строка, " ", Ложь);

Строка = СокрЛП(СтрСоединить(МассивСлов, " "));

Третий параметр Ложь в СтрРазделить() отбрасывает пустые элементы, которые возникают из-за повторных пробелов. Такая нормализация полезна для ФИО, адресов и наименований перед записью в базу или перед проверкой на дубли.

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

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

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

Частые ошибки при удалении пробелов в 1С:

  • вызов СокрЛП(Строка) без присваивания результата — строка остаётся прежней;
  • попытка убрать неразрывный пробел через СокрЛП() или замену обычного пробела;
  • удаление всех пробелов там, где они значимы, — например, в ФИО или адресах;
  • очистка данных при каждом чтении вместо нормализации при записи — лишняя нагрузка и риск рассинхронизации;
  • сравнение строк без предварительной очистки обеих сторон — дубли и «не найденные» элементы справочников.

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

Типичные ошибки
01
СокрЛП(Строка) без присвоения — результат теряется, строка не меняется
02
Замена только символа 32 — неразрывный пробел (160) остаётся и ломает сравнение
03
Удаление всех пробелов из ФИО и адресов — данные становятся нечитаемыми
04
Массовая перезапись справочников без копии базы и тестового прогона
Контрольные точки

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

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

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

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

Длина не изменилась — вероятно, результат не присвоен

Крайние символы строки
Норма

КодСимвола() по краям показывает буквы или цифры

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

Код 160 или 9 по краям — остались спецсимволы

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

Очищенная строка равна эталонному значению

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

Строки визуально совпадают, но сравнение ложно — скрытый символ

Когда пробелы удалять нельзя

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

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

Итог

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

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

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

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

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

Как убрать пробелы из числа, хранящегося как строка?

Удалите пробелы и неразрывные пробелы через СтрЗаменить, замените запятую на точку при необходимости, затем преобразуйте через Число(). Учтите, что разделители разрядов в данных из Excel часто являются именно неразрывными пробелами.

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

Нет, в языке запросов 1С доступна только СОКРЛП() для краёв поля. Для очистки внутри строки данные обрабатывают встроенным языком после выгрузки результата запроса или нормализуют заранее при записи.

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

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

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

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

Удаляет ли СокрЛП табуляцию и перенос строки?

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