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

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

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

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

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

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

Ниже разобраны рабочие способы приведения строки к числу: штатная функция Число(), методы общего модуля СтроковыеФункцииКлиентСервер из БСП, использование ОписаниеТипов и безопасные обёртки с проверкой результата. Примеры приведены на встроенном языке 1С и подходят для управляемых и обычных форм.

Базовое преобразование функцией Число()

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

СтрокаЗначение = "123,45"; // так не сработает корректно

ЧислоЗначение = Число("123.45"); // 123.45 — корректно

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

Важная особенность: если строка содержит символы, которые нельзя интерпретировать как число (буквы, запятая как разделитель, лишние знаки), функция вызывает исключение «Преобразование значения к типу Число не может быть выполнено». В управляемом коде без обработки ошибок это приведёт к аварийному завершению выполнения.

Ещё один нюанс — ведущие и конечные пробелы функция обычно игнорирует, но неразрывные пробелы (код символа 160), которые часто встречаются в выгрузках из Excel и банковских систем как разделители тысяч, вызовут ошибку. Поэтому перед преобразованием строку из внешних источников стоит очищать.

Безопасное преобразование через СтроковыеФункцииКлиентСервер

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

Результат = СтроковыеФункцииКлиентСервер.СтрокаВЧисло("2500.75");

Если Результат = Неопределено Тогда

// строка не является числом — обрабатываем ситуацию

Иначе

// работаем с числом

КонецЕсли;

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

Если БСП в конфигурации нет, аналогичную обёртку несложно написать самостоятельно — об этом ниже.

Собственная функция с обработкой ошибок

Когда стандартные средства недоступны или нужна особая логика (например, значение по умолчанию вместо Неопределено), пишется собственная функция-обёртка. Типовой шаблон выглядит так:

Функция СтрокаВЧислоБезопасно(Строка, ЗначениеПоУмолчанию = 0) Экспорт

ОчищеннаяСтрока = СтрЗаменить(Строка, Символ(160), ""); // неразрывный пробел

ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, " ", "");

ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, ",", ".");

Попытка

Возврат Число(ОчищеннаяСтрока);

Исключение

Возврат ЗначениеПоУмолчанию;

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

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

Обратите внимание на порядок очистки: сначала удаляются пробелы (обычные и неразрывные), затем запятая заменяется на точку. Если поменять порядок или забыть про неразрывный пробел, строка вида «1 234,56» после замены запятой всё равно не преобразуется.

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

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

Преобразование через ОписаниеТипов

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

ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

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

РезультатОшибка = ОписаниеЧисла.ПривестиЗначение("текст"); // 0

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

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

Сравнение вариантов

Число()

Быстро и просто, но вызывает исключение на некорректных данных. Подходит только для гарантированно чистых строк.

СтроковыеФункцииКлиентСервер.СтрокаВЧисло()

Безопасно, возвращает Неопределено при ошибке. Требует наличия БСП в конфигурации.

Собственная обёртка с Попытка/Исключение

Полный контроль над очисткой строки и значением по умолчанию. Требует написания и поддержки своего кода.

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

Без исключений, автоматическое округление по квалификаторам. Не отличает ошибку от нулевого значения.

Проверка строки перед преобразованием

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

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

ОчищеннаяСтрока = СтрЗаменить(СокрЛП(Строка), ",", ".");

ДопустимыеСимволы = "0123456789.+-";

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Такая проверка отсеивает явно нечисловые строки, но не гарантирует корректность формата: строка «12.34.56» пройдёт проверку посимвольно, хотя числом не является. Поэтому финальное преобразование всё равно стоит выполнять внутри Попытка/Исключение или безопасной функцией.

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

Частые сценарии и их особенности

Загрузка из Excel и CSV

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

Данные из веб-сервисов и JSON

При чтении JSON средствами ЧтениеJSON числовые значения обычно уже приходят как числа, но если источник отдаёт их строками — действуйте по общей схеме. Особое внимание уделите экспоненциальной записи вида «1.5E+3»: функция Число() её обрабатывает, но собственные посимвольные проверки могут её отклонить.

Пользовательский ввод в формах

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

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

После преобразования убедитесь, что результат соответствует ожиданиям: тип значения — Число, значение попадает в допустимый диапазон бизнес-логики. Для проверки типа используйте ТипЗнч():

Если ТипЗнч(Результат) = Тип("Число") И Результат >= 0 Тогда

// значение корректно и неотрицательно

КонецЕсли;

При пакетной загрузке полезно вести счётчики успешных и неуспешных преобразований и логировать проблемные значения. Это позволит после загрузки быстро найти источник «грязных» данных, а не гадать, почему итоговые суммы не сходятся.

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

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

Тип результата
Норма

ТипЗнч() возвращает Число

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

Неопределено или Строка — преобразование не выполнено

Значение после загрузки
Норма

Число совпадает с исходным значением в источнике

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

Ноль там, где должно быть значение, — вероятно, сработала ветка ошибки

Дробная часть
Норма

Количество знаков после запятой соответствует исходным данным

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

Дробная часть потеряна — проверьте разделитель и квалификаторы типа

FAQ

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

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

Что возвращает Число() для пустой строки?

Для пустой строки функция возвращает 0 без исключения. Однако строка из одних неразрывных пробелов пустой не считается и вызовет ошибку — её нужно предварительно очистить.

Как отличить ошибку преобразования от реального нуля?

Используйте функцию, возвращающую Неопределено при неудаче: СтроковыеФункцииКлиентСервер.СтрокаВЧисло() или собственную обёртку. Тогда Неопределено означает ошибку, а 0 — корректное нулевое значение.

Обрабатывает ли Число() отрицательные значения и экспоненциальную запись?

Да, строки вида "-150.5" и "1.5E+3" преобразуются корректно. Учитывайте это при собственных посимвольных проверках — они могут ошибочно отклонить допустимые форматы.

Можно ли преобразовать строку в число в запросе?

В языке запросов прямого аналога Число() нет. Стандартный подход — выгрузить результат в таблицу значений и выполнить преобразование в коде, либо использовать выражение ВЫБОР с подстроками для простых случаев. На практике чаще всего преобразование делают после выполнения запроса.

Итог

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

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