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

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

1С: как удалить спецсимволы из строки

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

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

Во встроенном языке 1С нет единой готовой функции «удалить все спецсимволы», поэтому задачу решают несколькими способами: функцией СтрЗаменить, перебором символов с проверкой кодов, регулярными выражениями (через VBScript.RegExp в толстом клиенте Windows) или типовыми функциями БСП. Выбор зависит от того, что именно нужно оставить: только буквы и цифры, конкретный «белый список» или просто убрать непечатаемые символы.

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

Что считать спецсимволами и почему они мешают

Под спецсимволами в практике 1С обычно понимают непечатаемые и служебные символы: неразрывный пробел (код 160), табуляцию (код 9), перенос строки (код 10), возврат каретки (код 13), а также мягкий перенос, нулевой символ и знаки пунктуации, попавшие в числовые поля. Визуально они часто неотличимы от обычного пробела, поэтому проблему замечают только при сбое.

Типичные симптомы: Число("1 250,50") вызывает ошибку преобразования, потому что между разрядами стоит неразрывный пробел; поиск контрагента по наименованию не находит запись, хотя строка «на вид» совпадает; сравнение двух строк возвращает Ложь из-за переноса строки в конце одной из них. Платформа сравнивает строки посимвольно, поэтому любой невидимый символ делает строки разными.

Удаление известных символов через СтрЗаменить

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

Функция УбратьЛишнее(ИсходнаяСтрока)

Результат = ИсходнаяСтрока;

Результат = СтрЗаменить(Результат, Символы.НПП, " ");

Результат = СтрЗаменить(Результат, Символы.ПС, " ");

Результат = СтрЗаменить(Результат, Символы.ВК, "");

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

Возврат СокрЛП(Результат);

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

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

Если нужно убрать несколько разных знаков пунктуации, удобно организовать цикл по строке-списку удаляемых символов:

Удаляемые = ";:.,!?*#%&";

Для Позиция = 1 По СтрДлина(Удаляемые) Цикл

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

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

КонецЦикла;

Универсальная очистка перебором символов по кодам

Когда набор «мусора» заранее неизвестен, надёжнее работает обратный подход — «белый список»: перебрать строку посимвольно и оставить только то, что разрешено. Проверка выполняется через КодСимвола: цифры имеют коды 48–57, русские буквы — 1040–1103 (плюс Ё/ё — 1025 и 1105), латиница — 65–90 и 97–122.

Функция ОставитьТолькоБуквыИЦифры(Знач Строка)

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

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

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

Если (Код >= 48 И Код <= 57) // 0-9

Или (Код >= 65 И Код <= 90) // A-Z

Или (Код >= 97 И Код <= 122) // a-z

Или (Код >= 1040 И Код <= 1103) // А-я

Или Код = 1025 Или Код = 1105 Тогда // Ё, ё

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

КонецЕсли;

КонецЦикла;

Возврат Результат;

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

Такой подход гарантированно вычищает всё, что не входит в список, включая экзотические символы Unicode из внешних систем. Платой является производительность: конкатенация строк в цикле на очень длинных текстах работает медленно. Для строк разумной длины (наименования, номера документов, ИНН, телефоны) это не имеет значения.

Регулярные выражения и их ограничения

Во встроенном языке 1С нет штатной поддержки регулярных выражений. В толстом клиенте и на сервере под Windows разработчики традиционно используют COM-объект VBScript.RegExp:

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.Global = Истина;

RegExp.Pattern = "[^0-9A-Za-zА-Яа-яЁё]";

ЧистаяСтрока = RegExp.Replace(ИсходнаяСтрока, "");

Шаблон [^0-9A-Za-zА-Яа-яЁё] означает «удалить всё, кроме перечисленного». Способ компактный и быстрый, но у него жёсткие ограничения: COM-объект недоступен в тонком и веб-клиенте, на Linux-сервере и в безопасном режиме (например, в расширениях с запретом небезопасных действий и во фреш-сервисе). Перед использованием проверьте, где будет выполняться код, и предусмотрите запасной вариант посимвольной очистки.

Сравнение способов очистки

СтрЗаменить

Подходит, когда список удаляемых символов известен. Быстро и просто, но новый неожиданный символ не будет удалён.

Перебор по КодСимвола

Универсальный вариант, работает везде, включая веб-клиент и безопасный режим. Требует аккуратно задать допустимые диапазоны кодов.

VBScript.RegExp

Компактный код и гибкие шаблоны, но только Windows и не в безопасном режиме. Не подходит для тонкого и веб-клиента.

Типовые функции БСП и очистка чисел

Если конфигурация построена на Библиотеке стандартных подсистем, часть задач уже решена. Полезно знать функцию СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы, а также приёмы из подсистемы работы со строками. Перед написанием собственной обработки проверьте, нет ли готовой функции в общих модулях СтроковыеФункцииКлиентСервер и ОбщегоНазначения — это сокращает дублирование кода.

Частный и очень частый случай — очистка строки перед преобразованием в число. Здесь логика такая: сначала заменить неразрывные пробелы и обычные пробелы-разделители разрядов, привести десятичный разделитель к точке или запятой в зависимости от дальнейшего использования, затем удалить всё, кроме цифр и разделителя:

Функция СтрокаВЧислоБезопасно(Знач СтрокаЧисла)

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

Подготовленная = СтрЗаменить(Подготовленная, " ", "");

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

ОписаниеЧисла = Новый ОписаниеТипов("Число");

Возврат ОписаниеЧисла.ПривестиЗначение(Подготовленная);

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

ОписаниеТипов.ПривестиЗначение не вызывает исключение при неудаче, а возвращает 0 — это удобно для загрузки данных, но маскирует ошибки. Если важно отличить «ноль» от «не удалось прочитать», добавьте проверку: строка, состоящая не только из цифр и разделителя, должна попадать в протокол загрузки.

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

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

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

Сообщить(СтрШаблон("Позиция %1: код %2",

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

КонецЦикла;

Вторая проверка — сравнение длин: если после очистки СтрДлина изменилась не так, как ожидалось, значит, удалилось что-то нужное или осталось что-то лишнее. Для числовых полей контрольный признак — успешное преобразование Число() без исключения и совпадение суммы контрольных значений до и после загрузки.

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

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

Сравнение двух строк после очистки
Норма

Сравнение возвращает Истина для визуально одинаковых строк

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

Строки «на вид» одинаковые, но сравнение даёт Ложь — остался скрытый символ

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

Число() выполняется без ошибки, значение совпадает с ожидаемым

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

Ошибка преобразования или значение 0 вместо реального числа

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

Длина уменьшилась ровно на количество удалённых символов

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

Длина изменилась сильнее — удалены значимые символы

Типичные ошибки
01
Замена неразрывного пробела пустой строкой между словами — слова склеиваются в одно. Заменяйте на обычный пробел.
02
Ожидание, что СокрЛП уберёт неразрывный пробел по краям строки — СокрЛП работает только с обычными пробельными символами, НПП нужно заменять отдельно.
03
Использование VBScript.RegExp без проверки режима работы — код падает в веб-клиенте и в безопасном режиме.
04
Удаление всех знаков пунктуации из наименований и адресов — теряется значимая информация, поиск и печатные формы ухудшаются.
05
Очистка строки до проверки формата — например, удаление дефисов из ИНН или номера до валидации ломает контроль структуры.

Где применять очистку в реальных задачах

На практике очистку строк встраивают в несколько типовых точек. При загрузке из Excel, CSV и веб-сервисов — сразу после чтения значения, до записи в объекты. При поиске дублей — нормализуют обе сравниваемые строки одинаковой функцией: приведение к верхнему регистру, удаление лишних пробелов и спецсимволов. При формировании имён файлов — удаляют символы, запрещённые файловой системой (\ / : * ? " < > |), иначе запись файла завершится ошибкой.

Важно различать очистку «для сравнения» и «для хранения». Для сравнения можно применять агрессивную нормализацию — результат не сохраняется в базу. Для хранения чистить нужно аккуратно и только от явно лишнего: неразрывных пробелов, управляющих символов, лишних переносов. Значимые знаки в наименованиях, адресах и номерах удалять нельзя.

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

Как выбрать способ

Нужно убрать конкретные известные символы (НПП, табуляция, переносы)Используйте цепочку СтрЗаменить с Символы.НПП, Символы.Таб, Символы.ПС
Состав мусора неизвестен, нужно оставить только буквы и цифрыПереберите строку посимвольно с проверкой КодСимвола по белому списку
Код работает только на Windows-сервере вне безопасного режима и шаблон сложныйМожно использовать VBScript.RegExp с шаблоном исключения
Строка должна стать числом после загрузки из файлаУберите НПП и пробелы, приведите разделитель и используйте ОписаниеТипов.ПривестиЗначение
Итог

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

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

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

Почему СокрЛП не удаляет пробел в конце строки?

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

Как удалить из строки все символы, кроме цифр?

Переберите строку посимвольно и оставляйте только символы с кодами 48–57, либо используйте регулярное выражение с шаблоном «[^0-9]» там, где доступен COM-объект. Первый вариант работает в любом клиенте.

Работает ли VBScript.RegExp в тонком клиенте и в 1С:Фреш?

Нет. COM-объекты доступны только в толстом клиенте и на сервере под Windows вне безопасного режима. В тонком, веб-клиенте и сервисе используйте посимвольную обработку через КодСимвола.

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

Выведите строку в цикле: для каждой позиции покажите КодСимвола. Коды 9, 10, 13, 160 и другие значения вне диапазонов букв и цифр укажут на служебные символы и их точное положение.

Можно ли очистить строку запросом, без кода?

В языке запросов 1С есть только функция Заменить в выражениях СКД и ограниченные строковые операции; полноценной замены произвольных символов в запросе нет. Очистку выполняют в коде до записи данных или при выводе результата запроса.

Опасно ли удалять все знаки препинания из наименований контрагентов?

Для хранения — да: кавычки, дефисы и точки могут быть значимой частью названия. Агрессивную очистку применяйте только к временной копии строки для сравнения и поиска дублей, а в базу записывайте исходное или мягко очищенное значение.