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

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

Как выделить число из строки в 1С: рабочие способы и готовый код

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

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

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

Как устроена задача и какие бывают варианты входных данных

Прежде чем писать код, определите, что именно нужно извлечь. Строка «Заказ №1547 от поставщика» содержит одно целое число. Строка «Цена 1 250,50 руб.» — дробное число с разделителем групп разрядов. Строка «Температура -15 градусов» — отрицательное число. Строка «Артикул 45-78-12» содержит три числа, разделённые дефисами, и непонятно, считать ли их одним значением.

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

Маршрут решения

Как выбрать подход

Строка содержит одно простое целое числоИспользуйте перебор символов с проверкой на цифру
Нужны дробные или отрицательные числаРасширьте перебор обработкой разделителя и знака минус
Строка сложная, чисел несколько, формат заранее неизвестенПримените регулярные выражения (RegExp)
Используется Библиотека стандартных подсистемПроверьте готовые функции общего модуля СтроковыеФункцииКлиентСервер

Способ 1: перебор символов строки

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

Функция ВыделитьЧислоИзСтроки(ВходнаяСтрока) Экспорт

Цифры = "0123456789";

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

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

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

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

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

КонецЕсли;

КонецЦикла;

Если Результат = "" Тогда

Возврат 0;

Иначе

Возврат Число(Результат);

КонецЕсли;

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

Вызов ВыделитьЧислоИзСтроки("Счёт № 1547 от покупателя") вернёт число 1547. Обратите внимание на ограничение: из строки «45-78-12» функция вернёт 457812, потому что все цифры склеиваются. Если такое поведение неприемлемо, останавливайте сбор после первой «цифровой» группы или переходите к регулярным выражениям.

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

Способ 2: извлечение дробных и отрицательных чисел

Если в строке встречаются дробные числа, базовый перебор нужно дополнить обработкой разделителя. Разрешите один символ точки или запятой внутри результата и при необходимости замените запятую на точку перед вызовом Число() — функция Число() корректно воспринимает точку как разделитель.

Функция ВыделитьДробноеЧисло(ВходнаяСтрока) Экспорт

Допустимые = "0123456789.,";

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

РазделительВстречен = Ложь;

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

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

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

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

ИначеЕсли (Символ = "." Или Символ = ",") И Не РазделительВстречен

И СтрДлина(Результат) > 0 Тогда

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

РазделительВстречен = Истина;

КонецЕсли;

КонецЦикла;

Если Результат = "" Тогда

Возврат 0;

КонецЕсли;

Возврат Число(Результат);

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

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

Способ 3: регулярные выражения через RegExp

Когда формат строки сложный, удобнее регулярные выражения. На Windows-сервере и в толстом/тонком клиенте под Windows доступен COM-объект VBScript.RegExp. Паттерн \d+ находит все целые числа, -?\d+([.,]\d+)? — целые и дробные с возможным минусом.

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

МассивЧисел = Новый Массив;

Попытка

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

RegExp.Global = Истина;

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

Совпадения = RegExp.Execute(ВходнаяСтрока);

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

ТекстЧисла = СтрЗаменить(Совпадение.Value, ",", ".");

МассивЧисел.Добавить(Число(ТекстЧисла));

КонецЦикла;

Исключение

// COM-объект недоступен (Linux, веб-клиент)

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

Возврат МассивЧисел;

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

Главное ограничение способа — VBScript.RegExp недоступен на Linux-сервере и в веб-клиенте. Если решение должно быть кроссплатформенным, используйте перебор символов либо подключайте внешние компоненты, реализующие регулярные выражения для всех платформ.

Способ 4: готовые функции БСП и типовые механизмы

Если конфигурация построена на Библиотеке стандартных подсистем, проверьте общий модуль СтроковыеФункцииКлиентСервер — в нём есть вспомогательные функции работы со строками, включая проверку, является ли строка числом (ТолькоЦифрыВСтроке в актуальных версиях БСП). Это позволяет не писать посимвольную проверку вручную.

Также полезен тип ОписаниеТипов и метод ПривестиЗначение(): он безопасно приводит строку к числу, возвращая 0 при невозможности преобразования, без генерации исключения. Это удобно для финальной проверки результата после извлечения цифр.

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

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

// При ошибке приведения вернётся 0, исключения не будет

Проверка результата и обработка ошибок

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

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

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

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

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

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

Возникает ошибка преобразования или возвращается пустая строка, принятая дальше как число

Число с разделителем тысяч «1 250 500»
Норма

Пробелы удалены, результат 1250500

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

Результат 1 или ошибка преобразования

Несколько чисел в строке «45-78»
Норма

Поведение соответствует ТЗ: первое число, массив или склейка

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

Молчаливая склейка в 4578, хотя по смыслу это разные значения

Дробное число с запятой «12,5»
Норма

Результат 12.5

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

Результат 125 или 12

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

Типичные ошибки
01
Склейка всех цифр строки в одно число: «Артикул 45-78» превращается в 4578 вместо двух отдельных значений
02
Игнорирование неразрывного пробела (Символ(160)) из Excel — Число() выдаёт ошибку или неверный результат
03
Использование VBScript.RegExp без обработки исключения — код падает на Linux-сервере и в веб-клиенте
04
Отсутствие проверки пустого результата: Число("") вызывает исключение и прерывает загрузку всего файла

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

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

Используйте конструкцию Попытка: присвойте переменной результат Число(Строка) внутри попытки и перехватите исключение. Альтернатива без исключений — ОписаниеТипов("Число").ПривестиЗначение(), но помните: при неудаче вернётся 0, который неотличим от реального нуля в данных.

Как извлечь число из строки в запросе 1С?

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

Число из Excel «1 234,56» не преобразуется. Что делать?

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

Как выделить только первое число из строки?

При переборе символов введите флаг «число началось»: собирайте цифры, пока флаг активен, и прерывайте цикл оператором Прервать при первом нецифровом символе после начатой группы. В RegExp установите Global = Ложь — вернётся только первое совпадение.

Работает ли VBScript.RegExp на сервере Linux?

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

Как извлечь число из середины строки фиксированного формата, например «ЗН-0001547»?

Если формат стабилен, достаточно функций Сред() или СокрЛП с отсечением префикса: Сред(Строка, 4) удалит «ЗН-», а Число() преобразует остаток. Для надёжности добавьте проверку, что остаток состоит только из цифр.

Итог

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

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