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

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

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

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

Лишние пробелы в строке — одна из самых частых причин ошибок при обмене данными, поиске по справочникам и сравнении строк в 1С. Наименование «ООО Ромашка» и «ООО  Ромашка» для пользователя выглядят одинаково, но для платформы это разные значения: поиск не находит элемент, сравнение возвращает «Ложь», а в выгрузке появляются «грязные» данные.

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

Ниже разобраны все рабочие способы: от простой обрезки краёв до универсальной функции нормализации строки, а также типичные ошибки и способы проверить результат.

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

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

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

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

Строка = "  ООО Ромашка  ";

Результат = СокрЛП(Строка); // "ООО Ромашка"

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

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

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

Строка = "ООО   Ромашка    и   партнеры";

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

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

КонецЦикла;

Строка = СокрЛП(Строка); // "ООО Ромашка и партнеры"

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

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

1c
Функция НормализоватьСтроку(Знач Строка) Экспорт
    Строка = СтрЗаменить(Строка, Символ(160), " ");
    Пока СтрНайти(Строка, "  ") > 0 Цикл
        Строка = СтрЗаменить(Строка, "  ", " ");
    КонецЦикла;
    Возврат СокрЛП(Строка);
КонецФункции

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

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

Диагностика простая: пройдите по строке посимвольно и выведите коды символов. Любой код, отличный от 32 на позиции «пробела», — это невидимый символ.

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

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

Сообщить(Символ + " = " + КодСимвола(Символ));

КонецЦикла;

Удаление выполняется через явную замену: Строка = СтрЗаменить(Строка, Символ(160), " "). Табуляцию обычно тоже заменяют на пробел (Символ(9)), а переводы строк — в зависимости от задачи: либо на пробел, либо оставляют, если многострочность значима.

Универсальная функция очистки и где её разместить

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

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

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

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

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

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

КонецЦикла;

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

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

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

Вызывать нормализацию стоит в двух точках: при вводе данных (обработчики ПриИзменении, ПередЗаписью) и при загрузке из внешних источников (обмены, импорт из Excel, веб-сервисы). Это закрывает оба канала поступления «грязных» строк.

Очистка пробелов в запросах и при сравнении строк

В языке запросов 1С нет аналога СокрЛП, поэтому сравнение строк с пробелами в запросе — отдельная задача. Если в поле могут быть ведущие или конечные пробелы, условие ГДЕ Наименование = &Наименование не найдёт элемент, даже если визуально строки совпадают.

Практические варианты: нормализовать параметр на стороне кода перед передачей в запрос и хранить в базе уже очищенные значения; либо использовать ПОДОБНО с шаблоном, если нужен поиск по подстроке. Конструкция вида ВЫРАЗИТЬ(...) пробелы не убирает — она меняет только тип.

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

Сравнение вариантов

СокрЛП

Подходит для пробелов по краям строки. Не трогает середину и неразрывные пробелы.

Цикл СтрЗаменить

Убирает повторные пробелы внутри строки. Требует предварительной замены неразрывных пробелов.

Универсальная функция в общем модуле

Закрывает все случаи и переиспользуется. Требует добавления модуля в конфигурацию или расширение.

Нормализация при записи + обработка базы

Решает проблему системно, включая запросы и поиск. Требует одноразовой обработки существующих данных.

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

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

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

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

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

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

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

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

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

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

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

Сравнение возвращает Истина

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

Ложь при визуально одинаковых строках — остался невидимый символ

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

Элемент находится с первого раза

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

Поиск не находит существующий элемент — данные в базе не нормализованы

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

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

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

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

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

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

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

Удаляет ли СокрЛП переносы строк?

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

Как массово очистить наименования в уже заполненном справочнике?

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

Что быстрее: цикл СтрЗаменить или посимвольный разбор строки?

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

Итог

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

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