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

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

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

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

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

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

Ниже разобраны рабочие варианты с примерами кода, условиями применения и проверкой результата. Все примеры работают как в толстом, так и в тонком клиенте, на сервере и на клиенте, поскольку используются только базовые строковые функции платформы.

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

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

НомерДокумента = "АБ-123-45";

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

// Результат: "АБ/123/45"

Обратите внимание: заменяются все вхождения подстроки. Если в строке «АБ-123-45» нужно заменить только первый дефис, СтрЗаменить без дополнительных ухищрений не подойдёт — она превратит строку в «АБ/123/45» целиком.

Удобное свойство функции — заменяющая подстрока может быть длиннее или короче заменяемой, а также пустой строкой. Замена на пустую строку фактически удаляет символ:

ТекстСПробелами = СтрЗаменить(ИсходныйТекст, " ", "");

// все пробелы удалены

Замена символа по позиции через Лев, Сред и Прав

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

Позиция = 5;

НовыйСимвол = "X";

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

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

Перед такой операцией обязательно проверяйте границы: если позиция больше длины строки, Лев вернёт всю строку, Сред — пустую строку, и вместо замены символ просто допишется в конец. Это тихая ошибка, которая не вызовет исключения, но испортит данные.

Порядок действий при замене по позиции
  1. 1
    Получите длину строки: СтрДлина(Строка)
  2. 2
    Убедитесь, что позиция в диапазоне от 1 до длины строки
  3. 3
    Соберите результат: Лев(Строка, Позиция-1) + НовыйСимвол + Сред(Строка, Позиция+1)
  4. 4
    Проверьте, что длина результата равна длине исходной строки
  5. 5
    Проверьте символ на нужной позиции: Сред(Результат, Позиция, 1)

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

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

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

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

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

Иначе

Результат = Строка; // символ не найден, строка без изменений

КонецЕсли;

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

Третий параметр СтрНайти задаёт позицию, с которой начинается поиск. Это позволяет в цикле находить все вхождения и работать с каждым по отдельности.

Маршрут решения

Как выбрать способ замены

Символ известен, нужно заменить все вхожденияИспользуйте СтрЗаменить — это самый короткий и быстрый вариант
Нужно заменить символ строго на известной позицииСоберите строку через Лев + новый символ + Сред
Нужно заменить только первое вхождениеНайдите позицию через СтрНайти и соберите строку по позиции
Нужно заменить символы по сложному условиюИспользуйте посимвольный перебор строки в цикле

Посимвольный перебор для сложных условий

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

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

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

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

Если Символ = " " ИЛИ Символ = Символы.Таб Тогда

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

Иначе

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

КонецЕсли;

КонецЦикла;

Такой подход медленнее СтрЗаменить на длинных строках, поэтому для массовой обработки (например, в цикле по сотням тысяч записей) сначала оцените, нельзя ли свести задачу к нескольким вызовам СтрЗаменить. Для типовых строк длиной в десятки символов разница в производительности незаметна.

Объект Символы даёт доступ к служебным символам: Символы.ПС (перевод строки), Символы.ВК (возврат каретки), Символы.Таб (табуляция), Символы.НПП (неразрывный пробел). Именно неразрывный пробел часто становится причиной «незаменяемых» пробелов: визуально он выглядит как обычный, но СтрЗаменить с обычным пробелом его не находит.

Специальные случаи: неразрывные пробелы, переносы строк, регистр

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

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

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

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

Чтобы увидеть, какой именно символ стоит на проблемной позиции, используйте функцию КодСимвола: КодСимвола(Строка, Позиция). Обычный пробел имеет код 32, неразрывный — 160. Это самый быстрый способ диагностики, когда замена «не срабатывает».

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

Типичные ошибки
01
Ожидание, что СтрЗаменить меняет исходную переменную — функция возвращает новую строку, результат нужно присвоить
02
Замена обычного пробела там, где стоит неразрывный — проверяйте код символа через КодСимвола()
03
Замена по позиции без проверки длины строки — символ дописывается в конец вместо замены
04
Использование СтрЗаменить, когда нужно заменить только одно вхождение — заменяются все
05
Путаница с нумерацией: в 1С первый символ строки имеет позицию 1, а не 0

Проверка результата замены

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

Если СтрДлина(Результат) <> СтрДлина(ИсходнаяСтрока) Тогда

// длина изменилась — что-то пошло не так

КонецЕсли;

Если Сред(Результат, Позиция, 1) <> НовыйСимвол Тогда

// символ на позиции не совпадает с ожидаемым

КонецЕсли;

При обработке больших объёмов данных собирайте статистику: сколько строк обработано, в скольких выполнена замена, в скольких искомый символ не найден. Это позволяет отличить корректную работу алгоритма от ситуации, когда замена молча не выполняется из-за неверного условия.

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

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

Длина строки после замены символа на символ
Норма

Длина совпадает с исходной

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

Длина изменилась — заменено не то или не там

Символ на целевой позиции
Норма

Сред(Результат, Позиция, 1) равен новому символу

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

На позиции старый или другой символ

Количество вхождений старого символа
Норма

Совпадает с ожидаемым после замены

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

Символ остался там, где должен был быть заменён

Сравнение способов замены

СпособКогда применятьОграничения
СтрЗаменитьИзвестен символ, заменяются все вхожденияНельзя заменить только одно вхождение, учитывает регистр
Лев + Сред по позицииИзвестна позиция символаТребует проверки границ строки
СтрНайти + сборка строкиЗамена первого вхожденияДля последнего вхождения нужен цикл
Посимвольный переборСложные условия, замена по критериюМедленнее на длинных строках

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

Итог

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

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

Частые вопросы

Можно ли заменить символ прямо в исходной строке без присвоения результата?

Нет. Строки в 1С неизменяемы: все строковые функции возвращают новую строку. Результат обязательно нужно присвоить переменной: Строка = СтрЗаменить(Строка, "а", "б").

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

Скорее всего, это неразрывный пробел (код 160), а не обычный (код 32). Проверьте через КодСимвола и заменяйте через Символы.НПП: СтрЗаменить(Значение, Символы.НПП, "").

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

Штатной функции поиска с конца строки нет. Найдите все вхождения в цикле через СтрНайти с указанием начальной позиции, запомните последнюю и соберите строку через Лев и Сред по этой позиции.

Учитывает ли СтрЗаменить регистр букв?

Да, поиск выполняется с учётом регистра. Для регистронезависимой замены вызывайте функцию для каждого варианта написания либо находите позиции в копии строки, приведённой к одному регистру, а замену выполняйте в исходной.

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

Удаление — это замена на пустую строку: СтрЗаменить(Строка, "-", "") удалит все дефисы. Для удаления по позиции: Лев(Строка, Позиция-1) + Сред(Строка, Позиция+1).

Есть ли ограничения на длину строки при замене?

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