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

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

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

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

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

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

Удаление пробелов через СТРЗАМЕНИТЬ в запросе

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

ВЫБРАТЬ

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

ИЗ

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

Замена выполняется по всей строке, а не только в начале или конце. Если артикул хранится как «АБ-12 345 » с пробелом в середине и в конце, результатом будет «АБ-12345». Это удобно для нормализации кодов и ИНН перед сравнением.

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

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

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

Надёжнее выполнять такую очистку в коде, где доступны функции Символ() и СтрЗаменить():

СтрокаРезультат = Выборка.Артикул;

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

СтрокаРезультат = СтрЗаменить(СтрокаРезультат, Символ(9), ""); // табуляция

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

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

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

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

  • СокрЛП(Строка) — удаляет пробелы и незначащие символы в начале и в конце строки;
  • СокрЛ(Строка) и СокрП(Строка) — только слева или только справа;
  • СтрЗаменить(Строка, " ", "") — удаляет все пробелы, включая внутренние.

Типовой пример обработки выборки:

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

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

"ВЫБРАТЬ

| Номенклатура.Артикул КАК Артикул

|ИЗ

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

АртикулЧистый = СтрЗаменить(СокрЛП(Выборка.Артикул), " ", "");

КонецЦикла;

Комбинация СокрЛП + СтрЗаменить покрывает большинство сценариев: сначала убираются краевые незначащие символы, затем — внутренние пробелы. Если внутренние пробелы удалять нельзя (например, в наименовании товара), ограничьтесь одним СокрЛП.

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

СТРЗАМЕНИТЬ в запросе

Подходит для удаления одного конкретного символа по всей строке прямо в выборке. Не убирает неразрывные пробелы без СИМВОЛ(160) и не работает как СокрЛП.

СокрЛП в коде

Убирает все незначащие символы по краям строки, включая неразрывные пробелы. Требует обхода результата запроса в коде.

СтрЗаменить в коде

Гибкая замена любых символов, включая Символ(160) и табуляцию. Удаляет символы по всей строке, а не только по краям.

Удаление пробелов при сравнении и соединении таблиц

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

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

Цены.Цена КАК Цена

ИЗ

РегистрСведений.ЦеныНоменклатуры КАК Цены

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары

ПО Цены.Номенклатура = Товары.Ссылка

ГДЕ

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

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

Массовая очистка данных в справочнике

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

Пример обработки записи:

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ОбъектСпр = Выборка.Ссылка.ПолучитьОбъект();

ОбъектСпр.Артикул = СтрЗаменить(СокрЛП(ОбъектСпр.Артикул), " ", "");

ОбъектСпр.Записать();

КонецЦикла;

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

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

После очистки убедитесь, что пробелы действительно удалены. Быстрый способ — запрос, который ищет оставшиеся пробелы:

ВЫБРАТЬ

Номенклатура.Артикул КАК Артикул

ИЗ

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

ГДЕ

Номенклатура.Артикул ПОДОБНО "% %"

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

Типичные ошибки
01
Попытка использовать СокрЛП в тексте запроса — запрос не выполнится, этой функции в языке запросов нет.
02
Удаление только обычного пробела, когда в данных неразрывный пробел (Символ 160) — сравнение строк по-прежнему не срабатывает.
03
Применение СТРЗАМЕНИТЬ к полю в условии соединения больших таблиц без необходимости — запрос теряет индекс и выполняется медленно.
04
Массовая очистка данных без резервной копии — при ошибке восстановить исходные значения невозможно.
05
Удаление всех пробелов из наименований, где внутренние пробелы значимы, — данные становятся нечитаемыми.
Контрольные точки

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

Поиск остаточных пробелов запросом ПОДОБНО "% %"
Норма

Запрос не возвращает записей

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

Записи найдены — пробелы остались

Сравнение длины строки до и после очистки
Норма

Длина уменьшилась на ожидаемое число символов

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

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

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

Все ожидаемые строки соединились

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

Часть строк потеряна — в данных другие символы

Ответы на частые вопросы

Можно ли использовать СокрЛП прямо в запросе 1С?

Нет, в языке запросов 1С функции СокрЛП не существует. В запросе доступна только СТРЗАМЕНИТЬ, которая заменяет указанную подстроку. СокрЛП применяют в коде при обходе результата запроса.

Как удалить неразрывный пробел, если он не отличается визуально?

В коде используйте СтрЗаменить(Строка, Символ(160), ""). Чтобы обнаружить такой символ, сравните длину строки до и после замены: если длина изменилась, неразрывные пробелы присутствовали.

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

Применение функции к полю в условии отбора или соединения отключает использование индекса по этому полю. На больших таблицах лучше очистить данные заранее и сравнивать поля без функций.

Как удалить пробелы только в начале и в конце строки?

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

Что делать, если после очистки появились дубли по уникальному полю?

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

Итог

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

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