Разработка и Конфигурация · 9 мин
Как убрать все пробелы в 1С
Как убрать все пробелы в 1С: функции СокрЛП, СтрЗаменить, работа с неразрывными пробелами, обработка строк в запросах и типичные ошибки разработчика.
Пробелы в строках — одна из самых частых причин ошибок в 1С: номенклатура «не находится» при поиске, контрагент дублируется из-за лишнего пробела в ИНН, сравнение строк возвращает Ложь, хотя визуально значения совпадают. При этом встроенный язык 1С предлагает несколько разных инструментов, и выбор неправильного приводит к тому, что пробелы убираются не там, где нужно, или не убираются вовсе.
Ключевой момент: в 1С существует несколько видов пробельных символов — обычный пробел (код 32), неразрывный пробел (код 160), табуляция, перевод строки. Функция СокрЛП обрабатывает далеко не все из них, поэтому универсального решения на все случаи нет — нужно понимать, какие именно символы мешают и где они стоят: по краям строки или внутри неё.
Ниже разобраны основные функции, готовые фрагменты кода для типовых задач, работа с пробелами в запросах и типичные ошибки, из-за которых строки «не сравниваются» даже после обработки.
Разбираемся, какие пробелы нужно убрать
Прежде чем писать код, определите задачу. «Убрать пробелы» может означать три разные вещи: удалить пробелы только слева и справа (например, при вводе пользователем), удалить все пробелы вообще (например, в номере документа или ИНН) или заменить множественные пробелы внутри строки на один (при нормализации наименований).
Отдельная ловушка — неразрывный пробел. Он часто попадает в данные при копировании из Excel, Word, веб-страниц и при форматировании чисел: например, строка «1 250 000» содержит именно неразрывные пробелы. Визуально он неотличим от обычного, но СокрЛП его по краям строки может не удалить, а сравнение строк с обычным пробелом даст Ложь.
Достаточно СокрЛП — это стандартный сценарий
Нужна СтрЗаменить, СокрЛП не поможет
Проверьте наличие Символ(160) и замените его
Уберите пробелы перед преобразованием в число
СокрЛ, СокрП и СокрЛП: убираем пробелы по краям
Три базовые функции встроенного языка: СокрЛ удаляет пробельные символы слева, СокрП — справа, СокрЛП — с обеих сторон. Это самый безопасный способ: содержимое строки внутри не затрагивается, поэтому функции подходят для наименований, адресов, ФИО и любого пользовательского ввода.
Наименование = СокрЛП(Наименование); // убираем пробелы слева и справа
ИНН = СокрЛ(ИНН); // только слева
Комментарий = СокрП(Комментарий); // только справа
Важное ограничение: СокрЛП удаляет пробелы, табуляции и переводы строк по краям, но неразрывный пробел (Символ(160)) в ряде случаев остаётся. Если после СокрЛП строка всё равно «не сравнивается» — почти наверняка в ней неразрывный пробел.
СтрЗаменить: убираем все пробелы в строке
Когда пробелы нужно удалить полностью — например, в ИНН, КПП, номере телефона, артикуле или штрихкоде — используется СтрЗаменить. Функция заменяет все вхождения подстроки на другую подстроку; если заменить пробел на пустую строку, все пробелы исчезнут.
ИНН = СтрЗаменить(ИНН, " ", ""); // убрали все обычные пробелы
ИНН = СтрЗаменить(ИНН, Символ(160), ""); // убрали неразрывные пробелы
Универсальный приём для очистки строки от всех видов пробелов — сначала заменить неразрывный пробел на обычный, а затем удалить обычные. Так вы не перечисляете все возможные символы по отдельности и не рискуете пропустить вариант.
Функция УбратьВсеПробелы(Знач Строка)
Строка = СтрЗаменить(Строка, Символ(160), " ");
Строка = СтрЗаменить(Строка, " ", "");
Возврат Строка;
КонецФункции
Строка = СтрЗаменить(Строка, Символ(160), " ");
Строка = СтрЗаменить(Строка, " ", "");Нормализация: заменяем множественные пробелы на один
Иногда удалять все пробелы нельзя — например, в наименовании товара «Труба стальная 50х50» пробелы нужны, но двойные и тройные мешают поиску и создают дубли. Задача решается циклом замены двойного пробела на одинарный, пока двойные не закончатся.
Пока СтрНайти(Наименование, " ") > 0 Цикл
Наименование = СтрЗаменить(Наименование, " ", " ");
КонецЦикла;
Наименование = СокрЛП(Наименование);
Такой приём стоит применять при загрузке данных из внешних источников и при массовой обработке справочников. После нормализации имеет смысл проверить базу на дубли: элементы, которые отличались только количеством пробелов, станут одинаковыми.
Пробелы в запросах и при сравнении строк
В языке запросов 1С нет прямого аналога СокрЛП, поэтому сравнение строк с пробелами в запросе — частая проблема. Если нужно найти элементы с учётом возможных пробелов по краям, используйте конструкцию ПОДОБНО с шаблоном или обрабатывайте данные заранее, до записи в базу.
Правильная стратегия — не чистить строки в каждом запросе, а хранить данные уже нормализованными. Для этого обработку добавляют в обработчики ПередЗаписью или ПриЗаписи объектов, а также в процедуры загрузки данных из файлов и обменов.
Если дубли уже накоплены, найти «почти одинаковые» наименования можно запросом с группировкой по очищенному значению, но сложные замены в запросе громоздки. Практичнее выгрузить результат и обработать его в коде, сравнивая СокрЛП(Наименование) между элементами.
Как выбрать действие
Проверка результата и типичные ошибки
После обработки проверьте результат не визуально, а программно: сравните длину строки до и после, а также проверьте наличие пробела и неразрывного пробела через СтрНайти. Если СтрНайти(Строка, Символ(160)) возвращает значение больше нуля — неразрывные пробелы остались.
Как проверить результат
Возвращает 0 — обычных пробелов нет
Возвращает позицию > 0 — пробелы остались
Возвращает 0 — неразрывных пробелов нет
Возвращает позицию > 0 — есть неразрывный пробел
Очищенные строки равны при визуальном совпадении
Строки визуально одинаковы, но сравнение даёт Ложь
Отдельно отметим преобразование чисел: строка «1 250 000» не преобразуется в число, пока из неё не удалены неразрывные пробелы. Если загружаете цены или суммы из файлов, всегда очищайте строку от пробельных символов перед вызовом Число().
Частые вопросы
Почему СокрЛП не убирает пробел в конце строки?
Скорее всего, это неразрывный пробел (код 160), который СокрЛП не обрабатывает. Замените его предварительно: Строка = СтрЗаменить(Строка, Символ(160), ""), затем примените СокрЛП.
Как убрать пробелы в строке в запросе 1С?
Полноценной замены пробелов в языке запросов нет. Для поиска используйте ПОДОБНО с шаблоном, а для очистки данных обрабатывайте строки в коде до записи в базу — это надёжнее и быстрее.
Чем отличается СокрЛП от СтрЗаменить при удалении пробелов?
СокрЛП удаляет пробельные символы только слева и справа, не трогая середину строки. СтрЗаменить заменяет все вхождения указанного символа в любом месте строки, поэтому подходит для полного удаления пробелов.
Как найти в базе элементы с лишними пробелами в наименовании?
Выберите элементы запросом или обходом и сравните Наименование с СокрЛП(Наименование): если значения различаются, по краям есть лишние символы. Для поиска двойных пробелов внутри используйте СтрНайти(Наименование, " ") > 0.
Можно ли убрать пробелы при вводе в поле формы автоматически?
Да. В обработчике ПриИзменении поля ввода присвойте реквизиту очищенное значение, например Объект.ИНН = СтрЗаменить(СокрЛП(Объект.ИНН), " ", ""). Для надёжности продублируйте очистку в ПередЗаписью, чтобы защититься от обхода формы.
Опасно ли массово убирать пробелы в справочниках?
Сама операция безопасна, но после нормализации могут появиться дубли элементов, отличавшихся только пробелами. Перед обработкой сделайте резервную копию базы, а после — проверьте справочник на дубли и объедините их штатными средствами.
Что важно запомнить
СокрЛП убирает пробелы по краям, СтрЗаменить — все пробелы в строке, а неразрывный пробел Символ(160) требует отдельной замены. Результат всегда присваивайте переменной, данные нормализуйте при записи, а перед массовой обработкой делайте копию базы.