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

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

Как в 1С заменить один символ на другой в строке

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

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

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

Замена символа функцией СтрЗаменить

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

НомерДокумента = "00БП-004 521";

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

// Результат: "00БП-004521"

Цена = "1 250,50";

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

// Результат: "1 250.50"

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

Регистр букв учитывается: замена «а» не затронет «А». Если нужно заменить символ независимо от регистра, выполните две замены подряд или приведите строку к одному регистру функциями ВРег() / НРег(), если это допустимо по смыслу данных.

1c
Строка = СтрЗаменить(Строка, Символ(34), "'") // замена кавычек на апострофы

Замена символа в конкретной позиции строки

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

Функция ЗаменитьСимволВПозиции(Строка, Позиция, НовыйСимвол)

Если Позиция < 1 ИЛИ Позиция > СтрДлина(Строка) Тогда

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

КонецЕсли;

Возврат Лев(Строка, Позиция - 1) + НовыйСимвол + Сред(Строка, Позиция + 1);

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

Артикул = ЗаменитьСимволВПозиции("AB-123", 3, "_");

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

Здесь Лев(Строка, Позиция - 1) берёт всё до заменяемого символа, а Сред(Строка, Позиция + 1) — всё после него. Сам символ в позиции просто отбрасывается и заменяется новым. Проверка границ обязательна: при позиции за пределами строки функция вернёт исходное значение без ошибки выполнения.

Замена только первого вхождения

Если нужно заменить только первое вхождение символа, сначала найдите его позицию функцией СтрНайти(), а затем соберите строку по тому же принципу:

Строка = "раз;два;три";

Позиция = СтрНайти(Строка, ";");

Если Позиция > 0 Тогда

Строка = Лев(Строка, Позиция - 1) + "," + Сред(Строка, Позиция + 1);

КонецЕсли;

// Результат: "раз,два;три"

Проверка Позиция > 0 защищает от ситуации, когда искомого символа в строке нет: СтрНайти() в этом случае возвращает 0, и без проверки результат будет искажён.

Замена спецсимволов: неразрывный пробел, табуляция, перенос строки

Частая проблема при загрузке данных из Excel, внешних файлов или копировании из веб-страниц — неразрывный пробел (код 160). Визуально он неотличим от обычного пробела, но СтрЗаменить(Строка, " ", "") его не удаляет, а Число() и сравнения строк дают неожиданные результаты.

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

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

// Удаление обычного и неразрывного пробела сразу

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

// Замена табуляции на пробел

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

// Удаление переводов строк

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

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

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

Замена символов в цикле и посимвольный перебор

Когда нужно заменить много разных символов по сложным правилам (например, удалить все символы, кроме цифр), удобнее перебрать строку посимвольно и собрать новую:

Функция ОставитьТолькоЦифры(Строка)

Результат = "";

Для Позиция = 1 По СтрДлина(Строка) Цикл

Символ = Сред(Строка, Позиция, 1);

Если СтрНайти("0123456789", Символ) > 0 Тогда

Результат = Результат + Символ;

КонецЕсли;

КонецЦикла;

Возврат Результат;

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

Такой подход прозрачнее, чем длинная цепочка СтрЗаменить(), когда правил много. Учтите, что для очень длинных строк посимвольная конкатенация работает медленнее встроенной замены — для массовой обработки больших текстов предпочтительнее СтрЗаменить() или СтрРазделить() с последующим СтрСоединить().

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

После замены убедитесь, что результат соответствует ожиданию. Для отладки используйте Сообщить() или окно «Вычислить выражение» в конфигураторе (Shift+F9), где можно проверить и длину строки, и коды символов.

Если СтрНайти(Строка, СтарыйСимвол) > 0 Тогда

// Замена не сработала или сработала частично

КонецЕсли;

Полезные контрольные точки: длина строки до и после замены (СтрДлина()), отсутствие заменяемого символа (СтрНайти() возвращает 0), корректное преобразование в число или дату, если замена делалась ради этого.

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

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

СтрНайти(Строка, СтарыйСимвол)
Норма

Возвращает 0 — вхождений не осталось

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

Возвращает позицию — символ остался, проверьте его код

СтрДлина до и после
Норма

Длина изменилась ожидаемо

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

Длина не изменилась — замена не выполнилась

Число(Строка) после замены разделителя
Норма

Преобразование без ошибки

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

Ошибка преобразования — в строке остались лишние символы

Типичные ошибки при замене символов

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

Вторая группа ошибок связана со спецсимволами: попытка удалить неразрывный пробел обычной заменой пробела, игнорирование символа возврата каретки при очистке многострочного текста, путаница между Символ() и КодСимвола(). Третья — забытая проверка результата СтрНайти() на ноль перед сборкой строки по позиции.

Типичные ошибки
01
Вызов СтрЗаменить без присваивания результата — строка остаётся без изменений
02
Замена обычного пробела там, где стоит неразрывный (код 160) — символ не находится
03
Использование результата СтрНайти без проверки на 0 — искажение строки при отсутствии символа
04
Ожидание замены без учёта регистра — символы "а" и "А" для функции разные

Частые вопросы по замене символов в 1С

Как заменить символ только один раз, а не все вхождения?

Используйте СтрНайти() для поиска позиции первого вхождения, затем соберите строку: Лев(Строка, Позиция - 1) + НовыйСимвол + Сред(Строка, Позиция + 1). Не забудьте проверить, что Позиция больше нуля.

Почему СтрЗаменить не удаляет пробел из числа?

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

Как заменить символ без учёта регистра?

Штатной опции регистронезависимой замены нет. Выполните замену для обоих вариантов символа подряд или, если допустимо, приведите строку к одному регистру функциями ВРег() или НРег() перед обработкой.

Можно ли заменить сразу несколько разных символов?

Да: вызовите СтрЗаменить() последовательно для каждого символа, передавая результат предыдущей замены в следующую, или используйте посимвольный перебор строки с проверкой каждого символа и сборкой новой строки.

Как удалить символ, а не заменить его на другой?

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

Итог

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

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