Разработка и Конфигурация · 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Найдите позицию первой цифры функцией с циклом
- 2Проверьте, что результат больше нуля — иначе цифр в строке нет
- 3Возьмите текстовую часть через Лев(Строка, Позиция - 1)
- 4Возьмите числовую часть через Сред(Строка, Позиция)
- 5Проверьте результат на тестовой строке с цифрами в начале, середине и конце
Как проверить, что строка состоит только из цифр
Обратная задача — убедиться, что в строке нет ничего, кроме цифр. Это типичная проверка для ИНН, КПП, телефонных номеров, штрихкодов перед записью в базу. Здесь условие инвертируется: как только встречается нецифровой символ, функция возвращает Ложь.
Функция ТолькоЦифры(Строка) Экспорт
Если ПустаяСтрока(Строка) Тогда
Возврат Ложь;
КонецЕсли;
Для Поз = 1 По СтрДлина(Строка) Цикл
Если СтрНайти("0123456789", Сред(Строка, Поз, 1)) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Обратите внимание на проверку пустой строки в начале: без неё пустая строка формально прошла бы проверку, что обычно нежелательно. Также помните про пробелы по краям — пользовательский ввод часто содержит их. Перед проверкой примените СокрЛП(), а если пробелы могут быть внутри (например, при копировании номера карты), сначала удалите их через СтрЗаменить(Строка, " ", "").
Как использовать регулярные выражения
Для сложных шаблонов — например, «найти число с десятичной частью» или «все группы цифр длиной от 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.
Сравнение вариантов
Работает на любой платформе и клиенте. Подходит для проверки и извлечения цифр, но код разрастается на сложных шаблонах
Компактный код для сложных шаблонов. Только Windows, недоступен в веб-клиенте и на Linux-сервере
Подходит только для проверки, что строка целиком является числом. Не находит цифры внутри текста и пропускает форматы вроде "1е5"
Если функция будет вызываться в массовых обработках — например, при загрузке тысяч строк из файла, — разместите её в серверном общем модуле с признаком «Вызов сервера», чтобы не гонять данные между клиентом и сервером в цикле. Для разовых проверок в форме достаточно клиентской процедуры.
Как проверить результат
Функция проверки возвращает Ложь, извлечение — пустую строку
Возвращается Истина или непустая строка — ошибка в условии цикла
ТолькоЦифры возвращает Истина, извлечение возвращает исходную строку
Ложь при корректных данных — проверьте пробелы и неразрывные пробелы
Извлекаются все группы цифр в правильном порядке
Потеряны цифры в начале или конце строки — ошибка в границах цикла
Частые вопросы
Как найти цифры в строке на мобильной платформе 1С?
Только перебором символов с функцией СтрНайти по строке «0123456789». COM-объекты, включая VBScript.RegExp, на мобильной платформе недоступны, поэтому весь код валидации и извлечения должен быть написан на чистом встроенном языке.
Как извлечь из строки не цифры, а число с дробной частью?
Перебирайте символы и допускайте в результате одну точку или запятую: заведите флаг «разделитель уже встречался». Перед преобразованием через Число() замените запятую на точку, иначе возникнет ошибка преобразования.
Почему СтрНайти не находит цифру, которая видна в строке?
Вероятно, символ выглядит как цифра, но является другим знаком юникода — например, введён из другой раскладки или скопирован из внешнего документа. Проверьте код символа функцией КодСимвола(): у обычных цифр коды от 48 до 57.
Как проверить ИНН или КПП на корректность?
Сначала убедитесь функцией ТолькоЦифры, что строка состоит из цифр, затем проверьте длину: для ИНН юридического лица — 10 знаков, для физического — 12, для КПП — 9. Полная проверка включает контрольные суммы по официальному алгоритму ФНС, одного наличия цифр недостаточно.
Что быстрее: цикл или регулярное выражение?
На коротких строках разница незаметна. На длинных строках и массовых обработках цикл с досрочным выходом обычно эффективнее, потому что не требует создания COM-объекта. Создание RegExp — самая затратная операция, поэтому его стоит создавать один раз и переиспользовать.
Что важно запомнить
Универсальный способ найти цифры в строке 1С — цикл с проверкой каждого символа через СтрНайти("0123456789", Символ). Он работает на любой платформе. Регулярные выражения через VBScript.RegExp удобны для сложных шаблонов, но доступны только на Windows. Перед проверками очищайте строку от пробелов и обрабатывайте пустое значение.