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