Разработка и Конфигурация · 9 мин
Как удалить пробелы в строке 1С
Как удалить пробелы в строке 1С: функции СокрЛ, СокрП, СокрЛП, СтрЗаменить, удаление неразрывных пробелов и табуляций. Примеры кода и типичные ошибки.
Лишние пробелы в строках — одна из самых частых причин ошибок при обмене данными, поиске контрагентов по наименованию и сравнении значений в 1С. Строка «ООО Ромашка» с пробелом в конце не равна строке «ООО Ромашка» без него, и из-за этого ломаются соединения таблиц, дублируются элементы справочников и «не находятся» документы.
Во встроенном языке 1С есть несколько штатных средств для удаления пробелов: функции СокрЛ, СокрП, СокрЛП для обрезки краёв строки, функция СтрЗаменить для удаления пробелов внутри строки, а также приёмы работы с неразрывными пробелами и другими невидимыми символами. Выбор зависит от того, где именно стоят пробелы и нужно ли сохранить разбиение текста на слова.
Ниже разобраны все основные способы с примерами кода, условиями выбора, проверкой результата и типичными ошибками. Материал подходит для любых конфигураций на платформе 1С:Предприятие 8, поскольку перечисленные функции работают одинаково и в управляемых, и в обычных формах.
Удаление пробелов по краям строки: СокрЛ, СокрП, СокрЛП
Базовая задача — убрать пробелы в начале и в конце строки. Для этого во встроенном языке есть три родственные функции: СокрЛ удаляет пробелы слева, СокрП — справа, СокрЛП — с обеих сторон. Все три не изменяют исходную переменную, а возвращают новую строку, поэтому результат нужно присваивать.
Пример типичного использования при записи наименования элемента справочника:
Наименование = СокрЛП(ДанныеИзФайла.Наименование);
// " ООО Ромашка " превратится в "ООО Ромашка"
Важная особенность: функции семейства СокрЛП удаляют не только обычные пробелы, но и другие незначащие символы по краям — табуляции и переносы строк. Это удобно при обработке многострочных полей, скопированных из Excel или веб-форм.
Удаление всех пробелов в строке через СтрЗаменить
Если пробел нужно убрать полностью — например, при нормализации номера телефона, артикула или ИНН, где пробелы попадают в середину значения, — используйте функцию СтрЗаменить. Она заменяет все вхождения подстроки на другую подстроку, в том числе на пустую.
ИНН = СтрЗаменить(ИНН, " ", "");
// "7715 012345" превратится в "7715012345"
Функция работает со всеми вхождениями сразу, цикл не нужен. Учтите, что замена регистрозависима для букв, но для пробела это не имеет значения. Если нужно убрать и пробелы, и дефисы, и скобки — вызывайте СтрЗаменить последовательно для каждого символа:
Телефон = СтрЗаменить(Телефон, " ", "");
Телефон = СтрЗаменить(Телефон, "-", "");
Телефон = СтрЗаменить(Телефон, "(", "");
Телефон = СтрЗаменить(Телефон, ")", "");
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, " ", "");Неразрывный пробел и другие невидимые символы
Самая коварная ситуация — когда строка выглядит «чистой», но сравнение всё равно не проходит. Частая причина — неразрывный пробел (код символа 160), который попадает в данные при копировании из Word, Excel, веб-страниц и выгрузок других программ. Визуально он неотличим от обычного пробела, но СокрЛП и замена обычного пробела его не удаляют.
Для удаления неразрывного пробела используйте функцию Символ(160):
Строка = СтрЗаменить(Строка, Символ(160), " ");
Строка = СокрЛП(Строка);
Аналогично обрабатываются табуляция (Символ(9)) и перенос строки (Символы.ПС). Если источник данных «грязный» и состав мусорных символов неизвестен, надёжнее написать функцию, которая оставляет только допустимые символы — буквы, цифры и нужные знаки препинания.
Проверьте код символа функцией КодСимвола
Используйте СтрЗаменить
Обрабатывайте набор невидимых символов
Как убрать только лишние пробелы между словами
Отдельный сценарий — строка, где пробелы между словами нужны, но двойные и тройные пробелы надо сжать до одинарных. Здесь СтрЗаменить с пустой заменой не подходит: она склеит слова. Решение — циклическая замена двойного пробела на одинарный до тех пор, пока двойные не исчезнут:
Пока СтрНайти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;
Строка = СокрЛП(Строка);
Этот приём безопасен и не зависит от количества пробелов подряд: три пробела сначала станут двумя, затем одним. Перед циклом полезно заменить неразрывные пробелы на обычные, иначе комбинация «обычный + неразрывный» не будет найдена.
Удаление пробелов в запросах и при сравнении строк
В языке запросов 1С нет прямого аналога СокрЛП для произвольной обработки, но при соединении таблиц по строковым полям пробелы часто мешают. Практичные варианты: нормализовать данные заранее при записи (лучший путь), либо выполнять сравнение в коде после выборки, приводя обе строки через СокрЛП и, при необходимости, ВРег или НРег.
При поиске элемента справочника по наименованию всегда обрезайте и искомое значение, и учитывайте, что в базе могут лежать «грязные» данные. Если дубли уже накопились, потребуется разовая обработка, которая пройдёт по справочнику, обрежет наименования и найдёт совпадения.
Как выбрать способ
Проверка результата и типичные ошибки
Проверить, что пробелы действительно удалены, помогают функции СтрДлина и КодСимвола. Сравните длину строки до и после обработки; если строка «на вид» пустая, но СтрДлина возвращает число больше нуля — в ней остались невидимые символы. Пройдитесь по строке циклом и выведите коды символов, чтобы увидеть, что именно осталось.
Как проверить результат
Совпадает с числом видимых символов
Длина больше — есть невидимые символы
СокрЛП(Строка1) = СокрЛП(Строка2)
Строки не равны при визуальном совпадении
Только коды букв, цифр и нужных знаков
Присутствуют коды 160, 9, 13, 10
Частые ошибки при удалении пробелов связаны либо с непониманием того, что функции возвращают новое значение, либо с игнорированием неразрывных пробелов:
Частые вопросы
Как удалить пробелы в строке в запросе 1С?
Прямой функции обрезки пробелов в языке запросов нет. Практичные варианты: обработать строки в коде после выполнения запроса, нормализовать данные при записи в базу или использовать выражение ВЫРАЗИТЬ с ограничением длины, если задача — только отсечь хвост строки фиксированной длины.
Почему СокрЛП не удаляет пробел?
Скорее всего, это неразрывный пробел с кодом 160, который визуально неотличим от обычного. Проверьте символ функцией КодСимвола и удалите его через СтрЗаменить(Строка, Символ(160), ""). Также убедитесь, что результат функции присваивается переменной.
Как удалить пробелы в числе, например в разделителях разрядов?
Разделитель разрядов при форматировании чисел — это обычно неразрывный пробел. Перед преобразованием строки в число выполните СтрЗаменить(Строка, Символ(160), "") и СтрЗаменить(Строка, " ", ""), затем используйте Число(). Иначе преобразование завершится ошибкой или даст неверный результат.
Как удалить пробелы из всех наименований справочника разом?
Напишите обработку: выберите элементы запросом, в цикле присвойте Наименование = СокрЛП(Наименование) и вызовите Записать(). Перед запуском на рабочей базе сделайте копию и проверьте, не появятся ли дубли наименований после обрезки.
Чем отличается СокрЛП от СтрЗаменить с пустой строкой?
СокрЛП удаляет незначащие символы только по краям строки и не трогает середину. СтрЗаменить(Строка, " ", "") удаляет все обычные пробелы в любом месте, склеивая слова. Выбор зависит от того, нужны ли пробелы внутри строки.
Как проверить, есть ли в строке невидимые символы?
Сравните СтрДлина(Строка) с числом видимых символов или пройдите циклом по строке, выводя КодСимвола(Строка, НомерПозиции). Коды 9, 10, 13 и 160 указывают на табуляцию, переносы строки и неразрывный пробел.
Что важно запомнить
СокрЛП очищает края строки, СтрЗаменить убирает пробелы внутри, а неразрывный пробел Символ(160) требует отдельной обработки. Результат функций всегда присваивайте переменной, а перед массовой правкой данных делайте резервную копию базы.