Как удалить все символы из строки 1С, кроме русских, английских букв и цифр?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Решение 1: Использование регулярных выражений

Самый изящный способ, если вы работаете в среде Windows, — использование объекта VBScript.RegExp. Этот метод позволяет описать шаблон допустимых символов и «вытащить» только то, что нам нужно.

Рассмотрим, как это реализовать на практике:


Результат = \"\";
RegExp = Новый COMОбъект(\"VBScript.RegExp\");
RegExp.Global = True;
RegExp.IgnoreCase = True;
RegExp.Pattern = \"[а-яёa-z0-9]+\";
РезультатАнализаСтроки = RegExp.Execute(ИсходнаяСтрока);

Для Каждого ПодходящийЭлемент ИЗ РезультатАнализаСтроки Цикл
    Результат = Результат + ПодходящийЭлемент.Value;
КонецЦикла;

Важное примечание: Этот метод очень удобен, но при массовой обработке тысяч строк в циклах он может работать медленнее, чем прямая проверка кодов символов, из-за накладных расходов на создание COM-объекта.

Решение 2: Посимвольный перебор с «белым списком»

Если вы хотите избежать использования внешних объектов, можно применить посимвольный анализ. Мы создаем строку-алфавит из всех допустимых символов и проверяем каждый знак исходной строки на вхождение в этот алфавит.


ПолученнаяСтрока = \"\";
ДопустимыеСимволы = \"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz\"; 
// Добавьте сюда русские буквы, если необходимо

Для Шаг = 1 По СтрДлина(ИсходнаяСтрока) Цикл
    ТекущийСимвол = Сред(ИсходнаяСтрока, Шаг, 1);
    Если СтрНайти(ДопустимыеСимволы, ТекущийСимвол) > 0 Тогда
        ПолученнаяСтрока = ПолученнаяСтрока + ТекущийСимвол;
    КонецЕсли;
КонецЦикла;

Этот метод интуитивно понятен. Однако, если строка очень длинная, функция Сред() внутри цикла может стать «узким местом». В таких случаях лучше переходить к следующему способу.

Решение 3: Работа с кодами символов

Наиболее производительный метод для больших массивов данных — проверка через коды КодСимвола(). Вместо поиска по строке мы сравниваем числовое значение каждого символа с диапазонами Unicode.

  1. Цифры (0-9): коды 48–57.
  2. Английские буквы (A-Z, a-z): коды 65–90 и 97–122.
  3. Русские буквы (А-Я, а-я): коды 1040–1103 (не забудьте про «ё» — 1025 и 1105).

Рекомендуем использовать этот способ, если производительность системы критична.

Решение 4: Оптимизация через СтрРазделить и СтрСоединить

Можно использовать штатные функции платформы для «фильтрации» строки. Обратите внимание на важный нюанс: при разделении строки обязательно отключайте параметр ВключатьПустые.


ДопустимыеСимволы = \"0123456789AaBbCc...\"; // Полный список
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ДопустимыеСимволы, Ложь); 
// Использование Ложь ускоряет работу за счет отсутствия пустых элементов
ИтоговаяСтрока = СтрСоединить(МассивЧастей, \"\");

Заключение и рекомендации

Прежде чем приступать к удалению, проанализируйте данные. Если символы, которые вы планируете удалить (например, иероглифы), несут смысловую нагрузку для бизнеса, лучше использовать «черные списки» — то есть удалять только те символы, которые точно запрещены, вместо того чтобы стирать все подряд.

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

← На главную