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