Разработка и Конфигурация · 9 мин
Как в 1С заменить один символ на другой в строке
Как заменить один символ на другой в строке 1С: функция СтрЗаменить, замена по позиции, работа с неразрывным пробелом и спецсимволами, типовые ошибки.
Замена одного символа в строке — одна из самых частых операций при работе с данными в 1С: очистка номеров документов от пробелов, замена запятой на точку в числах, удаление неразрывных пробелов из строк, приведение разделителей к единому виду. Во встроенном языке 1С для этого есть штатная функция СтрЗаменить(), а для точечной замены по позиции — комбинация функций Лев(), Сред() и Прав().
Выбор способа зависит от задачи. Если нужно заменить все вхождения символа независимо от его места в строке, достаточно одной строки кода с СтрЗаменить(). Если заменить нужно символ только в конкретной позиции (например, третий символ артикула), потребуется разбиение строки на части и сборка обратно. Ниже разобраны оба подхода, работа со спецсимволами и типичные ошибки.
Замена символа функцией СтрЗаменить
Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) находит все вхождения подстроки поиска и заменяет их на подстроку замены. Функция возвращает новую строку — исходная переменная не изменяется, поэтому результат нужно присвоить обратно в переменную.
НомерДокумента = "00БП-004 521";
НомерДокумента = СтрЗаменить(НомерДокумента, " ", "");
// Результат: "00БП-004521"
Цена = "1 250,50";
Цена = СтрЗаменить(Цена, ",", ".");
// Результат: "1 250.50"
Важно понимать: заменяются все вхождения символа, а не только первое. Если в строке «а б в» заменить пробел на дефис, получится «а-б-в». Если нужно заменить только одно конкретное вхождение, СтрЗаменить() без дополнительной логики не подойдёт.
Регистр букв учитывается: замена «а» не затронет «А». Если нужно заменить символ независимо от регистра, выполните две замены подряд или приведите строку к одному регистру функциями ВРег() / НРег(), если это допустимо по смыслу данных.
Строка = СтрЗаменить(Строка, Символ(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 — вхождений не осталось
Возвращает позицию — символ остался, проверьте его код
Длина изменилась ожидаемо
Длина не изменилась — замена не выполнилась
Преобразование без ошибки
Ошибка преобразования — в строке остались лишние символы
Типичные ошибки при замене символов
Первая и самая частая ошибка — вызов СтрЗаменить() без присваивания результата. Функция не меняет исходную строку, поэтому код СтрЗаменить(Номер, " ", "") сам по себе ничего не делает с переменной Номер.
Вторая группа ошибок связана со спецсимволами: попытка удалить неразрывный пробел обычной заменой пробела, игнорирование символа возврата каретки при очистке многострочного текста, путаница между Символ() и КодСимвола(). Третья — забытая проверка результата СтрНайти() на ноль перед сборкой строки по позиции.
Частые вопросы по замене символов в 1С
Как заменить символ только один раз, а не все вхождения?
Используйте СтрНайти() для поиска позиции первого вхождения, затем соберите строку: Лев(Строка, Позиция - 1) + НовыйСимвол + Сред(Строка, Позиция + 1). Не забудьте проверить, что Позиция больше нуля.
Почему СтрЗаменить не удаляет пробел из числа?
Скорее всего, в строке неразрывный пробел (код 160), который часто попадает в данные при копировании из Excel или веб-страниц. Удаляйте его отдельно: СтрЗаменить(Строка, Символы.НПП, ""). Проверить код символа можно функцией КодСимвола().
Как заменить символ без учёта регистра?
Штатной опции регистронезависимой замены нет. Выполните замену для обоих вариантов символа подряд или, если допустимо, приведите строку к одному регистру функциями ВРег() или НРег() перед обработкой.
Можно ли заменить сразу несколько разных символов?
Да: вызовите СтрЗаменить() последовательно для каждого символа, передавая результат предыдущей замены в следующую, или используйте посимвольный перебор строки с проверкой каждого символа и сборкой новой строки.
Как удалить символ, а не заменить его на другой?
Передайте в качестве подстроки замены пустую строку: СтрЗаменить(Строка, "-", "") удалит все дефисы. Тот же приём работает для любых символов, включая спецсимволы через Символы.Таб, Символы.ПС и другие.
Что важно запомнить
Для замены всех вхождений символа используйте СтрЗаменить() с присваиванием результата обратно в переменную. Для замены по позиции собирайте строку через Лев() и Сред() с проверкой границ. Спецсимволы — неразрывный пробел, табуляцию, переводы строк — заменяйте через Символы.НПП, Символы.Таб, Символы.ПС, и проверяйте результат функцией СтрНайти().