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

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

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

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

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

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

Как определить, что символ является цифрой

Во встроенном языке 1С нет функции типа IsDigit, поэтому проверку делают через поиск символа в строке-шаблоне «0123456789». Функция СтрНайти возвращает позицию вхождения, а если символ не найден — ноль. Значит, условие СтрНайти("0123456789", Символ) > 0 истинно только для цифр.

Альтернатива — сравнение кодов символов через КодСимвола: цифры «0»–«9» имеют коды 48–57. Условие КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 работает быстрее при больших объёмах, но менее читаемо. Для типовых задач разница в производительности несущественна.

Базовый способ: перебор символов в цикле

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

Функция НайтиПервуюЦифру(Строка)

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

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

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

Возврат Позиция;

КонецЕсли;

КонецЦикла;

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

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

Функция возвращает позицию первой цифры или 0, если цифр в строке нет. Ноль — удобный признак «не найдено», потому что позиции в 1С нумеруются с единицы и ноль не может быть валидным результатом.

Если нужна сама цифра, а не позиция, верните Сред(Строка, Позиция, 1) или сразу преобразуйте её в число через Число(Символ). Учтите, что Число() вызывает исключение на нечисловых строках, поэтому применяйте его только после проверки.

Порядок действий
  1. 1
    Определите, что нужно получить: позицию, символ или число
  2. 2
    Напишите цикл от 1 до СтрДлина(Строка) с извлечением символа через Сред
  3. 3
    Проверьте символ условием СтрНайти("0123456789", Символ) > 0
  4. 4
    При совпадении сохраните результат и прервите цикл через Возврат или Прервать
  5. 5
    Обработайте случай, когда цифр нет: проверьте возвращаемый 0

Извлечение подстроки, начиная с первой цифры

Частая практическая задача — отрезать от строки всё до первой цифры, например получить «123А» из «АБВ-123А». Для этого позицию первой цифры передают в функцию Сред без указания длины: Сред(Строка, Позиция) вернёт хвост строки начиная с найденной позиции.

Добавьте защиту от пустого результата: если позиция равна нулю, вызов Сред(Строка, 0) вызовет ошибку. Правильный шаблон — сначала проверка, потом извлечение:

Позиция = НайтиПервуюЦифру(Строка);

Если Позиция > 0 Тогда

Хвост = Сред(Строка, Позиция);

Иначе

Хвост = "";

КонецЕсли;

Как извлечь число из цифр, идущих подряд

Если после первой цифры идут ещё цифры и нужно получить всё число (например, «123» из «АБВ123Г»), цикл продолжают, пока встречаются цифры, накапливая их в строку-результат. Затем строку преобразуют функцией Число().

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

ЦифрыНачались = Ложь;

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

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

ЭтоЦифра = СтрНайти("0123456789", Символ) > 0;

Если ЭтоЦифра Тогда

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

ЦифрыНачались = Истина;

ИначеЕсли ЦифрыНачались Тогда

Прервать; // цифры закончились

КонецЕсли;

КонецЦикла;

Флаг «ЦифрыНачались» важен: без него цикл соберёт все цифры строки, а не первую группу. Для строки «А1Б22» без флага получится «122», а с флагом — корректная «1».

Альтернативы: регулярные выражения и VBScript.RegExp

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

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

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

Посимвольный цикл

Универсален, работает на всех клиентах и серверах, легко расширяется до извлечения числа. Ограничение — многословность кода.

Десять вызовов СтрНайти

Компактнее для поиска только позиции, но выполняет лишние поиски и хуже читается.

VBScript.RegExp

Мощный шаблонный поиск, но работает только на Windows-сервере, не подходит для кроссплатформенных решений.

Частые ошибки и проверка результата

Самая распространённая ошибка — использовать результат поиска без проверки на ноль. Передача нулевой позиции в Сред вызывает ошибку выполнения, а в рабочей базе это выльется в прерванный обмен или непроведённый документ.

Вторая ошибка — забыть, что СтрДлина считает все символы, включая неразрывные пробелы и служебные знаки из выгрузок. Перед разбором строки из внешних источников полезно применить СокрЛП, а иногда и удалить неразрывные пробелы через СтрЗаменить с символом Символ(160).

Типичные ошибки
01
Использовать позицию без проверки на 0 — ошибка выполнения при отсутствии цифр
02
Собирать все цифры строки вместо первой группы — неверный результат для строк вида «А1Б22»
03
Применять Число() к строке с буквами — исключение и остановка обработки
04
Забыть Прервать цикл после находки — лишние итерации и риск перезаписать результат
Контрольные точки

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

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

Функция возвращает 0, обработка продолжается по ветке «не найдено»

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

Ошибка выполнения или пустая позиция уходит дальше в Сред

Цифра в начале строки
Норма

Позиция равна 1

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

Позиция 0 или больше 1 — цикл пропускает первый символ

Строка вида «А12Б3»
Норма

Позиция первой цифры = 2, число-группа = 12

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

Результат 123 — цифры собраны без флага начала группы

FAQ

Как найти последнюю цифру в строке?

Измените направление цикла: перебирайте позиции от СтрДлина(Строка) до 1 с шагом -1. Первая найденная при таком обходе цифра и будет последней в строке. Логика проверки символа через СтрНайти("0123456789", Символ) остаётся той же.

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

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

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

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

Что вернёт СтрНайти, если цифры нет?

СтрНайти вернёт 0. Это стандартный признак «не найдено» во встроенном языке, поскольку позиции символов нумеруются с единицы. Всегда проверяйте результат на ноль перед использованием в Сред или других функциях.

Можно ли найти первую цифру в запросе 1С?

В языке запросов прямой функции нет. Обычно задачу решают на уровне встроенного языка после выборки, либо через ПОДСТРОКА и цепочку сравнений, что громоздко. Если фильтрация по цифрам нужна массово, эффективнее подготовить данные заранее в отдельном реквизите.

Итог

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

Первую цифру в строке ищут посимвольным циклом с проверкой через СтрНайти("0123456789", Символ). Возвращайте 0 при отсутствии цифр и всегда проверяйте результат перед Сред. Для извлечения числа накапливайте цифры до первого нецифрового символа после начала группы.