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