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