Разработка и Конфигурация · 10 мин
Как в строке найти число в 1С
Как найти число в строке на встроенном языке 1С: СтрНайти, регулярные выражения через COM, перебор символов и преобразование строки в число. Примеры кода и ошибки.
Задача найти число внутри строки в 1С возникает постоянно: нужно извлечь сумму из комментария платежа, вытащить артикул из наименования товара, распарсить ответ веб-сервиса или проверить, есть ли вообще цифры в поле ввода. Встроенный язык 1С не имеет единой функции «найти число», поэтому задачу решают несколькими способами — от простого перебора символов до регулярных выражений.
Выбор способа зависит от условий: нужно ли найти позицию числа, само число, все числа в строке или просто проверить, что строка состоит только из цифр. Ниже разобраны рабочие варианты с примерами кода, их ограничения и типичные ошибки, которые приводят к неверным результатам.
Как проверить, что строка содержит число целиком
Самая частая подзадача — понять, является ли строка числом. Прямой вызов Число(Строка) небезопасен: если в строке есть буквы, платформа вызовет исключение. Поэтому преобразование оборачивают в попытку:
Функция ЭтоЧисло(Строка) Экспорт
Попытка
Значение = Число(Строка);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Более строгий способ без исключений — через ОписаниеТипов. Метод ПривестиЗначение не вызывает ошибку, а возвращает значение по умолчанию, если приведение невозможно:
ОписаниеЧисла = Новый ОписаниеТипов("Число");
Результат = ОписаниеЧисла.ПривестиЗначение(Строка);
Если Результат = 0 И СокрЛП(Строка) <> "0" Тогда
// строка не является числом либо это реальный ноль
КонецЕсли;
Учтите неочевидный момент: строка «0» корректно приводится к нулю, поэтому проверку на ноль нужно совмещать с анализом исходной строки, иначе настоящий ноль будет отброшен как ошибка.
Как извлечь все цифры из строки перебором символов
Если число «вмешано» в текст («Оплата 15000 руб. по счету 482»), нужно вытащить цифровые символы. Универсальный способ без внешних компонент — перебор с проверкой кода символа. Цифры «0»–«9» имеют коды от 48 до 57:
Функция ИзвлечьЦифры(Строка) Экспорт
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Код = КодСимвола(Символ);
Если Код >= 48 И Код <= 57 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Этот метод склеивает все цифры подряд: из «счет 482 на 15000» получится «48215000». Если нужны отдельные числа, добавьте логику разделения: накапливайте цифры во временную переменную и при встрече нецифрового символа сохраняйте накопленное в массив.
Способ работает на любой платформе — тонкий клиент, веб-клиент, Linux-сервер — и не требует никаких внешних компонентов. Это его главное преимущество перед регулярными выражениями.
- 1Определите, нужны все цифры подряд или отдельные числа
- 2Напишите цикл по символам с проверкой КодСимвола от 48 до 57
- 3При необходимости накапливайте цифры и сбрасывайте в массив на нецифровом символе
- 4Преобразуйте результат функцией Число() с обработкой пустой строки
- 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руб») — тогда придётся перебирать символы.
Сравнение способов поиска числа в строке
Проверка, что вся строка — число. Не ищет числа внутри текста
Извлечение цифр в любой строке, кроссплатформенно. Требует написания цикла
Поиск известного числа как подстроки. Риск ложных совпадений внутри больших чисел
Гибкие шаблоны, поиск всех чисел с дробной частью. Только Windows
Числа, отделённые разделителями. Не работает со «склеенным» текстом
Какие ошибки допускают при поиске чисел в строках
Первая распространённая ошибка — забыть про неразрывные пробелы и пробелы-разделители разрядов. Строка «12 500» из Excel часто содержит неразрывный пробел (код 160), и Число() может отработать не так, как ожидается. Перед преобразованием удаляйте лишние символы через СтрЗаменить.
Вторая ошибка — игнорирование десятичного разделителя. Данные из внешних систем приходят и с точкой, и с запятой. Надёжнее заранее привести разделитель к одному виду, чем ловить исключения.
Третья ошибка — потеря ведущих нулей. Если «число» на самом деле код, артикул или номер договора («007», «004521»), преобразование в число уничтожит нули. Такие значения нужно хранить и обрабатывать как строки.
Как проверить, что поиск работает правильно
Перед тем как внедрять функцию в рабочий код, прогоните её на контрольном наборе строк: пустая строка, строка без цифр, строка только из цифр, число в начале, в середине и в конце текста, число с дробной частью, несколько чисел, отрицательное число со знаком минус.
Отдельно проверьте граничные случаи ваших реальных данных: типовые назначения платежей, наименования из справочника номенклатуры, ответы используемых веб-сервисов. Именно на них всплывают специфические форматы — разделители групп разрядов, суффиксы валют, склейка числа с единицей измерения.
Как проверить результат
Функция возвращает пустую строку или 0 без исключения
Возникает ошибка преобразования
Найдены все числа или явно выбрано нужное
Числа склеились в одно или найдено только первое
Сохранены и целая, и дробная части
Дробная часть обрезана или «приклеилась» к целой
Значение осталось строкой «004521»
Нули потеряны, получилось 4521
Частые вопросы о поиске чисел в строке 1С
Есть ли в 1С готовая функция «найти число в строке»?
Нет, такой штатной функции во встроенном языке нет. Задачу решают комбинацией средств: СтрНайти для известной подстроки, перебор символов с КодСимвола для извлечения цифр, СтрРазделить для структурированных строк либо регулярные выражения через COM-объект на Windows.
Как найти все числа в строке, а не только первое?
Два рабочих варианта: перебор символов с накоплением цифр и сбросом в массив при встрече нецифрового символа, либо RegExp с шаблоном \d+ и свойством Global = Истина — коллекция совпадений будет содержать все числа.
Почему Число() вызывает ошибку, хотя в строке есть цифры?
Функция Число() преобразует строку только если она целиком представляет число. Любая буква, символ валюты или лишний знак вызывает исключение. Сначала извлеките цифровую часть перебором или регулярным выражением, а потом преобразовывайте её.
Как найти число в строке на Linux-сервере 1С?
COM-объекты недоступны, поэтому используйте кроссплатформенные средства: перебор символов с проверкой КодСимвола, СтрРазделить по разделителям или СтрНайти для известной подстроки. Этих средств достаточно для большинства задач разбора.
Как отличить число от кода с цифрами вроде «007»?
По смыслу данных: если значение — идентификатор (артикул, номер договора, код), обрабатывайте его как строку и не преобразовывайте в число. Признак кода — фиксированная длина, ведущие нули и отсутствие арифметических операций над значением.
Можно ли найти число с учётом отрицательных значений?
Да, но стандартный шаблон \d+ знак минуса не захватывает. Добавьте в регулярное выражение необязательный знак: -?\d+([.,]\d+)?, а при переборе символов проверяйте, стоит ли перед цифрой минус и не является ли он дефисом между словами.
Что важно запомнить
Готовой функции поиска числа в строке в 1С нет. Проверяйте строку на число через Число() в попытке или ОписаниеТипов, извлекайте цифры перебором символов — это работает везде, а регулярные выражения через RegExp оставьте для Windows-окружений. Всегда тестируйте код на пустых строках, дробных числах и значениях с ведущими нулями.