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

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

Как убрать числа из строки в 1С

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

Задача убрать цифры из строки в 1С возникает регулярно: при очистке наименований номенклатуры от артикулов, при нормализации ФИО и адресов, при загрузке данных из Excel или внешних систем, где числовые фрагменты попали в текстовые поля. Во встроенном языке 1С нет готовой функции «удалить цифры», поэтому задачу решают несколькими способами — от простого посимвольного перебора до регулярных выражений через COM-объект.

Выбор способа зависит от контекста: где выполняется код (тонкий клиент, сервер, веб-клиент), какой объём строк обрабатывается и есть ли требование переносимости решения между конфигурациями. Ниже разобраны рабочие варианты с готовым кодом, ограничения каждого подхода и способы проверки результата.

Все примеры написаны на встроенном языке 1С и подходят для управляемых и обычных форм, если не указано иное. Перед вставкой кода в боевую базу проверьте его на копии — особенно если обработка затрагивает данные справочников массово.

Способ 1. Посимвольный перебор — универсальное решение

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

Функция УбратьЦифры(ИсходнаяСтрока) Экспорт

Цифры = "0123456789";

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

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

Символ = Сред(ИсходнаяСтрока, Позиция, 1);

Если СтрНайти(Цифры, Символ) = 0 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Функция работает в любом контексте: на сервере, в тонком, толстом и веб-клиенте, не требует внешних компонент и не зависит от операционной системы. Это делает её основным вариантом для общих модулей, которые должны быть переносимыми между конфигурациями.

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

Способ 2. Замена цифр через СтрЗаменить

Если строка короткая и нужен максимально простой код без циклов, можно последовательно заменить каждую из десяти цифр на пустую строку. Это читаемый вариант, который легко встроить прямо в место вызова без выноса в отдельную функцию.

Функция УбратьЦифрыЗаменой(ИсходнаяСтрока) Экспорт

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

Для Н = 0 По 9 Цикл

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

КонецЦикла;

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

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

Метод выполняет десять проходов по строке вместо одного, поэтому на длинных текстах он заметно медленнее посимвольного перебора. Зато код короче и его проще читать тем, кто сопровождает конфигурацию без глубокого знания языка.

Ограничение способа — только арабские цифры 0–9. Если в данных могут встречаться цифры других систем письменности (что бывает при импорте из внешних источников), они останутся в строке, и потребуется посимвольная проверка по расширенному списку.

Способ 3. Регулярные выражения через VBScript.RegExp

На платформе 1С под Windows можно использовать COM-объект VBScript.RegExp, который поддерживает регулярные выражения. Шаблон [0-9] или \d удаляет все цифры одним вызовом Replace.

Функция УбратьЦифрыРегулярнымВыражением(ИсходнаяСтрока) Экспорт

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

RegExp.Global = Истина;

RegExp.Pattern = "[0-9]";

Возврат RegExp.Replace(ИсходнаяСтрока, "");

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

Главное преимущество подхода — гибкость: тем же объектом легко удалить заодно лишние пробелы, знаки препинания или оставить только буквы определённого алфавита, просто изменив шаблон. Например, шаблон [^а-яА-Яa-zA-Z ] оставит только буквы и пробелы.

Перед использованием этого способа уточните, где физически исполняется код. Если обработка вызывается с клиента, а логика расположена в серверной процедуре, COM-объект создаётся на сервере — и именно его операционная система определяет доступность компонента.

Как убрать цифры вместе с лишними пробелами

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

Функция ОчиститьСтрокуОтЦифр(ИсходнаяСтрока) Экспорт

Результат = УбратьЦифры(ИсходнаяСтрока);

// Сжимаем повторные пробелы

Пока СтрНайти(Результат, " ") > 0 Цикл

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

КонецЦикла;

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

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

Функция СокрЛП убирает незначащие пробелы и символы табуляции слева и справа, а цикл с СтрЗаменить сводит любые цепочки пробелов к одному. Такой порядок важен: сначала удаляем цифры, потом нормализуем пробелы — иначе после удаления цифр пробелы «разъедутся» заново.

Если в исходных данных встречаются неразрывные пробелы (символ с кодом 160, часто приходит из Excel и веб-страниц), обычная замена двойных пробелов их не затронет. Добавьте предварительную замену: СтрЗаменить(Результат, Символ(160), " ").

Порядок действий
  1. 1
    Определите место исполнения кода: клиент, сервер Windows или Linux
  2. 2
    Для Linux и веб-клиента выберите посимвольный перебор или СтрЗаменить
  3. 3
    Для Windows-окружения при сложных шаблонах используйте VBScript.RegExp
  4. 4
    После удаления цифр сожмите двойные пробелы и примените СокрЛП
  5. 5
    Протестируйте функцию на реальных примерах из вашей базы
  6. 6
    Для массовой обработки сначала выполните её на копии базы

Массовая очистка данных в справочнике

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ЭтоГруппа";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

НовоеНаименование = ОчиститьСтрокуОтЦифр(Выборка.Наименование);

Если НовоеНаименование <> Выборка.Наименование Тогда

Элемент = Выборка.Ссылка.ПолучитьОбъект();

Элемент.Наименование = НовоеНаименование;

Элемент.Записать();

КонецЕсли;

КонецЦикла;

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

Обязательно учитывайте подписки на события и бизнес-логику записи. Если при записи номенклатуры срабатывают проверки, регистрация в обменах или пересчёт итогов, массовая обработка может занять заметное время и создать нагрузку на рабочую базу. Выполняйте её в нерабочее время и на копии.

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

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

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

Типичные ошибки
01
Использование Число(Символ) для проверки — исключение на каждой букве и падение производительности
02
Применение VBScript.RegExp в серверном коде на Linux — ошибка создания COM-объекта в момент вызова
03
Забытая нормализация пробелов — после удаления цифр остаются двойные пробелы и пробелы по краям
04
Массовая запись элементов без сравнения старого и нового значения — лишняя нагрузка и шум в планах обмена
05
Изменение данных в рабочей базе без резервной копии — необратимая потеря исходных значений

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

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

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

Строка без цифр
Норма

Возвращается без изменений

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

Строка изменилась или обрезалась

Строка только из цифр
Норма

Возвращается пустая строка

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

Остались символы или ошибка

Пустая строка на входе
Норма

Возвращается пустая строка без исключения

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

Ошибка выполнения

Пробелы после очистки
Норма

Одинарные пробелы, края обрезаны

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

Двойные пробелы, пробелы по краям

Часто задаваемые вопросы

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

Измените условие в посимвольном переборе: вместо проверки «это цифра» проверяйте вхождение символа в допустимый алфавит, например СтрНайти по строке с русскими и латинскими буквами. При использовании VBScript.RegExp примените шаблон [^а-яА-ЯёЁa-zA-Z ] — он удалит всё, кроме букв и пробелов.

Работает ли посимвольный перебор в веб-клиенте и на мобильной платформе?

Да. Функции СтрДлина, Сред и СтрНайти доступны во всех клиентах и на сервере под любой операционной системой, поэтому посимвольный перебор — единственный полностью переносимый вариант. Ограничения касаются только решений на COM-объектах.

Как убрать цифры из строки в запросе 1С без кода?

Язык запросов 1С не имеет функции замены подстроки, поэтому полноценно удалить цифры в запросе нельзя. Стандартный подход — получить выборку запросом и обработать строки в цикле на встроенном языке, либо выполнить очистку на стороне СУБД, если у вас прямые запросы, что выходит за рамки типовой разработки.

Что делать, если цифры нужно не удалить, а вынести в отдельную строку?

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

Почему после удаления цифр в строке остались «лишние» пробелы?

Цифра удаляется, а окружавшие её пробелы остаются, поэтому «Кабель 3 жилы» превращается в «Кабель жилы» с двойным пробелом. После удаления цифр сожмите повторные пробелы циклом СтрЗаменить и примените СокрЛП к результату.

Можно ли использовать функцию очистки в модуле с признаком «Вызов сервера»?

Да, если функция не использует COM-объекты и не обращается к клиентскому контексту. Посимвольный перебор и СтрЗаменить безопасны в серверных общих модулях. Вариант с VBScript.RegExp в серверном модуле будет работать только при Windows-версии сервера 1С.

Итог

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

Универсальное решение — посимвольный перебор с проверкой через СтрНайти: он работает везде и не требует внешних компонент. СтрЗаменить подходит для коротких строк, VBScript.RegExp — только для Windows. После удаления цифр нормализуйте пробелы, а массовую обработку данных выполняйте на копии базы с записью только изменённых элементов.