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

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

Как найти цифры в строке 1С

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

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

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

Как проверить, есть ли цифры в строке

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

Функция ЕстьЦифры(Строка) Экспорт

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

Символ = Сред(Строка, Поз, 1);

Если СтрНайти("0123456789", Символ) > 0 Тогда

Возврат Истина;

КонецЕсли;

КонецЦикла;

Возврат Ложь;

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

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

Как извлечь все цифры из строки

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

Функция ИзвлечьЦифры(Строка) Экспорт

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

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

Символ = Сред(Строка, Поз, 1);

Если СтрНайти("0123456789", Символ) > 0 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Вызов ИзвлечьЦифры("Заказ № 45 от 12.03, сумма 1500") вернёт строку «4512031500». Обратите внимание: все группы цифр склеиваются в одну последовательность без разделителей. Если нужно сохранить группы отдельно — например, получить массив чисел из строки, — логику придётся усложнить: накапливать текущую группу и сбрасывать её в массив при встрече нецифрового символа.

Для очень длинных строк конкатенация в цикле может работать медленно из-за особенностей работы со строками. На практике это заметно только при объёмах в сотни тысяч символов; для типовых реквизитов и наименований разницы вы не почувствуете.

Как найти позицию первой цифры

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

Функция ПозицияПервойЦифры(Строка) Экспорт

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

Если СтрНайти("0123456789", Сред(Строка, Поз, 1)) > 0 Тогда

Возврат Поз;

КонецЕсли;

КонецЦикла;

Возврат 0; // цифр нет

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

Возврат нуля — удобный признак отсутствия цифр, потому что позиции символов в 1С нумеруются с единицы. Используя результат, можно разрезать строку: Лев(Строка, Позиция - 1) даст текстовую часть, Сред(Строка, Позиция) — всё, начиная с первой цифры.

Порядок действий при разделении строки
  1. 1
    Найдите позицию первой цифры функцией с циклом
  2. 2
    Проверьте, что результат больше нуля — иначе цифр в строке нет
  3. 3
    Возьмите текстовую часть через Лев(Строка, Позиция - 1)
  4. 4
    Возьмите числовую часть через Сред(Строка, Позиция)
  5. 5
    Проверьте результат на тестовой строке с цифрами в начале, середине и конце

Как проверить, что строка состоит только из цифр

Обратная задача — убедиться, что в строке нет ничего, кроме цифр. Это типичная проверка для ИНН, КПП, телефонных номеров, штрихкодов перед записью в базу. Здесь условие инвертируется: как только встречается нецифровой символ, функция возвращает Ложь.

Функция ТолькоЦифры(Строка) Экспорт

Если ПустаяСтрока(Строка) Тогда

Возврат Ложь;

КонецЕсли;

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

Если СтрНайти("0123456789", Сред(Строка, Поз, 1)) = 0 Тогда

Возврат Ложь;

КонецЕсли;

КонецЦикла;

Возврат Истина;

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

Обратите внимание на проверку пустой строки в начале: без неё пустая строка формально прошла бы проверку, что обычно нежелательно. Также помните про пробелы по краям — пользовательский ввод часто содержит их. Перед проверкой примените СокрЛП(), а если пробелы могут быть внутри (например, при копировании номера карты), сначала удалите их через СтрЗаменить(Строка, " ", "").

Типичные ошибки
01
Проверка без СокрЛП: строка " 7701234567" не пройдёт валидацию из-за ведущего пробела, хотя цифры корректны
02
Использование Число(Строка) в Попытке для проверки: строка "1е5" преобразуется в число, хотя содержит букву
03
Забытая обработка пустой строки: функция возвращает Истина для пустого значения, и некорректные данные попадают в базу
04
Сравнение символов через коды без учёта юникода: внешне похожие символы из других раскладок не распознаются как цифры

Как использовать регулярные выражения

Для сложных шаблонов — например, «найти число с десятичной частью» или «все группы цифр длиной от 4 до 6» — циклы становятся громоздкими. На сервере или толстом клиенте под Windows можно использовать COM-объект VBScript.RegExp.

Функция НайтиВсеЧисла(Строка) Экспорт

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

RegExp.Global = Истина;

RegExp.Pattern = "\d+";

Найденные = RegExp.Execute(Строка);

Результат = Новый Массив;

Для Каждого Совпадение Из Найденные Цикл

Результат.Добавить(Совпадение.Value);

КонецЦикла;

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

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

Шаблон \d+ находит последовательности цифр, \d+(?:[.,]\d+)? — числа с возможной дробной частью, ^\d+$ — проверяет, что вся строка состоит из цифр. Вызов RegExp.Test(Строка) возвращает булево и удобен для простой валидации.

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

Для большинства прикладных задач достаточно перебора символов: он работает везде, не требует внешних компонентов и легко читается другими разработчиками. Регулярные выражения оправданы, когда шаблон сложный и платформа гарантированно Windows.

Сравнение вариантов

Перебор символов + СтрНайти

Работает на любой платформе и клиенте. Подходит для проверки и извлечения цифр, но код разрастается на сложных шаблонах

VBScript.RegExp

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

Число() в Попытке

Подходит только для проверки, что строка целиком является числом. Не находит цифры внутри текста и пропускает форматы вроде "1е5"

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

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

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

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

Функция проверки возвращает Ложь, извлечение — пустую строку

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

Возвращается Истина или непустая строка — ошибка в условии цикла

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

ТолькоЦифры возвращает Истина, извлечение возвращает исходную строку

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

Ложь при корректных данных — проверьте пробелы и неразрывные пробелы

Смешанная строка
Норма

Извлекаются все группы цифр в правильном порядке

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

Потеряны цифры в начале или конце строки — ошибка в границах цикла

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

Как найти цифры в строке на мобильной платформе 1С?

Только перебором символов с функцией СтрНайти по строке «0123456789». COM-объекты, включая VBScript.RegExp, на мобильной платформе недоступны, поэтому весь код валидации и извлечения должен быть написан на чистом встроенном языке.

Как извлечь из строки не цифры, а число с дробной частью?

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

Почему СтрНайти не находит цифру, которая видна в строке?

Вероятно, символ выглядит как цифра, но является другим знаком юникода — например, введён из другой раскладки или скопирован из внешнего документа. Проверьте код символа функцией КодСимвола(): у обычных цифр коды от 48 до 57.

Как проверить ИНН или КПП на корректность?

Сначала убедитесь функцией ТолькоЦифры, что строка состоит из цифр, затем проверьте длину: для ИНН юридического лица — 10 знаков, для физического — 12, для КПП — 9. Полная проверка включает контрольные суммы по официальному алгоритму ФНС, одного наличия цифр недостаточно.

Что быстрее: цикл или регулярное выражение?

На коротких строках разница незаметна. На длинных строках и массовых обработках цикл с досрочным выходом обычно эффективнее, потому что не требует создания COM-объекта. Создание RegExp — самая затратная операция, поэтому его стоит создавать один раз и переиспользовать.

Итог

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

Универсальный способ найти цифры в строке 1С — цикл с проверкой каждого символа через СтрНайти("0123456789", Символ). Он работает на любой платформе. Регулярные выражения через VBScript.RegExp удобны для сложных шаблонов, но доступны только на Windows. Перед проверками очищайте строку от пробелов и обрабатывайте пустое значение.