Разработка и Конфигурация · 11 мин
Как удалить пробелы из строки в 1С
Как удалить пробелы из строки в 1С: СокрЛП, СтрЗаменить, неразрывные пробелы, обработка табличных документов и типичные ошибки при очистке данных.
Пробелы в строковых данных — одна из самых частых причин ошибок при обмене данными, поиске по справочникам и сравнении строк в 1С. Лишний пробел в конце наименования контрагента делает строку «другой» для платформы: поиск не находит элемент, сравнение возвращает Ложь, а при выгрузке в Excel или стороннюю систему данные выглядят некорректно.
Встроенный язык 1С предоставляет несколько инструментов для очистки строк: функции СокрЛ, СокрП и СокрЛП убирают незначащие символы по краям, СтрЗаменить позволяет удалить или заменить пробелы в любом месте строки, а для сложных случаев используют посимвольный разбор или регулярные выражения через внешние компоненты.
Важно понимать, что «пробел» в данных — это не всегда символ с кодом 32. В строках, скопированных из Excel, Word или веб-страниц, часто встречаются неразрывные пробелы (код 160), табуляции и переводы строк. Стандартные функции обрабатывают их по-разному, и это нужно учитывать при выборе способа очистки.
Функции СокрЛ, СокрП и СокрЛП: удаление пробелов по краям строки
Основной инструмент очистки строк в 1С — функция СокрЛП(). Она удаляет незначащие символы (пробелы, табуляции, переводы строк) слева и справа от строки, не трогая содержимое в середине. Это стандартный приём перед сравнением строк, записью в базу или поиском.
Наименование = СокрЛП(Наименование);
Если СокрЛП(Строка1) = СокрЛП(Строка2) Тогда
// строки совпадают без учёта краевых пробелов
КонецЕсли;
Если нужно очистить только одну сторону, используют СокрЛ() — удаляет символы слева, или СокрП() — справа. На практике СокрЛП применяется чаще всего, а односторонние варианты полезны, когда, например, отступ слева несёт смысл (иерархия в текстовом представлении дерева).
Ключевое ограничение: СокрЛП не удаляет неразрывный пробел (символ с кодом 160). Если строка пришла из Excel или веб-формы и СокрЛП «не работает», почти наверняка в данных именно неразрывный пробел. Проверить это можно функцией КодСимвола() — для обычного пробела она вернёт 32, для неразрывного — 160.
СтрЗаменить: удаление всех пробелов внутри строки
Когда нужно убрать пробелы не только по краям, но и внутри строки — например, при нормализации номера телефона, ИНН, артикула или номера документа — используется функция СтрЗаменить(). Она заменяет все вхождения подстроки на указанное значение, в том числе на пустую строку.
НомерБезПробелов = СтрЗаменить(Номер, " ", "");
ИНН = СтрЗаменить(ИНН, " ", "");
// удаление неразрывных пробелов
Строка = СтрЗаменить(Строка, Символ(160), " ");
Типовой приём — сначала заменить неразрывные пробелы на обычные, а затем применить СокрЛП или удалить пробелы полностью. Такой двухшаговый подход гарантирует, что строка будет очищена независимо от того, какой именно «пробел» попал в данные.
Учтите, что СтрЗаменить заменяет все вхождения без возможности ограничить количество. Если нужно удалить только первый пробел или пробел в конкретной позиции, придётся работать через Найти(), Лев(), Прав() и Сред().
Строка = СтрЗаменить(Строка, Символ(160), " ");
Строка = СокрЛП(Строка);
Пока Найти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;Удаление двойных и множественных пробелов
Частая задача — не удалить пробелы полностью, а привести строку к нормальному виду: оставить одиночные пробелы между словами, убрав двойные и тройные. Такая ситуация возникает при импорте наименований товаров и адресов из внешних источников.
Классическое решение — цикл с заменой двойного пробела на одинарный до тех пор, пока вхождения не исчезнут. Это простой и надёжный способ, не требующий внешних компонентов.
Строка = СокрЛП(Строка);
Пока Найти(Строка, " ") > 0 Цикл
Строка = СтрЗаменить(Строка, " ", " ");
КонецЦикла;
Перед циклом обязательно замените неразрывные пробелы на обычные и примените СокрЛП — иначе комбинация «обычный пробел + неразрывный» не будет найдена поиском двойного пробела, и лишние символы останутся в строке.
Удаление пробелов при работе с числами и датами
Особый случай — строки, которые должны быть числами. При выгрузке из Excel или банковских систем числа часто содержат неразрывные пробелы в качестве разделителей разрядов: «1 250 000,50». Функция Число() такую строку не преобразует и вернёт 0 или вызовет ошибку.
Правильная последовательность: сначала удалить все пробелы (обычные и неразрывные), затем преобразовать в число. Для надёжности преобразование стоит оборачивать в попытку-исключение, если данные приходят из непроверенного источника.
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(160), "");
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", "");
Попытка
Значение = Число(СтрокаЧисла);
Исключение
Значение = 0; // или обработка ошибки
КонецПопытки;
Массовая очистка данных в справочниках и документах
Если пробелы уже накопились в базе — например, в наименованиях номенклатуры после импорта — нужна массовая обработка. Типовая схема: запрос выбирает элементы, где наименование отличается от очищенного варианта, затем в транзакции выполняется запись исправленных значений.
Для разовой операции удобно написать внешнюю обработку или выполнить код через консоль кода (в управляемых формах). Перед запуском на рабочей базе сделайте резервную копию и проверьте результат на ограниченной выборке — например, обработайте первые 50 элементов и просмотрите их глазами.
- 1Сделайте резервную копию базы или выгрузку затрагиваемых данных
- 2Напишите запрос, выбирающий элементы с лишними пробелами (Наименование <> очищенное значение)
- 3Протестируйте алгоритм очистки на 10–50 элементах и проверьте результат вручную
- 4Запустите полную обработку, желательно порциями с фиксацией транзакций
- 5После завершения проверьте поиск и сопоставление данных, которые раньше давали сбои
Обратите внимание: если наименования участвуют в синхронизации с другими системами или в обмене по правилам конвертации, изменение данных может повлиять на сопоставление объектов. В таких случаях очистку лучше согласовать с администратором обмена.
Выбор способа под разные задачи
Единого «правильного» способа нет — выбор зависит от того, где находятся пробелы и что должно получиться в результате. Таблица ниже помогает быстро сориентироваться.
| Задача | Способ | Ограничение |
|---|---|---|
| Пробелы по краям строки | СокрЛП() | Не удаляет неразрывный пробел (код 160) |
| Все пробелы в строке | СтрЗаменить(С, " ", "") | Удаляет и нужные пробелы между словами |
| Двойные пробелы → одинарные | Цикл со СтрЗаменить | Требует предварительной замены символа 160 |
| Пробелы в числах | СтрЗаменить + Число() | Проверять корректность через Попытка/Исключение |
| Табуляции, переводы строк | СтрЗаменить с Символ(9), Символы.ПС | Удаляются явно, СокрЛП трогает только края |
Сравнение вариантов
Подходит для очистки краёв строки перед сравнением или записью. Не трогает внутренние пробелы и неразрывный пробел.
Универсальный способ удалить или заменить любые символы, включая неразрывные пробелы и табуляции. Требует точного указания заменяемого символа.
Подходит для нормализации текста с сохранением одиночных пробелов между словами. Работает медленнее на очень длинных строках.
Типичные ошибки и как их избежать
Самая распространённая ошибка — ожидание, что СокрЛП удалит неразрывный пробел. Визуально строка выглядит очищенной, но сравнение по-прежнему возвращает Ложь. Диагностируется это через КодСимвола(): проверьте первый и последний символы строки.
Вторая ошибка — удаление всех пробелов там, где они значимы. Например, при очистке ФИО или адреса удаление внутренних пробелов сделает данные нечитаемыми. Всегда определяйте, какие именно пробелы лишние: краевые, множественные или все подряд.
Третья типичная проблема — очистка строки при выводе, но не при записи. Если пробелы попадают в базу при импорте, правильнее очищать данные на этапе загрузки, а не маскировать проблему в каждом отчёте и печатной форме.
Как проверить результат
СокрЛП(Строка1) = СокрЛП(Строка2) возвращает Истина для визуально одинаковых строк
Сравнение даёт Ложь — вероятно, остался неразрывный пробел или табуляция
КодСимвола не возвращает 32, 160, 9 по краям строки
Код 160 или 9 на краях — символы не удалены
Число() возвращает ожидаемое значение
Результат 0 или исключение — в строке остались посторонние символы
FAQ: частые вопросы об удалении пробелов в 1С
Почему СокрЛП не удаляет пробел в конце строки?
Скорее всего, это неразрывный пробел (код 160), а не обычный (код 32). Проверьте через КодСимвола(Прав(Строка, 1)). Если вернулось 160, сначала выполните СтрЗаменить(Строка, Символ(160), ""), затем СокрЛП.
Как удалить пробелы из строки в запросе 1С?
В языке запросов нет прямого аналога СокрЛП. Обычно данные выбираются запросом, а очистка выполняется уже в коде при обходе выборки. Для поиска строк с пробелами по краям можно сравнить поле с шаблоном через ПОДОБНО, например найти значения, начинающиеся с пробела.
Как убрать пробелы из номера документа?
Используйте СтрЗаменить(Номер, " ", "") с предварительной заменой неразрывных пробелов. Учтите, что изменение номера документа может нарушить нумерацию и связи с печатными формами — лучше очищать номер на этапе создания документа, а не исправлять задним числом.
Чем отличается СокрЛП от СтрЗаменить по производительности?
На обычных строках разница незаметна. СокрЛП работает быстрее, так как анализирует только края строки, тогда как СтрЗаменить проходит всю строку. На массовых обработках с сотнями тысяч строк разумно использовать СокрЛП там, где не нужно трогать внутренние пробелы.
Как удалить табуляции и переносы строк вместе с пробелами?
Комбинируйте СтрЗаменить для каждого символа: Символ(9) — табуляция, Символы.ПС и Символы.ВК — переносы строк. СокрЛП удаляет эти символы только по краям строки, внутри они сохраняются.
Можно ли использовать регулярные выражения для очистки строк в 1С?
Во встроенном языке нет штатной поддержки регулярных выражений. Их можно подключить через внешние компоненты или COM-объекты (например, VBScript.RegExp на Windows-сервере), но для типовых задач с пробелами достаточно СокрЛП и СтрЗаменить — это проще и переносимее.
Что важно запомнить
СокрЛП очищает края строки от обычных пробелов, СтрЗаменить удаляет пробелы в любом месте, а неразрывный пробел (Символ(160)) требует отдельной замены. Перед массовой очисткой данных делайте резервную копию и тестируйте алгоритм на небольшой выборке.