Разработка и Конфигурация · 9 мин
Как из строки получить число в 1С
Как преобразовать строку в число в 1С: функция Число(), СтрокаВЧисло, ОписаниеТипов, обработка ошибок, пробелов, запятых и нечисловых символов.
Преобразование строки в число — одна из самых частых задач при разработке на встроенном языке 1С. Она возникает при загрузке данных из файлов, обмене с внешними системами, парсинге ответов веб-сервисов и обработке пользовательского ввода. Встроенный язык предлагает несколько способов решения, и у каждого есть свои ограничения.
Основная сложность в том, что строка может содержать всё что угодно: пробелы, запятую вместо точки, символ валюты, буквы. Прямое преобразование в таких случаях либо вернёт ноль, либо вызовет ошибку, поэтому рабочий код почти всегда включает предварительную очистку и проверку результата.
Ниже разобраны штатные функции платформы, приёмы безопасного преобразования и типичные ошибки, которые приводят к потере данных или падению обработки.
Функция Число(): базовый способ преобразования
Штатная функция встроенного языка Число(Значение) преобразует строку в число, если строка содержит корректное числовое представление. Разделителем дробной части должна быть точка, а не запятая.
Количество = Число("123.45"); // 123.45
Целое = Число("1000"); // 1000
Если строка не может быть интерпретирована как число, функция вызывает исключение «Преобразование значения к типу Число не может быть выполнено». Это критично при пакетной обработке: одна испорченная строка из тысячи остановит всю загрузку, если исключение не перехвачено.
Обратите внимание: строка с пробелами по краям обычно преобразуется корректно, но неразрывные пробелы (код 160), которые часто встречаются в данных, скопированных из Excel или веб-страниц, вызывают ошибку. Поэтому перед преобразованием строку стоит нормализовать.
Функция СтрокаВЧислоБезопасно(Строка)
Очищенная = СтрЗаменить(Строка, Символ(160), "");
Очищенная = СтрЗаменить(Очищенная, " ", "");
Очищенная = СтрЗаменить(Очищенная, ",", ".");
Попытка
Возврат Число(Очищенная);
Исключение
Возврат 0;
КонецПопытки;
КонецФункцииКак подготовить строку перед преобразованием
Реальные данные редко приходят в чистом виде. Число, выгруженное из Excel, может содержать разделители разрядов, символ валюты или знак процента. Прежде чем вызывать Число(), удалите из строки всё лишнее.
Типовая последовательность очистки: убрать неразрывные и обычные пробелы, заменить запятую на точку, удалить символы валют и прочие нечисловые знаки. Для удаления всего, кроме цифр, точки и минуса, удобно перебрать строку посимвольно или использовать регулярные выражения через COM-объект VBScript.RegExp на сервере Windows.
- 1Удалите неразрывные пробелы: СтрЗаменить(Строка, Символ(160), "")
- 2Уберите обычные пробелы и символы валют
- 3Замените запятую на точку как разделитель дробной части
- 4Проверьте, что строка не пустая после очистки
- 5Выполните Число() внутри блока Попытка/Исключение
- 6Проверьте результат на допустимый диапазон (например, неотрицательность для количества)
Отдельная ситуация — отрицательные числа и числа в экспоненциальной записи. Минус в начале строки функция Число() обрабатывает корректно, а вот запись вида «1,5E+3» может не поддерживаться в зависимости от контекста, поэтому такие значения лучше нормализовать заранее.
Альтернативные способы: ОписаниеТипов и XMLЗначение
Метод ПривестиЗначение() объекта ОписаниеТипов ведёт себя мягче, чем Число(): при невозможности преобразования он возвращает значение по умолчанию (ноль) вместо исключения. Это удобно при массовой обработке, где падение недопустимо.
ОписаниеЧисла = Новый ОписаниеТипов("Число",
Новый КвалификаторыЧисла(15, 2));
Результат = ОписаниеЧисла.ПривестиЗначение("123,45");
У этого подхода есть нюанс: квалификаторы числа обрезают значение под заданную разрядность и точность, что иногда является плюсом (автоматическое округление до копеек), а иногда — источником скрытых потерь данных. Кроме того, поведение при разных разделителях дробной части зависит от региональных настроек сеанса.
Третий вариант — функции XMLЗначение(Тип("Число"), Строка) и обратная XMLСтрока(). Они работают с каноническим представлением чисел и применимы при разборе XML и JSON, где формат строго определён. Для «грязных» пользовательских данных этот способ менее удобен, так как тоже требует корректного формата.
Сравнение способов преобразования
Быстро и явно, но вызывает исключение на некорректных данных. Подходит для контролируемых источников с обработкой ошибок.
Не падает на ошибках, возвращает 0, приводит к заданной разрядности. Поведение зависит от региональных настроек.
Строгий канонический формат, удобно для XML/JSON. Не терпит произвольного пользовательского ввода.
Как проверить, что строка вообще содержит число
Прежде чем преобразовывать, полезно убедиться, что строка состоит только из допустимых символов. Простая проверка — перебор символов и сравнение с допустимым набором «0123456789.,-».
Функция ЭтоЧисло(Строка)
Допустимые = "0123456789.,-";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Если СтрНайти(Допустимые, Сред(Строка, Позиция, 1)) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Такая проверка не гарантирует корректность формата (строка «1.2.3» пройдёт фильтр, но не преобразуется), поэтому она дополняет, а не заменяет Попытка/Исключение. В типовых конфигурациях также встречаются готовые функции вида СтроковыеФункцииКлиентСервер.СтрокаВЧисло() в составе БСП — если конфигурация включает библиотеку, стоит использовать её, а не писать свою.
Как проверить результат
Число совпадает с исходным значением, дробная часть не потеряна
Результат 0 при непустой строке — вероятно, преобразование молча не сработало
Точка в строке, копейки на месте
Запятая — Число() упадёт или вернёт только целую часть
Строка очищена от пробелов и Символ(160)
Исключение на строках, скопированных из Excel или браузера
Типичные ошибки и их последствия
Самая распространённая ошибка — преобразование без обработки исключений в цикле загрузки. Одна строка с текстом вместо числа прерывает весь процесс, и пользователь получает незагруженный файл без понятного объяснения.
Вторая частая проблема — молчаливая подмена ошибки нулём. Если при неудачном преобразовании всегда возвращать 0 без журналирования, ошибки в исходных данных останутся незамеченными: сумма не сойдётся, а причину придётся искать вручную. Правильный подход — фиксировать проблемные строки в журнале регистрации или возвращать их пользователю списком.
Особые случаи: даты, булево и числа из форматированных строк
Иногда под видом числа в строке приходит другое значение. Например, строки «Да»/«Нет» или «Истина»/«Ложь» нужно преобразовывать не в число, а в булево — функция Число() здесь бесполезна, используйте явное сравнение или XMLЗначение с типом Булево.
Числа с форматированием вида «1 234 567,89 ₽» требуют полной очистки: убрать пробелы-разделители разрядов, символ валюты и только потом преобразовывать. Если формат известен заранее, иногда проще использовать функцию Формат() с обратной логикой — но штатной функции «разформатировать» нет, поэтому очистка остаётся основным инструментом.
FAQ
Почему Число("1 000") вызывает ошибку?
Строка содержит разделитель разрядов — обычный или неразрывный пробел. Удалите пробелы через СтрЗаменить(), включая Символ(160) для неразрывных, затем повторите преобразование.
Как преобразовать строку с запятой, например «123,45»?
Функция Число() требует точку как разделитель дробной части. Выполните СтрЗаменить(Строка, ",", ".") перед вызовом. Учтите, что запятая могла быть и разделителем разрядов в английской нотации — тогда её нужно удалять, а не заменять.
Что вернёт ОписаниеТипов.ПривестиЗначение() для нечисловой строки?
Метод не вызывает исключение и возвращает значение по умолчанию для типа Число — ноль. Поэтому факт ошибки нужно отслеживать отдельно, сравнивая исходную строку с ожидаемым форматом.
Как отличить пустую строку от строки с нулём?
Проверяйте строку до преобразования: если после очистки СтрДлина равна нулю, значение отсутствует, и подставлять 0 или Неопределено — решение вашей логики. Строка «0» при этом корректно преобразуется в число 0.
Есть ли готовая функция в типовых конфигурациях?
В конфигурациях на базе Библиотеки стандартных подсистем есть функции общего модуля СтроковыеФункцииКлиентСервер, включая преобразование строки в число. Если БСП подключена, используйте её вместо самостоятельной реализации.
Что важно запомнить
Число() — основной инструмент, но требует чистой строки и обработки исключений. Всегда очищайте ввод от пробелов и запятых, логируйте неудачные преобразования и выбирайте ПривестиЗначение() там, где падение недопустимо.