К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как убрать пробелы в строке в 1С

Как убрать пробелы в строке в 1С: функции СокрЛ, СокрП, СокрЛП, СтрЗаменить, удаление неразрывных пробелов и лишних пробелов между словами. Примеры кода.

Лишние пробелы в строковых данных — одна из самых частых причин проблем в 1С: не срабатывает поиск контрагента по наименованию, не совпадают артикулы при обмене, «плывут» печатные формы, а сравнение двух визуально одинаковых строк возвращает «Ложь». Пробелы попадают в базу при ручном вводе, копировании из Excel и Word, загрузке из файлов и веб-сервисов.

Во встроенном языке 1С есть несколько штатных средств для очистки строк: функции СокрЛ, СокрП, СокрЛП, СтрЗаменить, а также работа с символами через Символы.НПП. Выбор зависит от того, где стоят пробелы — по краям строки, внутри неё или между словами, и какие именно это пробелы: обычные или неразрывные.

Ниже разобраны все основные сценарии: от простого сокращения краевых пробелов до удаления неразрывных пробелов и схлопывания множественных пробелов между словами, а также типичные ошибки, которые приводят к порче данных.

Удаление пробелов по краям строки: СокрЛ, СокрП, СокрЛП

Самая распространённая задача — убрать пробелы в начале и в конце строки. Для этого в 1С есть три функции: СокрЛ удаляет пробельные символы слева, СокрП — справа, СокрЛП — с обеих сторон. В подавляющем большинстве случаев нужна именно СокрЛП.

Наименование = СокрЛП(Наименование);

// " ООО Ромашка " станет "ООО Ромашка"

Важно понимать, что СокрЛП удаляет не только обычные пробелы, но и другие незначащие символы по краям: табуляции, переводы строк, неразрывные пробелы. Поэтому для краевой очистки эта функция предпочтительнее ручной замены.

Типовое применение — обработка данных перед записью в базу: в обработчиках ПередЗаписью, при загрузке из файлов, при получении данных из форм. Сокращать пробелы лучше сразу на входе, а не в каждом месте, где строка сравнивается.

Удаление всех пробелов в строке через СтрЗаменить

Если пробелы нужно убрать полностью — например, при нормализации номера телефона, артикула, ИНН или кода, — используется функция СтрЗаменить с заменой пробела на пустую строку.

Артикул = СтрЗаменить(Артикул, " ", "");

// "АБВ 123 45" станет "АБВ12345"

Такой приём уместен только для технических идентификаторов, где пробел не несёт смысла. Применять его к ФИО, наименованиям или адресам нельзя — слова склеятся, и данные будут испорчены без возможности автоматического восстановления.

Удаление неразрывных пробелов

Неразрывный пробел (код 160) — частый источник «фантомных» проблем. Визуально он неотличим от обычного пробела, но СокрЛП внутри строки его не трогает, а сравнение строк с обычным пробелом не проходит. Он попадает в 1С при копировании из Excel, веб-страниц и при форматировании чисел (разделитель разрядов в строковом представлении).

Удалить его можно заменой символа Символы.НПП:

Строка = СтрЗаменить(Строка, Символы.НПП, " ");

// или удалить полностью:

Строка = СтрЗаменить(Строка, Символы.НПП, "");

Признак того, что в строке неразрывный пробел: СокрЛП не помогает, визуально пробел есть, но поиск подстроки с обычным пробелом его не находит. Проверить код конкретного символа можно функцией КодСимвола.

Схлопывание множественных пробелов между словами

Отдельный сценарий — строки вида «Иванов   Иван  Иванович», где между словами несколько пробелов подряд. Здесь краевая очистка не поможет, а полное удаление пробелов недопустимо. Стандартный приём — циклическая замена двойного пробела на одинарный до тех пор, пока двойные пробелы не исчезнут.

Пока СтрНайти(Строка, "  ") > 0 Цикл

Строка = СтрЗаменить(Строка, " ", " ");

КонецЦикла;

Строка = СокрЛП(Строка);

Перед циклом полезно заменить табуляции и неразрывные пробелы на обычный пробел — тогда цикл зачистит и их. Для переносов строк такая замена не всегда допустима: в многострочных полях (адреса, комментарии) перевод строки обычно нужно сохранить.

Порядок нормализации строки
  1. 1
    Замените неразрывные пробелы и табуляции на обычный пробел
  2. 2
    Циклом замените двойные пробелы на одинарные, пока они встречаются
  3. 3
    Примените СокрЛП для очистки краёв строки
  4. 4
    Проверьте результат на контрольном примере перед массовой обработкой

Где применять очистку пробелов на практике

Первое место — обмен данными и загрузка из файлов. При чтении Excel, CSV или XML каждое строковое значение разумно пропускать через СокрЛП, а ключевые поля для сопоставления (артикулы, коды, ИНН) — через полную нормализацию: удаление всех пробелов и приведение регистра.

Второе место — поиск и сопоставление объектов. Перед поиском элемента справочника по наименованию обе строки (искомую и критерий) нужно привести к одному виду, иначе «ООО Ромашка» и «ООО Ромашка» будут разными значениями. То же касается сравнения строк в запросах: там помогает выражение с СОКРЛП в самом запросе, но лучше хранить уже очищенные данные.

Третье место — печатные формы и выгрузки. Лишние пробелы в ФИО или адресе заметны в документах и могут стать причиной отказа при приёме электронных файлов контролирующими системами. Очистку здесь делают при формировании данных для макета.

Сравнение способов

СокрЛП

Краевые пробелы и служебные символы. Подходит почти всегда на входе данных, не трогает середину строки.

СтрЗаменить пробела на пустоту

Полное удаление пробелов. Только для кодов, артикулов, ИНН, телефонов — не для текстов.

Цикл замены двойных пробелов

Нормализация текстов с множественными пробелами между словами. Медленнее, но сохраняет читаемость.

Замена Символы.НПП

Борьба с неразрывными пробелами из Excel и форматированных чисел. Применяется до других видов очистки.

Типичные ошибки и как их избежать

Главная ошибка — очистка строки только в месте сравнения, а не при записи. Тогда в базе остаются «грязные» данные, и каждый новый участок кода вынужден повторять нормализацию, а где-то её забудут. Правильный подход — чистить при вводе и загрузке, хранить уже нормализованные значения.

Вторая ошибка — забыть про неразрывные пробелы и табуляции: разработчик применяет СокрЛП, видит, что пробелы «не удаляются», и начинает искать проблему не там. Третья — массовая обработка базы без резервной копии и без проверки на небольшой выборке: ошибка в логике замены испортит тысячи записей.

Типичные ошибки
01
Удаление всех пробелов в текстовом поле — слова склеиваются, данные теряются безвозвратно
02
Игнорирование неразрывных пробелов — сравнение строк не срабатывает, причина не видна глазом
03
Очистка только при сравнении, а не при записи — грязные данные копятся в базе
04
Массовая обработка без копии базы и теста на малой выборке — риск испортить данные целиком
Итог

Что важно запомнить

Краевые пробелы убирает СокрЛП, все пробелы — СтрЗаменить с пустой строкой, неразрывные — замена Символы.НПП, множественные — цикл замены двойных пробелов. Нормализуйте данные при записи, а не при каждом сравнении, и делайте копию перед массовой обработкой.

Частые вопросы

Почему СокрЛП не удаляет пробел внутри строки?

СокрЛП по определению работает только с краями строки. Пробелы в середине нужно убирать через СтрЗаменить или цикл замены двойных пробелов — в зависимости от того, нужно ли сохранить одиночные пробелы между словами.

Строка выглядит чистой, но сравнение не работает. Что проверить?

Скорее всего, в строке неразрывный пробел, табуляция или невидимый служебный символ. Проверьте коды символов через КодСимвола в цикле по строке и замените Символы.НПП и Символы.Таб на обычный пробел или пустую строку.

Как убрать пробелы в запросе 1С?

В языке запросов есть функция СОКРЛП для полей и параметров: например, «ГДЕ СОКРЛП(Наименование) = &Наименование». Для полного удаления пробелов в запросе штатной функции нет — такую нормализацию делают в коде до выполнения запроса.

Можно ли убрать пробелы из числа вида «1 234 567»?

Да, но сначала замените Символы.НПП, так как разделитель разрядов обычно неразрывный пробел, затем уберите обычные пробелы через СтрЗаменить. После этого строку можно преобразовать к числу.

Как массово почистить наименования в справочнике?

Напишите обработку: выборка элементов, нормализация наименования (замена НПП, цикл двойных пробелов, СокрЛП), запись только изменённых элементов. Обязательно сделайте копию базы и сначала проверьте логику на десятке записей.

Удалит ли СокрЛП переносы строк в конце текста?

Да, СокрЛП удаляет по краям не только пробелы, но и переводы строк, табуляции и другие незначащие символы. Переносы внутри многострочного текста при этом сохраняются.