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

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

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

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

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

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

Важно понимать ограничение: штатные функции удаляют только обычные пробелы и некоторые служебные символы. Неразрывный пробел (символ 160), который часто попадает в данные при копировании из Excel или веб-страниц, ими не обрезается — для него нужна отдельная обработка через СтрЗаменить.

Функции СокрЛ, СокрП и СокрЛП: что выбрать

Все три функции работают одинаково просто: принимают строку и возвращают новую строку без пробельных символов с соответствующей стороны. Исходная переменная не изменяется — результат нужно присваивать.

Различия между функциями:

  • СокрЛ(Строка) — удаляет пробелы только слева (в начале строки);
  • СокрП(Строка) — удаляет пробелы только справа (в конце строки);
  • СокрЛП(Строка) — удаляет пробелы с обеих сторон.

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

Базовый пример: обрезка пробелов справа в коде

Минимальный рабочий пример выглядит так:

Наименование = "ООО «Ромашка»   ";

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

// Результат: "ООО «Ромашка»"

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.Наименование = &Наименование";

Запрос.УстановитьПараметр("Наименование", СокрЛП(ВведённоеНаименование));

Обратите внимание: обрезать пробелы нужно у обоих сравниваемых значений. Если в базе наименование хранится с пробелом в конце, а вы очищаете только введённую строку, сравнение снова не сработает. Поэтому надёжнее либо чистить данные при записи в базу, либо обрезать обе стороны при сравнении.

Удаление неразрывных пробелов и других невидимых символов

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

Надёжный приём — сначала заменить неразрывный пробел на обычный или на пустую строку, затем применить обрезку:

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

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

Кроме неразрывного пробела в данных встречаются символы табуляции (код 9), перевода строки (код 10) и возврата каретки (код 13). СокрЛП удаляет их, если они находятся по краям строки, но если они в середине — потребуется СтрЗаменить. Для диагностики полезно вывести код последнего символа строки: КодСимвола(Строка, СтрДлина(Строка)) — так вы точно поймёте, что именно мешает сравнению.

Как найти невидимый символ в конце строки
  1. 1
    Определите длину строки: СтрДлина(Строка) — завышенная длина при «пустом» виде указывает на скрытые символы.
  2. 2
    Выведите код последнего символа: КодСимвола(Строка, СтрДлина(Строка)).
  3. 3
    Если код 160 — это неразрывный пробел, замените его через СтрЗаменить.
  4. 4
    После замены примените СокрЛП и повторно проверьте длину строки.

Обрезка пробелов в запросах и при выгрузке данных

В языке запросов 1С нет прямого аналога СокрП, поэтому сравнивать строки «как есть» в запросе рискованно. Стандартный подход — очищать параметры до передачи в запрос, а данные в базе поддерживать в чистом виде на этапе записи.

Если «грязные» данные уже лежат в базе и нужно сопоставить их в запросе, применяют обходные пути: сравнение по ПОДОБНО с подстановкой, соединение через вычисляемые поля в пакете запросов с временными таблицами или предварительную разовую обработку, которая пройдёт по справочнику и перезапишет наименования через СокрЛП. Разовая чистка — самый надёжный вариант: она устраняет причину, а не симптом.

При выгрузке в файлы (CSV, Excel, XML) обрезайте строки непосредственно в момент формирования строки выгрузки. Это дешёвая операция, которая избавляет принимающую сторону от ошибок импорта.

Пробелы в числах и при преобразовании типов

Отдельный сценарий — строки, которые должны стать числами. Пробелы и неразрывные пробелы внутри такой строки приводят либо к ошибке преобразования, либо к нулевому результату при использовании конструкций с описанием типов. Здесь обрезки по краям недостаточно: пробелы-разделители разрядов находятся в середине строки.

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

Строка = СтрЗаменить(Строка, Символ(160), ""); // неразрывные пробелы

Строка = СтрЗаменить(Строка, " ", ""); // обычные пробелы

Строка = СтрЗаменить(Строка, ",", "."); // если нужен точечный разделитель

Число = Число(Строка);

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

Способы очистки строки

СокрП

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

СокрЛП

Универсальная обрезка с обеих сторон. Стандартный выбор для пользовательского ввода и загрузки данных.

СтрЗаменить + СокрЛП

Когда в данных есть неразрывные пробелы или табуляции. Требует явного указания кодов символов.

Регулярные выражения (через COM/VBScript)

Сложные шаблоны очистки. Ограничение: зависит от платформы Windows и усложняет поддержку кода.

Типичные ошибки при удалении пробелов

Первая и самая массовая ошибка — вызов СокрП(Строка) без присваивания результата. Функция не меняет переменную «на месте», поэтому строка остаётся с пробелами, а код молча работает неправильно.

Вторая ошибка — ожидание, что СокрЛП удалит неразрывный пробел. Симптом классический: длина строки после обрезки не уменьшилась, сравнение не работает, а визуально всё чисто. Диагностируется через КодСимвола.

Третья ошибка — обрезка только одной из сравниваемых сторон. Если в базе лежит «Иванов Иван » с пробелом, а вы очищаете только поисковую строку, совпадения не будет. Чистить нужно либо обе стороны в момент сравнения, либо данные в базе разово и навсегда.

Типичные ошибки
01
СокрП(Строка) без присваивания — результат теряется, строка не меняется.
02
Попытка убрать неразрывный пробел функцией СокрЛП — символ 160 не удаляется, нужна СтрЗаменить.
03
Обрезка только одной стороны при сравнении — данные в базе с пробелами не совпадут с очищенной строкой.
04
Удаление всех пробелов из строки, где они значимы, — например, в ФИО или адресах это портит данные.

Проверка результата

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

Для наглядной проверки обрамите строку маркерами при выводе, например: "[" + Строка + "]" — пробелы в конце сразу станут видны. В отладчике пробелы в конце значения не отображаются, поэтому полагаться только на просмотр значения переменной нельзя.

Контрольные точки

Как проверить результат

Длина строки до и после СокрП
Норма

Длина уменьшилась на число удалённых пробелов

Тревожный признак

Длина не изменилась — вероятен неразрывный пробел

Вывод строки в квадратных скобках
Норма

Закрывающая скобка вплотную к тексту

Тревожный признак

Между текстом и скобкой виден отступ

Сравнение двух очищенных строк
Норма

СокрЛП(А) = СокрЛП(Б) даёт Истина

Тревожный признак

Строки визуально равны, но сравнение ложно — смотрите коды символов

Итог

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

Пробелы справа убирает СокрП, с обеих сторон — СокрЛП, результат обязательно присваивается. Неразрывный пробел (код 160) удаляется только через СтрЗаменить. Чистите данные при записи в базу, а не при каждом сравнении, и проверяйте результат через длину строки.

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

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

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

Чем СокрП отличается от СокрЛП?

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

Можно ли убрать пробелы справа прямо в запросе 1С?

Прямого аналога СокрП в языке запросов нет. Обычно очищают параметры до передачи в запрос, а данные в базе приводят в порядок разовой обработкой, перезаписывающей реквизиты через СокрЛП.

Как убрать пробелы внутри числа, загруженного из Excel?

Удалите неразрывные и обычные пробелы через СтрЗаменить по всей строке (обрезка по краям не поможет — разделители разрядов стоят в середине), затем преобразуйте строку функцией Число().

Изменяет ли СокрП исходную переменную?

Нет. Функция возвращает новую строку, поэтому результат нужно присвоить: Строка = СокрП(Строка). Вызов без присваивания ни на что не влияет.

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

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