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

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

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

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

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

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

Материал охватывает работу во встроенном языке 1С (тонкий клиент, толстый клиент, сервер), а также замену в табличных документах и при обработке данных. Примеры приведены для управляемых и обычных форм — синтаксис функций одинаков.

Функция СтрЗаменить — основной инструмент замены

Функция СтрЗаменить принимает три строковых параметра: исходную строку, подстроку поиска и подстроку замены. Она находит все вхождения подстроки поиска и заменяет их на указанное значение. Если вхождений нет, возвращается исходная строка без изменений.

НомерДоговора = "ДГ-2026/015";

НомерДоговора = СтрЗаменить(НомерДоговора, "/", "-");

// Результат: "ДГ-2026-015"

Текст = "Иванов;Петров;Сидоров";

Текст = СтрЗаменить(Текст, ";", ", ");

// Результат: "Иванов, Петров, Сидоров"

Ключевая особенность: функция не изменяет переменную «на месте», а возвращает новую строку. Результат нужно присвоить переменной явно — иначе замена просто потеряется. Это самая частая ошибка начинающих разработчиков.

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

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

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

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

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

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

КонецЕсли;

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

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

Код = "АБВГД";

Код = ЗаменитьСимволВПозиции(Код, 3, "X");

// Результат: "АБXГД"

Обратите внимание на проверку границ: если позиция выходит за пределы строки, функция Сред вернёт пустую строку без ошибки, и результат может оказаться неожиданным. Явная проверка диапазона защищает от тихих ошибок в данных.

Для замены первого или последнего символа достаточно Прав и Лев соответственно: НоваяСтрока = НовыйСимвол + Сред(Строка, 2) заменит первый символ, а Лев(Строка, СтрДлина(Строка) - 1) + НовыйСимвол — последний.

Замена пробелов, переносов строк и спецсимволов

На практике чаще всего заменяют не «видимые» буквы, а служебные символы: неразрывные пробелы из Excel, переносы строк в многострочных полях, табуляции из выгрузок. Такие символы задаются через функцию Символ или объект Символы.

// Удаление неразрывного пробела (код 160), часто приходит из Excel

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

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

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

// Удаление табуляции

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

Перенос строки — особый случай: в зависимости от источника данных он может быть представлен как Символы.ПС (символ с кодом 10), как возврат каретки Символы.ВК (код 13), либо как их комбинация. Если замена «не срабатывает», проверьте, какой именно символ стоит в строке, — надёжнее заменять оба варианта последовательно.

Типичные ошибки
01
Не присвоили результат СтрЗаменить переменной — строка осталась без изменений, и ошибку замечают только на печатной форме
02
Заменяют перенос строки только через Символы.ПС, а в данных стоит комбинация ВК+ПС — часть переносов остаётся
03
Путают обычный пробел (код 32) и неразрывный (код 160) — визуально они одинаковы, но замена одного не трогает другой
04
Используют СтрЗаменить для замены по позиции — заменяются все одинаковые символы по всей строке

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

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

Функция ЗаменитьПервое(Строка, ЧтоИскать, НаЧто)

Позиция = СтрНайти(Строка, ЧтоИскать);

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

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

КонецЕсли;

Возврат Лев(Строка, Позиция - 1) + НаЧто

+ Сред(Строка, Позиция + СтрДлина(ЧтоИскать));

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

Функция СтрНайти возвращает позицию первого вхождения или 0, если подстрока не найдена. У неё есть необязательные параметры: направление поиска (с начала или с конца) и номер вхождения — так можно найти, например, третью запятую и заменить фрагмент после неё.

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

Порядок действий при замене первого вхождения
  1. 1
    Найдите позицию подстроки через СтрНайти
  2. 2
    Проверьте, что позиция больше нуля — иначе заменять нечего
  3. 3
    Возьмите левую часть строки до позиции функцией Лев
  4. 4
    Добавьте подстроку замены
  5. 5
    Присоедините остаток через Сред с учётом длины искомой подстроки
  6. 6
    Проверьте результат на тестовой строке с несколькими вхождениями

Замена в табличном документе и в данных без программирования

Если нужно заменить символ не в коде, а в открытом табличном документе (например, в mxl-файле или сформированной печатной форме до сохранения), используйте стандартный диалог поиска и замены: меню «Таблица» → «Найти» (или Ctrl+F) с включённым флажком замены. Это работает так же, как замена в офисных редакторах.

Для массовой замены значений в данных информационной базы (в справочниках, документах) в типовых конфигурациях есть обработка «Групповое изменение реквизитов» (в БСП-based конфигурациях) и «Поиск и замена значений». Они позволяют заменить одно значение ссылочного реквизита на другое по всей базе без написания кода.

Учтите ограничение: «Поиск и замена значений» работает со ссылочными значениями (элементами справочников, документами), а не с произвольными подстроками внутри текстовых реквизитов. Для замены символов внутри строковых полей множества объектов потребуется обработка с обходом данных и СтрЗаменить — такую задачу лучше поручить специалисту по 1С.

Проверка результата и типичные ограничения

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

СтрокаДо = СтрДлина(ИсходнаяСтрока);

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

Если СтрНайти(ИсходнаяСтрока, Символ(160)) > 0 Тогда

// Замена не сработала — возможно, символ другого кода

КонецЕсли;

Диагностировать «невидимый» символ можно, перебрав строку посимвольно и выведя код каждого символа функцией КодСимвола. Так вы точно узнаете, что стоит в строке: обычный пробел (32), неразрывный (160) или что-то ещё.

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

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

Наличие искомой подстроки после замены
Норма

СтрНайти возвращает 0

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

СтрНайти находит вхождения — символ имеет другой код или регистр

Длина строки
Норма

Уменьшилась на ожидаемое число символов при удалении

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

Длина не изменилась — результат СтрЗаменить не присвоен переменной

Преобразование в число после очистки
Норма

Число() возвращает корректное значение

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

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

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

Итог

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

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

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

Почему СтрЗаменить не меняет мою строку?

Функция возвращает новую строку, а не изменяет исходную переменную. Запись вида СтрЗаменить(Текст, "а", "б"); без присвоения результата ничего не делает. Правильно: Текст = СтрЗаменить(Текст, "а", "б");.

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

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

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

Удаление — это частный случай замены: передайте в качестве подстроки замены пустую строку, например СтрЗаменить(Текст, "-", "") удалит все дефисы.

Как заменить кавычки внутри строки в коде 1С?

В литералах встроенного языка кавычка внутри строки удваивается: СтрЗаменить(Текст, """", "'") заменит двойные кавычки на одинарные. Четыре кавычки подряд — это строка из одной кавычки.

Можно ли заменить символ в запросе 1С?

В языке запросов нет прямого аналога СтрЗаменить. Обычно данные выбирают запросом, а замену выполняют уже в коде при обходе выборки. В некоторых случаях подмену делают через ВЫБОР и ПОДСТРОКА, но это громоздко и оправдано только для фиксированных позиций.

Чем отличается Символы.ПС от Символ(10)?

Это один и тот же символ — перенос строки с кодом 10. Объект Символы просто предоставляет именованные константы для читаемости кода. Однако в данных из внешних источников перенос может быть записан как ВК+ПС (коды 13 и 10), поэтому при очистке текста часто заменяют обе комбинации.