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