Разработка и Конфигурация · 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), либо как их комбинация. Если замена «не срабатывает», проверьте, какой именно символ стоит в строке, — надёжнее заменять оба варианта последовательно.
Замена только первого вхождения или части строки
Стандартная СтрЗаменить заменяет все вхождения сразу. Если нужно заменить только первое вхождение, используют связку СтрНайти и сбора строки из частей.
Функция ЗаменитьПервое(Строка, ЧтоИскать, НаЧто)
Позиция = СтрНайти(Строка, ЧтоИскать);
Если Позиция = 0 Тогда
Возврат Строка;
КонецЕсли;
Возврат Лев(Строка, Позиция - 1) + НаЧто
+ Сред(Строка, Позиция + СтрДлина(ЧтоИскать));
КонецФункции
Функция СтрНайти возвращает позицию первого вхождения или 0, если подстрока не найдена. У неё есть необязательные параметры: направление поиска (с начала или с конца) и номер вхождения — так можно найти, например, третью запятую и заменить фрагмент после неё.
Для замены последнего вхождения вызовите СтрНайти с направлением поиска НаправлениеПоиска.СКонца и соберите строку тем же способом: левая часть до позиции, подстановка, правая часть после найденного фрагмента.
- 1Найдите позицию подстроки через СтрНайти
- 2Проверьте, что позиция больше нуля — иначе заменять нечего
- 3Возьмите левую часть строки до позиции функцией Лев
- 4Добавьте подстроку замены
- 5Присоедините остаток через Сред с учётом длины искомой подстроки
- 6Проверьте результат на тестовой строке с несколькими вхождениями
Замена в табличном документе и в данных без программирования
Если нужно заменить символ не в коде, а в открытом табличном документе (например, в mxl-файле или сформированной печатной форме до сохранения), используйте стандартный диалог поиска и замены: меню «Таблица» → «Найти» (или Ctrl+F) с включённым флажком замены. Это работает так же, как замена в офисных редакторах.
Для массовой замены значений в данных информационной базы (в справочниках, документах) в типовых конфигурациях есть обработка «Групповое изменение реквизитов» (в БСП-based конфигурациях) и «Поиск и замена значений». Они позволяют заменить одно значение ссылочного реквизита на другое по всей базе без написания кода.
Учтите ограничение: «Поиск и замена значений» работает со ссылочными значениями (элементами справочников, документами), а не с произвольными подстроками внутри текстовых реквизитов. Для замены символов внутри строковых полей множества объектов потребуется обработка с обходом данных и СтрЗаменить — такую задачу лучше поручить специалисту по 1С.
Проверка результата и типичные ограничения
После замены полезно проверить, что операция действительно выполнилась: сравните длину строки до и после или проверьте остаток искомой подстроки через СтрНайти. Если заменяли символ для последующего преобразования строки в число, убедитесь, что Число() или запрос с приведением типа отрабатывают без ошибки.
СтрокаДо = СтрДлина(ИсходнаяСтрока);
ИсходнаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");
Если СтрНайти(ИсходнаяСтрока, Символ(160)) > 0 Тогда
// Замена не сработала — возможно, символ другого кода
КонецЕсли;
Диагностировать «невидимый» символ можно, перебрав строку посимвольно и выведя код каждого символа функцией КодСимвола. Так вы точно узнаете, что стоит в строке: обычный пробел (32), неразрывный (160) или что-то ещё.
Как проверить результат
СтрНайти возвращает 0
СтрНайти находит вхождения — символ имеет другой код или регистр
Уменьшилась на ожидаемое число символов при удалении
Длина не изменилась — результат СтрЗаменить не присвоен переменной
Число() возвращает корректное значение
Ошибка преобразования — остались неразрывные пробелы или буквы
Помните про ограничения производительности: СтрЗаменить в цикле по сотням тысяч строк работает медленно из-за неизменяемости строк — каждая операция создаёт новую строку в памяти. Для массовой обработки текста эффективнее собирать результат через ЗаписьТекста, массив с последующим СтрСоединить или обрабатывать данные порциями.
Что важно запомнить
СтрЗаменить заменяет все вхождения подстроки и возвращает новую строку — результат нужно присваивать. Для замены по позиции используйте Лев, Сред и Прав. Спецсимволы задавайте через Символ(код) или Символы.ПС, а перед массовой заменой данных в базе делайте резервную копию.
Частые вопросы
Почему СтрЗаменить не меняет мою строку?
Функция возвращает новую строку, а не изменяет исходную переменную. Запись вида СтрЗаменить(Текст, "а", "б"); без присвоения результата ничего не делает. Правильно: Текст = СтрЗаменить(Текст, "а", "б");.
Как заменить символ без учёта регистра?
Встроенной регистронезависимой замены в 1С нет. Варианты: выполнить несколько замен для каждого варианта регистра, либо найти позиции через СтрНайти с параметром направления и заменять фрагменты вручную, сохраняя исходный регистр остального текста.
Как удалить символ, а не заменить его?
Удаление — это частный случай замены: передайте в качестве подстроки замены пустую строку, например СтрЗаменить(Текст, "-", "") удалит все дефисы.
Как заменить кавычки внутри строки в коде 1С?
В литералах встроенного языка кавычка внутри строки удваивается: СтрЗаменить(Текст, """", "'") заменит двойные кавычки на одинарные. Четыре кавычки подряд — это строка из одной кавычки.
Можно ли заменить символ в запросе 1С?
В языке запросов нет прямого аналога СтрЗаменить. Обычно данные выбирают запросом, а замену выполняют уже в коде при обходе выборки. В некоторых случаях подмену делают через ВЫБОР и ПОДСТРОКА, но это громоздко и оправдано только для фиксированных позиций.
Чем отличается Символы.ПС от Символ(10)?
Это один и тот же символ — перенос строки с кодом 10. Объект Символы просто предоставляет именованные константы для читаемости кода. Однако в данных из внешних источников перенос может быть записан как ВК+ПС (коды 13 и 10), поэтому при очистке текста часто заменяют обе комбинации.