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