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

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

Как в строке найти число в 1С

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

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

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

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

Самая частая подзадача — понять, является ли строка числом. Прямой вызов Число(Строка) небезопасен: если в строке есть буквы, платформа вызовет исключение. Поэтому преобразование оборачивают в попытку:

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

Попытка

Значение = Число(Строка);

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

Исключение

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

КонецПопытки;

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

Более строгий способ без исключений — через ОписаниеТипов. Метод ПривестиЗначение не вызывает ошибку, а возвращает значение по умолчанию, если приведение невозможно:

ОписаниеЧисла = Новый ОписаниеТипов("Число");

Результат = ОписаниеЧисла.ПривестиЗначение(Строка);

Если Результат = 0 И СокрЛП(Строка) <> "0" Тогда

// строка не является числом либо это реальный ноль

КонецЕсли;

Учтите неочевидный момент: строка «0» корректно приводится к нулю, поэтому проверку на ноль нужно совмещать с анализом исходной строки, иначе настоящий ноль будет отброшен как ошибка.

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

Если число «вмешано» в текст («Оплата 15000 руб. по счету 482»), нужно вытащить цифровые символы. Универсальный способ без внешних компонент — перебор с проверкой кода символа. Цифры «0»–«9» имеют коды от 48 до 57:

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

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

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

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

Код = КодСимвола(Символ);

Если Код >= 48 И Код <= 57 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

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

Способ работает на любой платформе — тонкий клиент, веб-клиент, Linux-сервер — и не требует никаких внешних компонентов. Это его главное преимущество перед регулярными выражениями.

Порядок извлечения чисел перебором
  1. 1
    Определите, нужны все цифры подряд или отдельные числа
  2. 2
    Напишите цикл по символам с проверкой КодСимвола от 48 до 57
  3. 3
    При необходимости накапливайте цифры и сбрасывайте в массив на нецифровом символе
  4. 4
    Преобразуйте результат функцией Число() с обработкой пустой строки
  5. 5
    Проверьте функцию на строках без цифр, с одним числом и с несколькими

Как найти позицию числа функцией СтрНайти

Если искомое число известно заранее (например, нужно найти вхождение «100» в строку), используйте СтрНайти — она возвращает позицию первого вхождения подстроки или 0, если подстрока не найдена:

Позиция = СтрНайти("Сумма документа 12500 рублей", "12500");

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

// число найдено, начинается с позиции Позиция

КонецЕсли;

В старых конфигурациях на платформе 8.2 и ранних 8.3 вместо СтрНайти применяется функция Найти с тем же смыслом. Учтите, что поиск идёт по точному совпадению: «12500» не будет найдено в строке «12 500» с пробелом-разделителем.

Опасность этого подхода — ложные совпадения: поиск «100» найдёт вхождение и внутри «210055». Если важно найти именно отдельное число, проверяйте соседние символы — они не должны быть цифрами.

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

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

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

RegExp.Global = Истина;

RegExp.Pattern = "\d+([.,]\d+)?";

Совпадения = RegExp.Execute("Цена 1500,50 руб, количество 3 шт");

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

Сообщить(Совпадение.Value); // 1500,50 и 3

КонецЦикла;

Шаблон \d+ находит последовательности цифр, а \d+([.,]\d+)? дополнительно захватывает дробную часть. Свойство Global = Истина включает поиск всех вхождений, а не только первого.

Как разбить строку и найти числа среди частей

Если числа отделены от текста пробелами или другими разделителями, удобен метод СтрРазделить. Строка превращается в массив подстрок, после чего каждая часть проверяется на «числовость»:

Части = СтрРазделить("Оплата 15000 по договору 17", " ");

Для Каждого Часть Из Части Цикл

Попытка

Значение = Число(Часть);

Сообщить("Найдено число: " + Значение);

Исключение

// это слово, пропускаем

КонецПопытки;

КонецЦикла;

Метод хорош для структурированных строк — назначений платежа, строк логов, параметров команд. Он не сработает, если число «прилеплено» к тексту без разделителя («сумма15000руб») — тогда придётся перебирать символы.

Сравнение способов поиска числа в строке

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

Проверка, что вся строка — число. Не ищет числа внутри текста

Перебор символов по кодам

Извлечение цифр в любой строке, кроссплатформенно. Требует написания цикла

СтрНайти

Поиск известного числа как подстроки. Риск ложных совпадений внутри больших чисел

RegExp через COM

Гибкие шаблоны, поиск всех чисел с дробной частью. Только Windows

СтрРазделить

Числа, отделённые разделителями. Не работает со «склеенным» текстом

Какие ошибки допускают при поиске чисел в строках

Первая распространённая ошибка — забыть про неразрывные пробелы и пробелы-разделители разрядов. Строка «12 500» из Excel часто содержит неразрывный пробел (код 160), и Число() может отработать не так, как ожидается. Перед преобразованием удаляйте лишние символы через СтрЗаменить.

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

Третья ошибка — потеря ведущих нулей. Если «число» на самом деле код, артикул или номер договора («007», «004521»), преобразование в число уничтожит нули. Такие значения нужно хранить и обрабатывать как строки.

Типичные ошибки
01
Вызов Число() без попытки — исключение прерывает обработку при первой же букве
02
Поиск «100» через СтрНайти без проверки соседних символов — находит вхождение внутри «210055»
03
Использование RegExp на кроссплатформенном решении — код падает на Linux-сервере
04
Преобразование кодов с ведущими нулями в число — теряется формат значения
05
Игнорирование неразрывного пробела — строка «12 500» не распознаётся как число

Как проверить, что поиск работает правильно

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

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

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

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

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

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

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

Возникает ошибка преобразования

Несколько чисел в строке
Норма

Найдены все числа или явно выбрано нужное

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

Числа склеились в одно или найдено только первое

Число с дробной частью
Норма

Сохранены и целая, и дробная части

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

Дробная часть обрезана или «приклеилась» к целой

Код с ведущими нулями
Норма

Значение осталось строкой «004521»

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

Нули потеряны, получилось 4521

Частые вопросы о поиске чисел в строке 1С

Есть ли в 1С готовая функция «найти число в строке»?

Нет, такой штатной функции во встроенном языке нет. Задачу решают комбинацией средств: СтрНайти для известной подстроки, перебор символов с КодСимвола для извлечения цифр, СтрРазделить для структурированных строк либо регулярные выражения через COM-объект на Windows.

Как найти все числа в строке, а не только первое?

Два рабочих варианта: перебор символов с накоплением цифр и сбросом в массив при встрече нецифрового символа, либо RegExp с шаблоном \d+ и свойством Global = Истина — коллекция совпадений будет содержать все числа.

Почему Число() вызывает ошибку, хотя в строке есть цифры?

Функция Число() преобразует строку только если она целиком представляет число. Любая буква, символ валюты или лишний знак вызывает исключение. Сначала извлеките цифровую часть перебором или регулярным выражением, а потом преобразовывайте её.

Как найти число в строке на Linux-сервере 1С?

COM-объекты недоступны, поэтому используйте кроссплатформенные средства: перебор символов с проверкой КодСимвола, СтрРазделить по разделителям или СтрНайти для известной подстроки. Этих средств достаточно для большинства задач разбора.

Как отличить число от кода с цифрами вроде «007»?

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

Можно ли найти число с учётом отрицательных значений?

Да, но стандартный шаблон \d+ знак минуса не захватывает. Добавьте в регулярное выражение необязательный знак: -?\d+([.,]\d+)?, а при переборе символов проверяйте, стоит ли перед цифрой минус и не является ли он дефисом между словами.

Итог

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

Готовой функции поиска числа в строке в 1С нет. Проверяйте строку на число через Число() в попытке или ОписаниеТипов, извлекайте цифры перебором символов — это работает везде, а регулярные выражения через RegExp оставьте для Windows-окружений. Всегда тестируйте код на пустых строках, дробных числах и значениях с ведущими нулями.