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

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

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

Как убрать пробелы из строки в запросе 1С: функции СТРЗАМЕНИТЬ, СОКРЛП, СОКРЛ, СОКРП. Примеры кода, типичные ошибки и проверка результата.

Пробелы в строковых данных — частая причина «битых» соединений таблиц, дублей контрагентов и несработавших условий в запросах 1С. Номенклатура «Кабель ВВГ 3х2,5» и «Кабель ВВГ  3х2,5» с двойным пробелом для СУБД — разные значения, и соединение по наименованию молча потеряет часть строк.

В языке запросов 1С нет отдельной функции «убрать все пробелы», но задача решается штатными средствами: функцией СТРЗАМЕНИТЬ для удаления любых пробелов внутри строки и функциями СОКРЛП / СОКРЛ / СОКРП для обрезки пробелов по краям. Ниже — конкретный синтаксис, готовые примеры и разбор ограничений, о которых часто забывают.

Как убрать все пробелы из строки через СТРЗАМЕНИТЬ

Функция СТРЗАМЕНИТЬ(ИсходнаяСтрока, ЧтоЗаменить, НаЧтоЗаменить) заменяет все вхождения подстроки. Чтобы удалить пробелы полностью, вторым параметром передают одиночный пробел, а третьим — пустую строку:

ВЫБРАТЬ

СТРЗАМЕНИТЬ(Номенклатура.Наименование, " ", "") КАК НаименованиеБезПробелов

ИЗ

Справочник.Номенклатура КАК Номенклатура

В результате строка «Кабель ВВГ 3х2,5» превратится в «КабельВВГ3х2,5». Такой приём подходит, когда пробелы — мусор: например, при нормализации артикулов, штрихкодов, номеров документов, введённых вручную с лишними разделителями.

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

bsl
ВЫБРАТЬ СТРЗАМЕНИТЬ(Поле, " ", "") КАК СтрокаБезПробелов

Как убрать пробелы в начале и конце: СОКРЛП, СОКРЛ, СОКРП

Если пробелы мешают только по краям строки, используйте семейство функций сокращения. Они удаляют незначащие символы (пробелы, табуляции, переносы строк) слева, справа или с обеих сторон:

  • СОКРЛ(Поле) — убирает символы только слева;
  • СОКРП(Поле) — убирает символы только справа;
  • СОКРЛП(Поле) — убирает символы с обеих сторон.

Типовой пример — очистка наименования перед сравнением:

ВЫБРАТЬ

СОКРЛП(Контрагенты.Наименование) КАК Наименование

ИЗ

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

ГДЕ

СОКРЛП(Контрагенты.Наименование) = &Наименование

Практическая особенность: строковые поля фиксированной длины (тип Строка(50) без признака «переменная длина») платформа при чтении дополняет пробелами справа. Поэтому СОКРП или СОКРЛП в запросах к таким полям — практически обязательная операция, иначе сравнение строк даст ложное неравенство.

Сравнение вариантов

СТРЗАМЕНИТЬ(Поле, " ", "")

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

СОКРЛП(Поле)

Убирает пробелы, табуляции и переносы только по краям. Безопасен для текста, но не решает проблему двойных пробелов внутри.

Вложенные СТРЗАМЕНИТЬ

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

Как убрать неразрывные и двойные пробелы

Неразрывный пробел

Данные, скопированные из Excel, веб-страниц или пришедшие по обмену, часто содержат неразрывный пробел (код 160). Визуально он неотличим от обычного, но СТРЗАМЕНИТЬ(Поле, " ", "") его не заметит. Решение — вторая замена, где в качестве искомого символа вставлен сам неразрывный пробел:

ВЫБРАТЬ

СТРЗАМЕНИТЬ(СТРЗАМЕНИТЬ(Товары.Артикул, " ", ""), " ", "") КАК Артикул

ИЗ

Справочник.Товары КАК Товары

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

Двойные пробелы внутри текста

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

ВЫБРАТЬ

СТРЗАМЕНИТЬ(СТРЗАМЕНИТЬ(СОКРЛП(Товары.Наименование), " ", " "), " ", " ") КАК Наименование

ИЗ

Справочник.Товары КАК Товары

Два вложенных вызова покрывают до четырёх пробелов подряд. Если в данных встречаются более длинные серии, надёжнее выполнить очистку циклом во встроенном языке до загрузки или записи данных.

Как нормализовать строки для соединения таблиц

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

ВЫБРАТЬ

Заказы.Номер,

Оплаты.Сумма

ИЗ

Документ.ЗаказКлиента КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ Документ.Оплата КАК Оплаты

ПО СТРЗАМЕНИТЬ(Заказы.НомерЗаказа, " ", "") = СТРЗАМЕНИТЬ(Оплаты.НомерЗаказа, " ", "")

У этого подхода есть цена: соединение по вычисляемому выражению не использует индекс, и на больших таблицах запрос заметно замедлится. Если таких соединений много, правильнее один раз почистить данные в базе (обработкой или при записи) и соединять уже нормализованные поля.

Для разовой аналитики допустим и другой путь: выгрузить результат запроса в таблицу значений и обработать строки во встроенном языке, где доступны СтрЗаменить, СокрЛП и регулярные выражения через COM-объекты.

Где разместить очистку: ВЫБРАТЬ, ГДЕ или параметр

Если пробелы мешают отбору, у вас два варианта. Первый — чистить поле в условии: ГДЕ СТРЗАМЕНИТЬ(Товары.Артикул, " ", "") = &Артикул. Это работает, но отключает использование индекса по полю и на больших справочниках даёт полное сканирование таблицы.

Второй вариант предпочтительнее: очистить значение параметра до выполнения запроса во встроенном языке и сравнивать поле как есть:

Запрос.УстановитьПараметр("Артикул", СтрЗаменить(Артикул, " ", ""));

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

Порядок действий
  1. 1
    Определите, какие пробелы мешают: по краям, двойные внутри или все подряд.
  2. 2
    Проверьте наличие неразрывных пробелов: скопируйте символ из данных и сравните его код.
  3. 3
    Выберите функцию: СОКРЛП для краёв, СТРЗАМЕНИТЬ для удаления внутри строки.
  4. 4
    Протестируйте запрос в консоли запросов на 5–10 проблемных записях.
  5. 5
    Если запрос используется в отборе, перенесите очистку в параметр, чтобы сохранить индекс.

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

Первая ошибка — ожидание, что СОКРЛП уберёт пробелы внутри строки. Функция работает только с краями, и «Кабель  ВВГ» после неё останется с двойным пробелом. Вторая — попытка удалить неразрывный пробел обычной заменой: запрос выполняется без ошибок, но данные не меняются, и поиск причины занимает время.

Третья ошибка — потеря типа поля. СТРЗАМЕНИТЬ возвращает строку неограниченной длины, и если результат попадает во временную таблицу, а затем в соединение или группировку, это может влиять на план запроса. При необходимости приведите результат через ВЫРАЗИТЬ(... КАК Строка(100)).

Проверять результат удобно в консоли запросов: выведите рядом исходное и обработанное поле, а также длину строки через ДЛИНАСТРОКИ — расхождение длины сразу покажет, остались ли скрытые символы.

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

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

Длина строки до и после обработки (ДЛИНАСТРОКИ)
Норма

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

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

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

Соединение таблиц по очищенному полю
Норма

Количество строк в результате совпадает с ожидаемым, нет потерь

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

Часть строк отвалилась — очищена только одна сторона соединения

Скорость запроса на рабочем объёме
Норма

Запрос выполняется за приемлемое время

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

Заметное замедление — очистка стоит в ГДЕ или соединении, индекс не работает

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

Убирает ли СОКРЛП неразрывный пробел?

Нет. СОКРЛП удаляет по краям пробелы, табуляции и переносы строк, но неразрывный пробел (код 160) к ним не относится. Его нужно заменять отдельно через СТРЗАМЕНИТЬ с символом неразрывного пробела или во встроенном языке через Символ(160).

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

Штатной функции нет. Приходится либо строить цепочку вложенных СТРЗАМЕНИТЬ для каждого удаляемого символа, либо выгружать данные и обрабатывать их во встроенном языке, где доступны регулярные выражения и циклы.

Почему СТРЗАМЕНИТЬ выполняется без ошибок, но строка не меняется?

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

Что быстрее: СОКРЛП или СТРЗАМЕНИТЬ?

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

Как убрать пробелы в СКД, если запрос нельзя менять?

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

Можно ли почистить пробелы разово во всей базе?

Да, пишется обработка: запрос выбирает объекты с лишними пробелами, далее во встроенном языке поле очищается через СокрЛП и СтрЗаменить, объект записывается. Перед запуском на рабочей базе сделайте резервную копию и проверьте обработку на копии.

Итог

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

Все пробелы внутри строки убирает СТРЗАМЕНИТЬ(Поле, " ", ""), пробелы по краям — СОКРЛП. Неразрывный пробел требует отдельной замены. В условиях и соединениях очистка поля отключает индекс — по возможности чистите параметр до запроса, а результат проверяйте через ДЛИНАСТРОКИ.