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