Разработка и Конфигурация · 11 мин
Как убрать цифры из строки в 1С
Как убрать цифры из строки в 1С: посимвольный перебор, регулярные выражения, функция СтрЗаменить. Готовые примеры кода, проверка результата и типичные ошибки.
Задача удаления цифр из строки возникает в 1С постоянно: при очистке номенклатуры от артикулов, при разборе ФИО с лишними символами, при обработке загруженных из Excel данных, при нормализации адресов и наименований контрагентов. Встроенной функции «удалить цифры» во встроенном языке 1С нет, поэтому задачу решают несколькими способами — от простого посимвольного перебора до регулярных выражений через COM-объект.
Выбор метода зависит от контекста: где выполняется код (толстый клиент, тонкий клиент, сервер, веб-клиент), какой объём данных обрабатывается и насколько критична производительность. Ниже разобраны четыре рабочих подхода с готовым кодом, их ограничения и критерии выбора.
Способ 1: посимвольный перебор с проверкой символа
Самый надёжный и переносимый метод — пройти по строке посимвольно и собрать новую строку только из тех символов, которые не являются цифрами. Проверка выполняется через функцию СтрНайти(): если символ найден в строке «0123456789», значит, это цифра и её нужно пропустить.
Функция УбратьЦифры(ИсходнаяСтрока)
Результат = "";
Цифры = "0123456789";
Для Позиция = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Символ = Сред(ИсходнаяСтрока, Позиция, 1);
Если СтрНайти(Цифры, Символ) = 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Этот код работает везде: на сервере, в тонком и веб-клиенте, без каких-либо внешних компонент. Ограничение — производительность: конкатенация строк в цикле на длинных текстах (десятки тысяч символов) создаёт много промежуточных строк в памяти. Для обычных реквизитов длиной до нескольких сотен символов это несущественно.
Вместо СтрНайти можно использовать проверку кода символа через КодСимвола(): цифры занимают диапазон кодов 48–57. Такой вариант чуть быстрее, но менее читаем и требует комментария в коде, иначе «магические числа» 48 и 57 запутают того, кто будет сопровождать конфигурацию.
Если СтрНайти("0123456789", Сред(Строка, Позиция, 1)) = 0 Тогда Результат = Результат + Сред(Строка, Позиция, 1); КонецЕсли;Способ 2: цепочка СтрЗаменить для каждой цифры
Если перебор кажется громоздким, можно десять раз применить СтрЗаменить() — по одному разу на каждую цифру. Функция заменяет все вхождения подстроки, поэтому цикл по исходной строке не нужен.
Функция УбратьЦифрыЗаменой(ИсходнаяСтрока)
Результат = ИсходнаяСтрока;
Для Н = 0 По 9 Цикл
Результат = СтрЗаменить(Результат, Строка(Н), "");
КонецЦикла;
Возврат Результат;
КонецФункции
Код короче и понятнее для начинающих разработчиков. Важный нюанс: Строка(Н) для числа 0–9 вернёт «0», «1» и так далее без пробелов, поэтому дополнительное форматирование не требуется. Если бы использовалось форматирование числа, потребовалось бы убрать неразрывные пробелы групп разрядов.
По скорости метод сопоставим с посимвольным перебором на коротких строках, а на длинных иногда выигрывает, потому что замена выполняется на уровне платформы, а не в интерпретируемом цикле. Метод полностью безопасен и работает в любом режиме клиента.
Способ 3: регулярные выражения через VBScript.RegExp
На сервере под Windows и в толстом клиенте доступен COM-объект VBScript.RegExp, который позволяет удалить цифры одной операцией — заменой шаблона [0-9] или \d на пустую строку.
Функция УбратьЦифрыРегулярнымВыражением(ИсходнаяСтрока)
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "[0-9]";
Возврат RegExp.Replace(ИсходнаяСтрока, "");
КонецФункции
Это самый быстрый вариант при пакетной обработке тысяч строк: объект создаётся один раз вне цикла, а замена выполняется движком регулярных выражений. Шаблон легко расширить — например, [0-9\.\,] удалит заодно точки и запятые, а \D оставит только цифры (обратная задача).
Дополнительный риск — разрядность: на 64-разрядном сервере 1С регистрация COM-компонентов может отличаться. Если код внезапно перестал работать после обновления платформы или переезда сервера, первым делом проверьте доступность VBScript.RegExp в той же разрядности процесса.
Способ 4: запросом и в СКД
Иногда цифры нужно убрать не в коде, а прямо в запросе — например, при сравнении наименований из разных источников. В языке запросов 1С нет функции замены по шаблону, поэтому применяют вложенные вызовы ЗАМЕНИТЬ (в тех СУБД и версиях платформы, где функция доступна) или выносят очистку во временную таблицу с последующей обработкой кодом.
Практичный приём: выгрузить результат запроса в таблицу значений, обойти её и очистить нужную колонку любой из функций выше, затем поместить таблицу обратно во временную таблицу менеджера запроса. Это особенно удобно при сопоставлении данных при загрузке прайсов, когда «чистое» наименование используется как ключ поиска.
Сравнение вариантов
Работает везде без зависимостей; медленнее на очень длинных строках из-за конкатенации.
Простой и переносимый код; десять проходов по строке, что приемлемо для типовых реквизитов.
Максимальная скорость и гибкие шаблоны; только Windows и недоступен в тонком/веб-клиенте.
Подходит для пакетной обработки выборок; требует промежуточной таблицы значений.
Проверка результата и контрольные точки
После внедрения функции проверьте её на граничных случаях, а не только на «боевых» данных. Пустая строка должна вернуть пустую строку без ошибки. Строка из одних цифр — пустую строку. Строка без цифр — вернуться без изменений. Эти три теста отлавливают большинство ошибок реализации.
Отдельно проверьте нестандартные символы: неразрывный пробел (код 160), табуляцию, переносы строк. Они не являются цифрами и останутся в результате — если требуется убрать и их, добавьте СокрЛП() или явную замену. Также учтите, что цифры из других алфавитов (например, арабские ٠–٩) перечисленные выше методы не удалят — для типовых учётных задач это редкость, но при обработке международных данных стоит помнить.
Как проверить результат
Получено "Заказ от ." — цифры удалены, буквы и знаки сохранены
Остались цифры или удалены буквы — ошибка в условии фильтрации
Возвращается пустая строка без исключения
Ошибка выполнения или Неопределено в результате
Возвращается пустая строка
Возвращается исходная строка — замена не сработала
Функция отрабатывает без ошибок
Исключение при создании COMОбъект — метод не переносим
Типичные ошибки при удалении цифр
Частая ошибка — изменение исходного реквизита объекта вместо работы с копией. Если функция вызывается в цикле обработки документов и результат записывается обратно без проверки, можно безвозвратно потерять артикулы и номера в наименованиях. Перед массовой обработкой всегда делайте копию базы или сначала выводите результат в отчёт для визуальной проверки.
Вторая ошибка — забыть про производительность в циклах: создание COM-объекта RegExp внутри цикла по тысяче строк замедляет обработку в разы. Объект создаётся один раз до цикла. Третья — использование Число() для проверки символа: функция выбрасывает исключение на нечисловых строках и ведёт себя неочевидно с пробелами и знаками, поэтому для посимвольной проверки она не подходит.
Как выбрать метод под свою задачу
Для разовой очистки реквизита в форме или простой обработки достаточно посимвольного перебора — он не требует ничего, кроме встроенного языка, и его легко читать любому разработчику. Для регламентных заданий на сервере Windows с большими объёмами выгоднее RegExp. Если код должен работать в мобильном или веб-клиенте — только перебор или СтрЗаменить.
Как выбрать действие
Если задача обратная — оставить только цифры (например, извлечь номер телефона или ИНН из строки), — логика инвертируется: в переборе символ добавляется к результату, когда СтрНайти(Цифры, Символ) > 0, а в RegExp используется шаблон [^0-9] или \D для удаления всего, кроме цифр.
Часто задаваемые вопросы
Можно ли убрать цифры из строки без программирования, типовыми средствами?
В типовых конфигурациях нет штатной обработки «удалить цифры из строки». Если нужно разово почистить данные, используют групповое изменение реквизитов с произвольным алгоритмом (в конфигурациях на БСП), куда вставляют одну из функций из статьи, либо выгружают данные в табличный документ и обрабатывают внешними средствами.
Как удалить цифры только в начале или только в конце строки?
Используйте цикл с проверкой позиции: для начала строки идите с первого символа и обрывайте цикл на первом нецифровом символе, затем возьмите остаток через Сред(). Для конца строки идите справа налево от СтрДлина() к 1. В RegExp это делается шаблонами ^[0-9]+ и [0-9]+$ соответственно.
Почему после СтрЗаменить в строке остались лишние пробелы?
Цифры удаляются, а окружавшие их пробелы остаются — например, «Заказ 123 от 5» превращается в «Заказ от ». Примените СокрЛП() к результату, а для схлопывания двойных пробелов внутри строки выполните замену двух пробелов на один в цикле, пока СтрНайти(Результат, " ") больше нуля.
Работает ли VBScript.RegExp на сервере 1С под Linux?
Штатно — нет, это COM-технология Windows. На Linux используйте посимвольный перебор, СтрЗаменить или внешние компоненты по технологии Native API, если регулярные выражения критичны. Для большинства учётных задач перебора достаточно.
Как убрать из строки не только цифры, но и латиницу или спецсимволы?
В посимвольном методе расширьте строку исключаемых символов, например: "0123456789" + "abcdefghijklmnopqrstuvwxyz". В RegExp используйте класс символов: [0-9a-zA-Z] удалит цифры и латиницу, а [^а-яА-ЯёЁ ] оставит только кириллицу и пробелы.
Есть ли разница в поведении между управляемым и обычным приложением?
Для перебора и СтрЗаменить разницы нет — код идентичен. Отличие только в доступности COM-объектов: в обычном приложении (толстый клиент) RegExp доступен, в управляемом тонком и веб-клиенте — нет. Поэтому переносимые функции лучше писать на переборе и размещать в общих модулях с нужными флагами компиляции.
Что важно запомнить
Для удаления цифр из строки в 1С используйте посимвольный перебор со СтрНайти("0123456789", ...) — это переносимый метод для любого клиента. Цепочка СтрЗаменить проще в записи, VBScript.RegExp быстрее на сервере Windows, но недоступен в тонком и веб-клиенте. Перед массовой обработкой проверьте функцию на пустой строке, строке из одних цифр и строке без цифр, а исходные данные сохраните.