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