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

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

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

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

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

Ключевой момент: в 1С существует несколько видов пробельных символов — обычный пробел (код 32), неразрывный пробел (код 160), табуляция, перевод строки. Функция СокрЛП обрабатывает далеко не все из них, поэтому универсального решения на все случаи нет — нужно понимать, какие именно символы мешают и где они стоят: по краям строки или внутри неё.

Ниже разобраны основные функции, готовые фрагменты кода для типовых задач, работа с пробелами в запросах и типичные ошибки, из-за которых строки «не сравниваются» даже после обработки.

Разбираемся, какие пробелы нужно убрать

Прежде чем писать код, определите задачу. «Убрать пробелы» может означать три разные вещи: удалить пробелы только слева и справа (например, при вводе пользователем), удалить все пробелы вообще (например, в номере документа или ИНН) или заменить множественные пробелы внутри строки на один (при нормализации наименований).

Отдельная ловушка — неразрывный пробел. Он часто попадает в данные при копировании из Excel, Word, веб-страниц и при форматировании чисел: например, строка «1 250 000» содержит именно неразрывные пробелы. Визуально он неотличим от обычного, но СокрЛП его по краям строки может не удалить, а сравнение строк с обычным пробелом даст Ложь.

Пробелы по краям строкиЗадача очистки ввода

Достаточно СокрЛП — это стандартный сценарий

Пробелы внутри строкиИНН, номер, артикул

Нужна СтрЗаменить, СокрЛП не поможет

Строка из Excel или сайтаВозможен неразрывный пробел

Проверьте наличие Символ(160) и замените его

Число как строка с разрядами«1 250 000»

Уберите пробелы перед преобразованием в число

СокрЛ, СокрП и СокрЛП: убираем пробелы по краям

Три базовые функции встроенного языка: СокрЛ удаляет пробельные символы слева, СокрП — справа, СокрЛП — с обеих сторон. Это самый безопасный способ: содержимое строки внутри не затрагивается, поэтому функции подходят для наименований, адресов, ФИО и любого пользовательского ввода.

Наименование = СокрЛП(Наименование); // убираем пробелы слева и справа

ИНН = СокрЛ(ИНН); // только слева

Комментарий = СокрП(Комментарий); // только справа

Важное ограничение: СокрЛП удаляет пробелы, табуляции и переводы строк по краям, но неразрывный пробел (Символ(160)) в ряде случаев остаётся. Если после СокрЛП строка всё равно «не сравнивается» — почти наверняка в ней неразрывный пробел.

СтрЗаменить: убираем все пробелы в строке

Когда пробелы нужно удалить полностью — например, в ИНН, КПП, номере телефона, артикуле или штрихкоде — используется СтрЗаменить. Функция заменяет все вхождения подстроки на другую подстроку; если заменить пробел на пустую строку, все пробелы исчезнут.

ИНН = СтрЗаменить(ИНН, " ", "");           // убрали все обычные пробелы

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

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

Функция УбратьВсеПробелы(Знач Строка)

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

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

Возврат Строка;

КонецФункции

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

Нормализация: заменяем множественные пробелы на один

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

Пока СтрНайти(Наименование, "  ") > 0 Цикл

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

КонецЦикла;

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

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

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

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

Правильная стратегия — не чистить строки в каждом запросе, а хранить данные уже нормализованными. Для этого обработку добавляют в обработчики ПередЗаписью или ПриЗаписи объектов, а также в процедуры загрузки данных из файлов и обменов.

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

Маршрут решения

Как выбрать действие

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

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

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

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

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

СтрНайти(Строка, " ")
Норма

Возвращает 0 — обычных пробелов нет

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

Возвращает позицию > 0 — пробелы остались

СтрНайти(Строка, Символ(160))
Норма

Возвращает 0 — неразрывных пробелов нет

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

Возвращает позицию > 0 — есть неразрывный пробел

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

Очищенные строки равны при визуальном совпадении

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

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

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

Отдельно отметим преобразование чисел: строка «1 250 000» не преобразуется в число, пока из неё не удалены неразрывные пробелы. Если загружаете цены или суммы из файлов, всегда очищайте строку от пробельных символов перед вызовом Число().

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

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

Скорее всего, это неразрывный пробел (код 160), который СокрЛП не обрабатывает. Замените его предварительно: Строка = СтрЗаменить(Строка, Символ(160), ""), затем примените СокрЛП.

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

Полноценной замены пробелов в языке запросов нет. Для поиска используйте ПОДОБНО с шаблоном, а для очистки данных обрабатывайте строки в коде до записи в базу — это надёжнее и быстрее.

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

СокрЛП удаляет пробельные символы только слева и справа, не трогая середину строки. СтрЗаменить заменяет все вхождения указанного символа в любом месте строки, поэтому подходит для полного удаления пробелов.

Как найти в базе элементы с лишними пробелами в наименовании?

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

Можно ли убрать пробелы при вводе в поле формы автоматически?

Да. В обработчике ПриИзменении поля ввода присвойте реквизиту очищенное значение, например Объект.ИНН = СтрЗаменить(СокрЛП(Объект.ИНН), " ", ""). Для надёжности продублируйте очистку в ПередЗаписью, чтобы защититься от обхода формы.

Опасно ли массово убирать пробелы в справочниках?

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

Итог

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

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