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

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

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

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

Удаление пробелов из строки — одна из самых частых задач при работе с данными в 1С: нормализация ИНН, номеров документов, артикулов, телефонов и других реквизитов перед сравнением, поиском или обменом. Встроенный язык 1С предлагает несколько способов решения, и выбор зависит от того, какие именно пробелы нужно убрать — только обычные, неразрывные, табуляции или все виды «невидимых» символов сразу.

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

Базовый способ: функция СтрЗаменить

Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) заменяет все вхождения подстроки. Чтобы удалить все обычные пробелы, достаточно передать пробел как подстроку поиска и пустую строку как замену:

СтрокаСПробелами = "7 7 1 2 3 4 5 6 7 8";

Результат = СтрЗаменить(СтрокаСПробелами, " ", "");

// Результат: "7712345678"

Функция работает быстро и подходит для большинства прикладных задач: очистки ИНН, КПП, ОГРН, номеров телефонов, артикулов.

Если строка может содержать несколько видов пробельных символов (обычный пробел, табуляция, перевод строки), придётся выполнить несколько замен подряд — СтрЗаменить обрабатывает только один шаблон за вызов.

Удаление неразрывных пробелов

Самая частая причина «неработающего» удаления пробелов — неразрывный пробел (символ с кодом 160). Он визуально неотличим от обычного, но СтрЗаменить(Строка, " ", "") его не трогает. Такие символы часто попадают в данные при копировании из Excel, Word, веб-страниц или при выгрузках из сторонних систем, где числа форматируются с разделителями разрядов.

Чтобы удалить неразрывный пробел, используйте функцию Символ(160):

Строка = "1 234 567,89"; // между цифрами — неразрывные пробелы

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

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

// Результат: "1234567,89"

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

Универсальная функция очистки от всех пробельных символов

Для надёжной обработки данных из внешних источников удобно оформить общую функцию, которая убирает все виды пробельных и служебных символов за один вызов. Типовой набор: пробел (32), неразрывный пробел (160), табуляция (9), перевод строки (10), возврат каретки (13).

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

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

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

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

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

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

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

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

Такую функцию размещают в общем модуле, чтобы вызывать из любого места конфигурации. Это снижает дублирование кода и гарантирует единообразную обработку во всех прикладных механизмах.

Альтернативный вариант через СтрРазделить и СтрСоединить

Если нужно не просто удалить пробелы, а схлопнуть любые последовательности пробельных символов и собрать «слова» заново, удобна связка СтрРазделить() и СтрСоединить(). Метод полезен, когда пробелы нужно заменить на другой разделитель или оставить по одному пробелу между словами.

МассивСлов = СтрРазделить(" ИНН  7712 345678 ", " ", Ложь);

// Ложь — пустые элементы не включаются

Результат = СтрСоединить(МассивСлов, "");

// Результат: "ИНН7712345678"

Параметр Ложь во втором аргументе СтрРазделить отбрасывает пустые элементы, поэтому множественные пробелы не создают лишних частей. Если передать Истина, пустые строки сохранятся, и результат соединения будет содержать артефакты.

Этот способ работает только с обычными пробелами в качестве разделителя. Для смешанных данных его комбинируют с предварительной заменой неразрывных пробелов на обычные.

Чем СтрЗаменить отличается от СокрЛП

ФункцияЧто делаетКогда применять
СокрЛ()Убирает пробелы и непечатаемые символы слеваОчистка начала строки
СокрП()Убирает пробелы справаОчистка конца строки, полей фиксированной длины
СокрЛП()Убирает пробелы с обеих сторонНормализация введённых пользователем значений
СтрЗаменить()Удаляет указанные символы в любом месте строкиПолное удаление пробелов внутри строки

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

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

СтрЗаменить

Универсально и быстро; требует отдельной замены для каждого типа символов

СтрРазделить + СтрСоединить

Удобно для схлопывания множественных пробелов; работает только с одним разделителем

Цикл по символам

Максимальный контроль (фильтрация по кодам); медленнее и громоздче

Проверка результата и контроль качества данных

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

ОчищеннаяСтрока = УдалитьВсеПробелы(ИсходнаяСтрока);

Если СтрДлина(ОчищеннаяСтрока) = 0 Тогда

// исходное значение состояло только из пробелов

КонецЕсли;

Если СтрНайти(ОчищеннаяСтрока, " ") > 0 Тогда

// пробелы остались — проверить коды символов

КонецЕсли;

Для числовых реквизитов используйте ОписаниеТипов с методом ПривестиЗначение() — он безопасно вернёт 0 для нечисловой строки вместо генерации исключения. Это надёжнее, чем прямое преобразование Число(), которое вызовет ошибку на «грязных» данных.

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

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

Длина строки после очистки
Норма

Совпадает с ожидаемым количеством значащих символов

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

Длина больше — остались неразрывные пробелы или служебные символы

Поиск пробела через СтрНайти
Норма

Возвращает 0

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

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

Преобразование в число
Норма

Значение приводится без ошибки

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

Ошибка или 0 там, где ожидалось число

Массовая обработка: табличные части, запросы, обмены

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

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

При обменах (XML, JSON, CSV, Excel) очищайте строковые поля сразу после чтения, до записи в объекты базы. Так «мусор» не попадёт в учётные данные, и не придётся потом искать источник расхождений при сопоставлении справочников.

Порядок действий
  1. 1
    Определите, какие символы нужно удалить: обычные пробелы, неразрывные, табуляции, переводы строк
  2. 2
    Проверьте коды подозрительных символов через КодСимвола()
  3. 3
    Примените СтрЗаменить для каждого типа символа или универсальную функцию очистки
  4. 4
    Проверьте результат: длина строки, СтрНайти пробела, преобразование в число
  5. 5
    При массовой обработке вынесите функцию в общий модуль и вызывайте из всех точек обработки

Типичные ошибки и ограничения

Первая ошибка — ожидание, что СокрЛП() удалит пробелы внутри строки. Вторая — игнорирование неразрывных пробелов: код «на вид» правильный, но данные не очищаются. Третья — удаление пробелов там, где они значимы: в адресах, наименованиях контрагентов, ФИО пробелы являются частью значения, и их удаление испортит данные.

Отдельный риск — очистка перед сравнением только с одной стороны. Если вы удаляете пробелы из введённого значения, но сравниваете его с «грязным» значением из базы, совпадения не будет. Нормализуйте обе сравниваемые строки одинаковой функцией.

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

Ограничение самого подхода: СтрЗаменить работает только с явно указанными символами. Экзотические юникод-символы (узкий неразрывный пробел, нулевой пробел) потребуют отдельных замен по их кодам. Если источник данных непредсказуем, надёжнее фильтровать строку по «белому списку» — оставлять только цифры или только допустимые символы, проходя строку циклом.

Итог

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

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

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

Почему СтрЗаменить не удаляет пробелы, хотя код правильный?

Скорее всего, в строке неразрывные пробелы (код 160) или другие служебные символы, визуально неотличимые от пробела. Проверьте код символа через КодСимвола(Сред(Строка, Позиция, 1)) и добавьте замену для конкретного кода, например СтрЗаменить(Строка, Символ(160), "").

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

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

Можно ли удалить пробелы в запросе 1С?

Нет, язык запросов 1С не содержит функции замены подстроки. Очистку выполняют на встроенном языке после выгрузки результата запроса в таблицу значений, либо заранее нормализуют данные в базе регламентной обработкой.

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

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

Будет ли работать СтрЗаменить на сервере и в тонком клиенте?

Да, СтрЗаменить, СокрЛП, Символ и связанные строковые функции доступны во всех режимах исполнения: тонкий клиент, веб-клиент, сервер, внешнее соединение. Ограничений по контексту у этих функций нет.

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

Пройдите таблицу циклом «Для Каждого СтрокаТЗ Из Таблица Цикл» и присвойте каждому строковому реквизиту результат функции очистки. Вынесите саму функцию в общий модуль, чтобы не дублировать код замен в каждой обработке.