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

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

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

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

Лишние пробелы в строках — одна из самых частых причин ошибок при обмене данными, поиске контрагентов по наименованию и сравнении значений в 1С. Строка «ООО Ромашка» с пробелом в конце не равна строке «ООО Ромашка» без него, и из-за этого ломаются соединения таблиц, дублируются элементы справочников и «не находятся» документы.

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

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

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

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

Пример типичного использования при записи наименования элемента справочника:

Наименование = СокрЛП(ДанныеИзФайла.Наименование);

// " ООО Ромашка " превратится в "ООО Ромашка"

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

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

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

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

// "7715 012345" превратится в "7715012345"

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

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

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

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

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

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

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

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

Для удаления неразрывного пробела используйте функцию Символ(160):

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

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

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

СокрЛП не помогаетВероятен неразрывный пробел

Проверьте код символа функцией КодСимвола

Пробел внутри строкиСокрЛП не подходит

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

Строки из Excel или сайтаВозможны символы 160, 9, 13, 10

Обрабатывайте набор невидимых символов

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

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

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

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

КонецЦикла;

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

Этот приём безопасен и не зависит от количества пробелов подряд: три пробела сначала станут двумя, затем одним. Перед циклом полезно заменить неразрывные пробелы на обычные, иначе комбинация «обычный + неразрывный» не будет найдена.

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

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

При поиске элемента справочника по наименованию всегда обрезайте и искомое значение, и учитывайте, что в базе могут лежать «грязные» данные. Если дубли уже накопились, потребуется разовая обработка, которая пройдёт по справочнику, обрежет наименования и найдёт совпадения.

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

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

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

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

Проверить, что пробелы действительно удалены, помогают функции СтрДлина и КодСимвола. Сравните длину строки до и после обработки; если строка «на вид» пустая, но СтрДлина возвращает число больше нуля — в ней остались невидимые символы. Пройдитесь по строке циклом и выведите коды символов, чтобы увидеть, что именно осталось.

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

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

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

Совпадает с числом видимых символов

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

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

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

СокрЛП(Строка1) = СокрЛП(Строка2)

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

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

Коды символов
Норма

Только коды букв, цифр и нужных знаков

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

Присутствуют коды 160, 9, 13, 10

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

Типичные ошибки
01
Вызов СокрЛП(Строка) без присваивания результата — строка не меняется, нужно Строка = СокрЛП(Строка)
02
Ожидание, что СокрЛП уберёт пробелы внутри строки — она обрезает только края
03
Игнорирование неразрывного пробела Символ(160) — сравнение строк не срабатывает
04
Удаление всех пробелов в ФИО или адресе — слова склеиваются, данные портятся
05
Обработка только новых данных при наличии старых «грязных» записей в базе

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

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

Прямой функции обрезки пробелов в языке запросов нет. Практичные варианты: обработать строки в коде после выполнения запроса, нормализовать данные при записи в базу или использовать выражение ВЫРАЗИТЬ с ограничением длины, если задача — только отсечь хвост строки фиксированной длины.

Почему СокрЛП не удаляет пробел?

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

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

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

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

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

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

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

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

Сравните СтрДлина(Строка) с числом видимых символов или пройдите циклом по строке, выводя КодСимвола(Строка, НомерПозиции). Коды 9, 10, 13 и 160 указывают на табуляцию, переносы строки и неразрывный пробел.

Итог

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

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