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