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

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

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

Как преобразовать строку в число в 1С: функция Число(), СтрокаВЧисло, ОписаниеТипов, обработка ошибок, пробелов, запятых и нечисловых символов.

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

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

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

Функция Число(): базовый способ преобразования

Штатная функция встроенного языка Число(Значение) преобразует строку в число, если строка содержит корректное числовое представление. Разделителем дробной части должна быть точка, а не запятая.

Количество = Число("123.45"); // 123.45

Целое = Число("1000"); // 1000

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

Обратите внимание: строка с пробелами по краям обычно преобразуется корректно, но неразрывные пробелы (код 160), которые часто встречаются в данных, скопированных из Excel или веб-страниц, вызывают ошибку. Поэтому перед преобразованием строку стоит нормализовать.

bsl
Функция СтрокаВЧислоБезопасно(Строка)
    Очищенная = СтрЗаменить(Строка, Символ(160), "");
    Очищенная = СтрЗаменить(Очищенная, " ", "");
    Очищенная = СтрЗаменить(Очищенная, ",", ".");
    Попытка
        Возврат Число(Очищенная);
    Исключение
        Возврат 0;
    КонецПопытки;
КонецФункции

Как подготовить строку перед преобразованием

Реальные данные редко приходят в чистом виде. Число, выгруженное из Excel, может содержать разделители разрядов, символ валюты или знак процента. Прежде чем вызывать Число(), удалите из строки всё лишнее.

Типовая последовательность очистки: убрать неразрывные и обычные пробелы, заменить запятую на точку, удалить символы валют и прочие нечисловые знаки. Для удаления всего, кроме цифр, точки и минуса, удобно перебрать строку посимвольно или использовать регулярные выражения через COM-объект VBScript.RegExp на сервере Windows.

Порядок безопасного преобразования
  1. 1
    Удалите неразрывные пробелы: СтрЗаменить(Строка, Символ(160), "")
  2. 2
    Уберите обычные пробелы и символы валют
  3. 3
    Замените запятую на точку как разделитель дробной части
  4. 4
    Проверьте, что строка не пустая после очистки
  5. 5
    Выполните Число() внутри блока Попытка/Исключение
  6. 6
    Проверьте результат на допустимый диапазон (например, неотрицательность для количества)

Отдельная ситуация — отрицательные числа и числа в экспоненциальной записи. Минус в начале строки функция Число() обрабатывает корректно, а вот запись вида «1,5E+3» может не поддерживаться в зависимости от контекста, поэтому такие значения лучше нормализовать заранее.

Альтернативные способы: ОписаниеТипов и XMLЗначение

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

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

Новый КвалификаторыЧисла(15, 2));

Результат = ОписаниеЧисла.ПривестиЗначение("123,45");

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

Третий вариант — функции XMLЗначение(Тип("Число"), Строка) и обратная XMLСтрока(). Они работают с каноническим представлением чисел и применимы при разборе XML и JSON, где формат строго определён. Для «грязных» пользовательских данных этот способ менее удобен, так как тоже требует корректного формата.

Сравнение способов преобразования

Число(Строка)

Быстро и явно, но вызывает исключение на некорректных данных. Подходит для контролируемых источников с обработкой ошибок.

ОписаниеТипов.ПривестиЗначение()

Не падает на ошибках, возвращает 0, приводит к заданной разрядности. Поведение зависит от региональных настроек.

XMLЗначение / XMLСтрока

Строгий канонический формат, удобно для XML/JSON. Не терпит произвольного пользовательского ввода.

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

Прежде чем преобразовывать, полезно убедиться, что строка состоит только из допустимых символов. Простая проверка — перебор символов и сравнение с допустимым набором «0123456789.,-».

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

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

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

Если СтрНайти(Допустимые, Сред(Строка, Позиция, 1)) = 0 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Такая проверка не гарантирует корректность формата (строка «1.2.3» пройдёт фильтр, но не преобразуется), поэтому она дополняет, а не заменяет Попытка/Исключение. В типовых конфигурациях также встречаются готовые функции вида СтроковыеФункцииКлиентСервер.СтрокаВЧисло() в составе БСП — если конфигурация включает библиотеку, стоит использовать её, а не писать свою.

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

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

Значение после преобразования
Норма

Число совпадает с исходным значением, дробная часть не потеряна

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

Результат 0 при непустой строке — вероятно, преобразование молча не сработало

Разделитель дробной части
Норма

Точка в строке, копейки на месте

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

Запятая — Число() упадёт или вернёт только целую часть

Пробельные символы
Норма

Строка очищена от пробелов и Символ(160)

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

Исключение на строках, скопированных из Excel или браузера

Типичные ошибки и их последствия

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

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

Типичные ошибки
01
Вызов Число() без Попытка/Исключение — обработка падает на первой некорректной строке
02
Замена ошибки нулём без протоколирования — расхождения в данных обнаруживаются слишком поздно
03
Забытая замена запятой на точку — дробная часть теряется или возникает исключение
04
Игнорирование неразрывного пробела (Символ(160)) — ошибки на данных из Excel и веб-форм
05
Приведение через ОписаниеТипов с узкой разрядностью — скрытое округление больших сумм

Особые случаи: даты, булево и числа из форматированных строк

Иногда под видом числа в строке приходит другое значение. Например, строки «Да»/«Нет» или «Истина»/«Ложь» нужно преобразовывать не в число, а в булево — функция Число() здесь бесполезна, используйте явное сравнение или XMLЗначение с типом Булево.

Числа с форматированием вида «1 234 567,89 ₽» требуют полной очистки: убрать пробелы-разделители разрядов, символ валюты и только потом преобразовывать. Если формат известен заранее, иногда проще использовать функцию Формат() с обратной логикой — но штатной функции «разформатировать» нет, поэтому очистка остаётся основным инструментом.

FAQ

Почему Число("1 000") вызывает ошибку?

Строка содержит разделитель разрядов — обычный или неразрывный пробел. Удалите пробелы через СтрЗаменить(), включая Символ(160) для неразрывных, затем повторите преобразование.

Как преобразовать строку с запятой, например «123,45»?

Функция Число() требует точку как разделитель дробной части. Выполните СтрЗаменить(Строка, ",", ".") перед вызовом. Учтите, что запятая могла быть и разделителем разрядов в английской нотации — тогда её нужно удалять, а не заменять.

Что вернёт ОписаниеТипов.ПривестиЗначение() для нечисловой строки?

Метод не вызывает исключение и возвращает значение по умолчанию для типа Число — ноль. Поэтому факт ошибки нужно отслеживать отдельно, сравнивая исходную строку с ожидаемым форматом.

Как отличить пустую строку от строки с нулём?

Проверяйте строку до преобразования: если после очистки СтрДлина равна нулю, значение отсутствует, и подставлять 0 или Неопределено — решение вашей логики. Строка «0» при этом корректно преобразуется в число 0.

Есть ли готовая функция в типовых конфигурациях?

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

Итог

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

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