Разработка и Конфигурация · 11 мин
Как заменить символы в строке в 1С
Как заменить символы в строке в 1С: функция СтрЗаменить, работа с пробелами и спецсимволами, замена в запросах и макетах, примеры кода и типичные ошибки.
Замена символов в строке — одна из самых частых операций при разработке и доработке конфигураций 1С. Она нужна при очистке номеров документов от префиксов, нормализации телефонов и ИНН, подготовке данных к обмену, удалении лишних пробелов и спецсимволов из пользовательского ввода.
Основной инструмент — встроенная функция СтрЗаменить(), но у неё есть ограничения: она не умеет работать с шаблонами и регулярными выражениями. Поэтому для сложных сценариев применяют посимвольный разбор, функции работы со строками в запросах или внешние компоненты.
Ниже разобраны рабочие способы замены с примерами кода, условия выбора каждого варианта и типичные ошибки, из-за которых замена «молча» не срабатывает или портит данные.
Базовая функция СтрЗаменить: синтаксис и примеры
Функция СтрЗаменить() принимает три параметра: исходную строку, подстроку поиска и подстроку замены. Возвращается новая строка — исходная переменная не изменяется, результат нужно присвоить явно.
НомерДокумента = "00БП-001234";
НомерБезПрефикса = СтрЗаменить(НомерДокумента, "00БП-", "");
// Результат: "001234"
Текст = "Первая строка;Вторая строка";
Текст = СтрЗаменить(Текст, ";", Символы.ПС);
// Точки с запятой заменены на переносы строк
Замена выполняется по всем вхождениям подстроки, а не только по первому. Если подстрока поиска не найдена, функция просто возвращает исходную строку без ошибки — это удобно, но требует отдельной проверки результата.
Важно помнить: поиск регистрозависимый. Вызов СтрЗаменить("АБВ", "а", "б") ничего не заменит, потому что «А» и «а» — разные символы. Для регистронезависимой замены сначала приводят обе строки к одному регистру через ВРег() или НРег(), либо выполняют несколько замен подряд.
Замена пробелов, неразрывных пробелов и спецсимволов
Самая коварная ситуация — строка выглядит «с пробелами», но замена обычного пробела не срабатывает. Причина почти всегда в неразрывном пробеле (символ с кодом 160), который попадает в данные при копировании из Excel, Word или веб-страниц, а также формируется самой 1С при выводе чисел с разделителями групп.
Для очистки строки от всех видов пробельных символов используют цепочку замен или функцию СокрЛП() для краёв строки. Внутренние неразрывные пробелы убирают явно через Символ(160).
Строка = "1 234 567,89"; // внутри — неразрывные пробелы
Строка = СтрЗаменить(Строка, Символ(160), ""); // неразрывные пробелы
Строка = СтрЗаменить(Строка, " ", ""); // обычные пробелы
Строка = СтрЗаменить(Строка, Символы.Таб, ""); // табуляции
Для служебных символов платформа предоставляет объект Символы: Символы.ПС (перевод строки), Символы.ВК (возврат каретки), Символы.Таб (табуляция), Символы.НПП (неразрывный пробел). Используйте именованные константы вместо числовых кодов — код читается легче и не зависит от памяти разработчика.
Посимвольная замена и очистка строки по списку допустимых символов
Когда нужно удалить не конкретную подстроку, а все символы, кроме разрешённых (например, оставить в телефоне только цифры), перечислять замены через СтрЗаменить неудобно. Эффективнее пройти строку посимвольно и собрать результат из допустимых символов.
Функция ОставитьТолькоЦифры(Строка)
Результат = "";
Допустимые = "0123456789";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти(Допустимые, Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Такой подход применяют для нормализации телефонов, ИНН, КПП, ОГРН, банковских счетов — везде, где пользователь мог ввести скобки, дефисы, пробелы и прочее оформление. Перед записью в базу строку очищают, а форматирование накладывают уже при выводе.
Для длинных строк посимвольная конкатенация через «+» работает медленно из-за особенностей работы со строками. Если обрабатываются тексты в десятки тысяч символов, результат лучше собирать через ЗаписьXML в память или разбивать обработку на части.
- 1Определите, какие символы допустимы в результате (цифры, буквы, конкретный алфавит)
- 2Проверьте наличие неразрывных пробелов: выведите коды символов через КодСимвола()
- 3Выберите способ: СтрЗаменить для известных подстрок, посимвольный разбор — для фильтрации по списку
- 4Выполните замену и присвойте результат переменной или реквизиту
- 5Проверьте результат на контрольных примерах: пустая строка, строка только из запрещённых символов, смешанный регистр
Замена подстроки с учётом регистра и частичных совпадений
Если нужно заменить слово независимо от регистра, прямого инструмента в СтрЗаменить нет. Практикуют два подхода. Первый — несколько замен для типичных вариантов написания, что оправдано при ограниченном наборе форм. Второй — посимвольный разбор с поиском подстроки через СтрНайти() в приведённом к нижнему регистру представлении.
// Поиск позиции без учёта регистра
Позиция = СтрНайти(НРег(ИсходнаяСтрока), НРег(ПодстрокаПоиска));
Если Позиция > 0 Тогда
Результат = Лев(ИсходнаяСтрока, Позиция - 1)
+ ПодстрокаЗамены
+ Сред(ИсходнаяСтрока, Позиция + СтрДлина(ПодстрокаПоиска));
КонецЕсли;
Функция СтрНайти() возвращает позицию первого вхождения или 0, если вхождения нет. Комбинация Лев/Сред/СтрНайти позволяет заменить только первое вхождение или реализовать собственную логику, которой нет в стандартной СтрЗаменить.
Для полноценных регулярных выражений во встроенном языке нет штатной поддержки. На практике используют внешние компоненты, вызов скриптовых движков Windows (VBScript.RegExp) на сервере под Windows или переносят сложную обработку текста во внешние обработки. Это оправдано только когда посимвольный разбор становится слишком громоздким.
Сравнение способов замены
Подходит для замены известных подстрок. Ограничение: регистрозависимость и отсутствие шаблонов.
Подходит для фильтрации по списку допустимых символов и нестандартной логики. Медленнее на больших строках.
Подходит для замены первого вхождения или работы без учёта регистра. Требует аккуратного расчёта позиций.
Подходят для сложных шаблонов. Ограничение: зависимость от внешних компонент и платформы.
Замена символов в запросах и при выгрузке данных
В языке запросов 1С нет полноценного аналога СтрЗаменить. В типовых ситуациях обходятся так: выбирают строки как есть и обрабатывают их уже в коде после выполнения запроса. Это самый надёжный вариант, особенно когда логика замены нетривиальна.
Если замена нужна именно в запросе для условия соединения или сравнения, иногда применяют приёмы с ПОДСТРОКА() и поиском через ПОДОБНО, но возможности ограничены: оператор ПОДОБНО умеет проверять шаблон с символами «%» и «_», однако не выполняет замену. Сложную очистку в запросе реализовать нельзя — и не нужно, это работа уровня кода.
При выгрузке в файлы (CSV, XML, обмен с сайтом) замену выполняют перед записью каждого поля. Отдельно контролируйте символы-разделители: если в выгружаемой строке встречается точка с запятой, а файл — CSV с этим разделителем, её нужно заменить или экранировать, иначе структура файла развалится.
Перед обменом данными с внешними системами проверьте строки на наличие управляющих символов с кодами меньше 32 (кроме табуляции и перевода строки). Они часто приходят из старых баз и ломают XML-выгрузку: документ просто не загружается на стороне приёмника с невнятной ошибкой.
Проверка результата и контрольные точки
После замены результат стоит проверять не «на глаз», а программно. Минимальный набор проверок: длина строки изменилась ожидаемо, запрещённые символы отсутствуют (СтрНайти() возвращает 0), строка не стала пустой, если пустое значение недопустимо для реквизита.
При массовой обработке данных ведите счётчики: сколько строк обработано, в скольких реально произошла замена, сколько строк после очистки оказались пустыми. Расхождение этих цифр с ожиданиями — сигнал остановиться и разобраться, прежде чем записывать изменения в базу.
Как проверить результат
СтрНайти(Результат, ПодстрокаПоиска) = 0
Подстрока всё ещё находится — вероятно, регистр или неразрывный пробел
Длина изменилась на ожидаемую величину
Длина не изменилась — замена не сработала
Строка содержит значимые символы
После очистки строка пуста, а реквизит обязательный
КодСимвола() показывает только ожидаемые значения
Присутствуют коды 160 или управляющие коды
Типичные ошибки при замене символов
Лидирует ошибка с неприсвоенным результатом: СтрЗаменить(Строка, "-", "") без записи возвращаемого значения. Вторая по частоте — попытка заменить обычный пробел там, где стоит неразрывный. Третья — забвение регистрозависимости при замене буквенных фрагментов.
Отдельная группа ошибок связана с порядком замен. Если сначала заменить «-» на «», а потом искать «--», второй шаг ничего не найдёт. При цепочке замен продумывайте последовательность и тестируйте на строках, где подстроки пересекаются.
Что важно запомнить
Основной инструмент — СтрЗаменить с явным присваиванием результата; поиск регистрозависимый. Неразрывные пробелы убирают через Символ(160) или Символы.НПП. Для фильтрации по списку символов используйте посимвольный разбор, в запросах замену не делают — обрабатывайте строки в коде. Перед массовой обработкой данных делайте копию и пробный прогон.
Частые вопросы
Почему СтрЗаменить не удаляет пробелы из числа?
Почти всегда причина в неразрывном пробеле (код 160), которым 1С разделяет группы разрядов при форматировании чисел. Заменяйте через СтрЗаменить(Строка, Символы.НПП, "") или Символ(160). Проверить фактический код символа можно функцией КодСимвола(Строка, Позиция).
Как заменить только первое вхождение подстроки?
СтрЗаменить заменяет все вхождения. Для первого вхождения найдите позицию через СтрНайти(), затем соберите строку из Лев(), подстроки замены и Сред() от конца найденного фрагмента.
Можно ли заменить символы с учётом шаблона, как в регулярных выражениях?
Штатно — нет, во встроенном языке нет регулярных выражений. Варианты: посимвольный разбор с собственной логикой, внешние компоненты или вызов VBScript.RegExp на сервере под Windows, если политика безопасности это допускает.
Как удалить из строки все символы, кроме цифр?
Пройдите строку циклом по позициям, проверяйте каждый символ через СтрНайти("0123456789", Символ) и добавляйте допустимые в строку-результат. Готовый пример функции приведён в разделе о посимвольной замене.
Есть ли замена строк в языке запросов 1С?
Полноценной функции замены в запросах нет. Оператор ПОДОБНО только проверяет соответствие шаблону. Практичный путь — выбрать данные запросом и выполнить замену в коде при обходе выборки.
Чем опасна массовая замена в реквизитах справочников?
Ошибочная логика замены необратимо изменит данные у всех обработанных объектов. Перед запуском сделайте резервную копию, выполните пробный прогон без записи с выводом списка изменений и только потом записывайте результат.