Разработка и Конфигурация · 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Определите, какие символы нужно удалить: обычные пробелы, неразрывные, табуляции, переводы строк
- 2Проверьте коды подозрительных символов через КодСимвола()
- 3Примените СтрЗаменить для каждого типа символа или универсальную функцию очистки
- 4Проверьте результат: длина строки, СтрНайти пробела, преобразование в число
- 5При массовой обработке вынесите функцию в общий модуль и вызывайте из всех точек обработки
Типичные ошибки и ограничения
Первая ошибка — ожидание, что СокрЛП() удалит пробелы внутри строки. Вторая — игнорирование неразрывных пробелов: код «на вид» правильный, но данные не очищаются. Третья — удаление пробелов там, где они значимы: в адресах, наименованиях контрагентов, ФИО пробелы являются частью значения, и их удаление испортит данные.
Отдельный риск — очистка перед сравнением только с одной стороны. Если вы удаляете пробелы из введённого значения, но сравниваете его с «грязным» значением из базы, совпадения не будет. Нормализуйте обе сравниваемые строки одинаковой функцией.
Ограничение самого подхода: СтрЗаменить работает только с явно указанными символами. Экзотические юникод-символы (узкий неразрывный пробел, нулевой пробел) потребуют отдельных замен по их кодам. Если источник данных непредсказуем, надёжнее фильтровать строку по «белому списку» — оставлять только цифры или только допустимые символы, проходя строку циклом.
Что важно запомнить
Все пробелы внутри строки в 1С удаляются через СтрЗаменить(Строка, " ", ""). Неразрывный пробел требует отдельной замены через Символ(160). СокрЛП очищает только края строки. Перед записью результата проверяйте длину и отсутствие остаточных пробелов, а функцию очистки выносите в общий модуль.
Частые вопросы
Почему СтрЗаменить не удаляет пробелы, хотя код правильный?
Скорее всего, в строке неразрывные пробелы (код 160) или другие служебные символы, визуально неотличимые от пробела. Проверьте код символа через КодСимвола(Сред(Строка, Позиция, 1)) и добавьте замену для конкретного кода, например СтрЗаменить(Строка, Символ(160), "").
Чем отличается СокрЛП от СтрЗаменить при работе с пробелами?
СокрЛП удаляет пробелы и непечатаемые символы только в начале и в конце строки, не затрагивая середину. СтрЗаменить убирает указанный символ во всей строке, но только тот, который явно задан. Для полного удаления пробелов нужен именно СтрЗаменить.
Можно ли удалить пробелы в запросе 1С?
Нет, язык запросов 1С не содержит функции замены подстроки. Очистку выполняют на встроенном языке после выгрузки результата запроса в таблицу значений, либо заранее нормализуют данные в базе регламентной обработкой.
Как удалить пробелы только между цифрами, оставив остальные?
Прямой функции для этого нет. Практичный путь — пройти строку циклом и оставлять только допустимые символы (например, цифры), либо сначала извлечь нужный фрагмент через СтрНайти и Сред, а затем применить СтрЗаменить к нему.
Будет ли работать СтрЗаменить на сервере и в тонком клиенте?
Да, СтрЗаменить, СокрЛП, Символ и связанные строковые функции доступны во всех режимах исполнения: тонкий клиент, веб-клиент, сервер, внешнее соединение. Ограничений по контексту у этих функций нет.
Как удалить пробелы сразу во всех строках таблицы значений?
Пройдите таблицу циклом «Для Каждого СтрокаТЗ Из Таблица Цикл» и присвойте каждому строковому реквизиту результат функции очистки. Вынесите саму функцию в общий модуль, чтобы не дублировать код замен в каждой обработке.