Разработка и Конфигурация · 10 мин
Как убрать все буквы из строки в 1С
Как удалить все буквы из строки в 1С: перебор символов, регулярные выражения, СтрЗаменить и запросы. Готовые функции, проверка результата и типичные ошибки.
Задача удалить все буквы из строки встречается в 1С постоянно: очистка телефонных номеров от скобок и слов, извлечение цифр из артикулов, нормализация ИНН или кодов, которые пользователи вводят «как попало». Во встроенном языке нет готовой функции «убрать буквы», поэтому задачу решают несколькими способами: перебором символов, регулярными выражениями, серией замен или запросом.
Выбор способа зависит от контекста: где выполняется код (тонкий клиент, веб-клиент, сервер), какого объёма данные и насколько критична скорость. Для разовой обработки подойдёт простой цикл, для пакетной очистки миллионов записей в справочнике разумнее вынести логику в запрос или выполнить её на сервере.
Важно заранее определить, что считать «буквой»: только кириллицу, только латиницу или оба алфавита, а также нужно ли сохранять пробелы, знаки препинания и спецсимволы вроде дефиса. От этого ответа зависит условие фильтрации в коде.
Способ 1. Посимвольный перебор с проверкой кода символа
Самый надёжный и переносимый метод — пройти по строке циклом и проверить каждый символ. Функция КодСимвола возвращает числовой код символа Unicode, и по диапазону кодов можно определить, является ли символ буквой.
Для кириллицы основной диапазон — коды от 1040 до 1103 (включая Ё и ё), для латиницы — от 65 до 90 (A–Z) и от 97 до 122 (a–z). Если символ не попадает ни в один из этих диапазонов, он добавляется в результат.
Функция УбратьБуквы(Строка)
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, Позиция);
ЭтоБуква = (Код >= 1040 И Код <= 1103)
Или (Код >= 65 И Код <= 90)
Или (Код >= 97 И Код <= 122);
Если Не ЭтоБуква Тогда
Результат = Результат + Сред(Строка, Позиция, 1);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Такой код работает на любом клиенте и на сервере, не требует внешних компонент и легко модифицируется: например, можно инвертировать условие и оставить только цифры (коды 48–57).
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, Позиция);
Если Код >= 48 И Код <= 57 Тогда
Результат = Результат + Сред(Строка, Позиция, 1);
КонецЕсли;
КонецЦикла;Способ 2. Оставить только цифры — частный и самый частый случай
На практике «убрать буквы» почти всегда означает «оставить цифры»: телефоны, ИНН, ОГРН, номера документов. В этом случае условие упрощается — достаточно проверить, что код символа лежит в диапазоне 48–57.
Альтернатива без кодов — сравнение символа со строкой-шаблоном через СтрНайти. Символ считается цифрой, если он входит в строку «0123456789»:
Функция ТолькоЦифры(Строка)
Цифры = "0123456789";
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти(Цифры, Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Этот вариант чуть медленнее сравнения кодов, но нагляднее: шаблон допустимых символов виден прямо в коде, и его легко расширить, например добавить в разрешённые символы точку или знак «плюс» для телефонов.
Способ 3. Регулярные выражения через VBScript.RegExp
Если код выполняется на сервере или толстом клиенте под Windows, доступен COM-объект VBScript.RegExp, который позволяет решить задачу одной строкой замены. Шаблон [A-Za-zА-Яа-яЁё] описывает все буквы, а метод Replace заменяет их на пустую строку.
Функция УбратьБуквыРегуляркой(Строка)
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "[A-Za-zА-Яа-яЁё]";
Возврат RegExp.Replace(Строка, "");
КонецФункции
Для обратной задачи — оставить только цифры — шаблон ещё короче: [^0-9] или \D (всё, что не цифра). Регулярные выражения удобны, когда шаблон сложный: например, убрать буквы, но только стоящие в начале строки, или удалить латиницу, сохранив кириллицу.
Главное ограничение — привязка к Windows. На Linux-сервере и в веб-клиенте COM-объект недоступен, и код выдаст ошибку. Поэтому в мобильных и кроссплатформенных решениях от RegExp отказываются в пользу посимвольного перебора.
Способ 4. Перебор с функцией СтрЗаменить по алфавиту
Иногда встречается подход «заменить каждую букву на пустоту» через цикл по алфавиту и СтрЗаменить. Метод рабочий, но громоздкий: нужно перечислить оба алфавита в обоих регистрах и выполнить десятки проходов по строке.
Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
+ "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Для Позиция = 1 По СтрДлина(Алфавит) Цикл
Строка = СтрЗаменить(Строка, Сред(Алфавит, Позиция, 1), "");
КонецЦикла;
Такой вариант оправдан только в учебных целях или когда под рукой нет возможности написать полноценную функцию. По производительности он заметно уступает посимвольному перебору, потому что каждая замена создаёт новую копию строки.
Способ 5. Очистка данных запросом при массовой обработке
Если буквы нужно убрать у тысяч записей справочника или регистра, выгружать каждую строку в цикл неэффективно. Логику можно перенести в запрос, комбинируя ПОДСТРОКА и проверку вхождения символа через ПОДОБНО или ВЫБОР. Однако язык запросов не умеет циклов, поэтому полноценная посимвольная очистка в запросе громоздка.
Практичный компромисс — обработка в запросе для типовых случаев. Например, если известно, что мусорные символы ограничены (скобки, дефисы, отдельные буквы-префиксы), их убирают цепочкой вложенных замен через функцию запроса ЗАМЕНИТЬ там, где она поддерживается СУБД, либо выбирают данные запросом, а чистят в серверной процедуре пакетами.
При массовой обработке не забывайте про транзакции и блокировки: изменение большого справочника в одной транзакции может надолго заблокировать таблицу. Разбивайте обработку на порции по несколько сотен записей с фиксацией после каждой порции.
Сравнение способов
Кроссплатформенно и быстро; подходит почти всегда. Требует аккуратного перечисления диапазонов.
Наглядный список разрешённых символов; чуть медленнее, удобен для «оставить цифры и дефис».
Одна строка кода и мощные шаблоны, но только Windows и не в веб-клиенте.
Для массовой обработки на СУБД; сложная логика в запросе громоздка, часто комбинируется с серверной процедурой.
Проверка результата и типичные ошибки
После очистки полезно убедиться, что результат соответствует ожиданиям: длина строки совпадает с ожидаемой (например, 10 цифр для ИНН юрлица), в строке не осталось букв, исходные данные не потеряны безвозвратно. Перед массовой обработкой сохраните исходное значение в отдельном реквизите или сделайте резервную копию информационной базы.
Как проверить результат
Остались только цифры и разрешённые символы
В строке видны буквы или неожиданные знаки
Совпадает с ожидаемой (например, 10 или 12 для ИНН)
Строка короче или длиннее нормы — возможно, удалено лишнее
Пустая строка только если в исходнике не было цифр
Пусто при явно числовом исходнике — ошибка в условии фильтра
Удаляется вместе с остальными буквами
Остаётся в строке — диапазон 1040–1103 её покрывает, проверьте код
Частые вопросы
Как убрать только кириллицу, оставив латиницу?
В посимвольном переборе оставьте в условии только кириллический диапазон: коды 1040–1103. Латинские буквы (65–90 и 97–122) в условие не включайте — они попадут в результат. В RegExp используйте шаблон [А-Яа-яЁё].
Как убрать буквы и пробелы одновременно?
Добавьте пробел (код 32) и неразрывный пробел (код 160) в список удаляемых символов, либо после очистки примените СокрЛП и замену пробелов через СтрЗаменить(Результат, " ", ""). Проще сразу оставлять только цифры — тогда пробелы удалятся автоматически.
Работает ли посимвольный перебор в веб-клиенте?
Да. Функции СтрДлина, Сред, КодСимвола и СтрНайти доступны во всех клиентах, включая веб-клиент и мобильную платформу. Недоступен только COM-объект VBScript.RegExp.
Что быстрее: перебор символов или регулярное выражение?
На коротких строках разница незаметна. На больших объёмах создание COM-объекта даёт накладные расходы при каждом вызове, поэтому объект RegExp стоит создавать один раз и переиспользовать. Для массовых операций выигрыш обычно даёт перенос обработки на сервер, а не выбор конкретной функции.
Как убрать буквы из строки в запросе без кода?
Полноценной функции «удалить буквы» в языке запросов нет. Для ограниченного набора мусорных символов используют вложенные замены, если СУБД поддерживает соответствующую функцию, либо выбирают данные запросом и очищают в серверной процедуре. Для произвольных букв чистый запрос не подходит.
Как проверить, что в строке вообще есть буквы, до очистки?
Пройдите по строке и проверьте коды символов на попадание в буквенные диапазоны — как только нашли букву, возвращайте Истина. Это дешевле, чем строить очищенную копию и сравнивать её с оригиналом, особенно на длинных строках.
Что важно запомнить
Базовое решение — посимвольный перебор с проверкой кодов Unicode: оно кроссплатформенно и предсказуемо. Для задачи «оставить цифры» достаточно диапазона 48–57. RegExp удобен, но только под Windows. Перед массовой очисткой сохраните исходные значения и разбивайте обработку на порции.