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

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

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

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

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

В платформе 1С нет «умного» автоматического приведения типов, как в некоторых скриптовых языках. Разработчик сам отвечает за то, чтобы строка была корректно распознана как число. Для этого есть штатная функция Число(), механизм описания типов и ряд приёмов безопасного разбора, которые рассмотрены ниже.

Материал ориентирован на практику: вы узнаете, как работает базовое преобразование, как обработать разделители дробной части и пробелы, как проверить строку до преобразования и какие ошибки чаще всего допускают разработчики.

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

Основной инструмент преобразования — встроенная функция Число(). Она принимает строку, дату, булево или число и возвращает значение числового типа. Простейший пример:

Результат = Число("123,45"); // ошибка: запятая не распознаётся

Результат = Число("123.45"); // корректно: 123,45

Результат = Число("1000"); // корректно: 1000

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

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

bsl
Попытка
	Результат = Число(СтрокаЗначение);
Исключение
	Результат = 0;
	ЗаписьЖурналаРегистрации("Ошибка преобразования: " + СтрокаЗначение);
КонецПопытки;

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

Реальные данные редко приходят в «чистом» виде. Перед вызовом Число() строку стоит нормализовать: убрать лишние пробелы, заменить запятую на точку, удалить символы валют и разделители групп разрядов.

Типовой набор действий выглядит так:

Стр = СокрЛП(ИсходнаяСтрока);

Стр = СтрЗаменить(Стр, " ", ""); // разделители тысяч

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

Стр = СтрЗаменить(Стр, ",", "."); // запятая в точку

Стр = СтрЗаменить(Стр, "руб.", "");

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

Обратите внимание на неразрывный пробел (символ с кодом 160). Он часто встречается в данных, скопированных из Excel или выгруженных из веб-форм, и визуально неотличим от обычного пробела. Функция СокрЛП() его не удаляет в середине строки, поэтому нужна явная замена.

Безопасное преобразование через попытку-исключение

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

Удобно оформить это как отдельную функцию в общем модуле, чтобы не дублировать код по всей конфигурации:

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

Попытка

Возврат Число(СтрЗаменить(СокрЛП(Стр), ",", "."));

Исключение

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

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

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

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

Проверка строки без исключения

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

Пример проверки с помощью объекта ОписаниеТипов — платформа сама попытается привести значение и вернёт неопределено при неудаче:

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

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

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

// преобразование успешно

КонецЕсли;

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

Типичные ошибки
01
Передача строки с запятой в Число() без замены на точку — исключение прерывает обработку
02
Забытый неразрывный пробел из Excel — строка не распознаётся, хотя выглядит корректно
03
Молчаливая замена ошибки нулём — искажённые итоги в отчётах и проведённых документах
04
Преобразование пустой строки — Число("") вызывает исключение, а не возвращает 0
05
Использование Число() для строк с экспоненциальной записью из внешних систем без предварительной проверки

Число из строки в запросах и СКД

В языке запросов 1С тоже есть приведение типов через конструкцию ВЫРАЗИТЬ(... КАК ЧИСЛО(15,2)). Однако она работает иначе, чем функция встроенного языка: запрос не выполняет разбор произвольной строки, а лишь приводит значение, уже совместимое с числовым типом. Строку «123,45» запрос в число не превратит корректно.

Поэтому если числа хранятся в строковых реквизитах (что само по себе признак проблемы проектирования), преобразование выполняйте на этапе выгрузки результата запроса в таблицу значений или при записи данных, а не в тексте запроса. В СКД для вычисляемых полей доступны функции встроенного языка, включая обработку в событии «ПриКомпоновкеРезультата».

Особые случаи: булево, дата, экспоненциальная запись

Функция Число() умеет приводить и другие типы: Число(Истина) вернёт 1, Число(Ложь) — 0. Дата при преобразовании даст число секунд, но такой приём почти не используется на практике и ухудшает читаемость кода.

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

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

Как выбрать действие

Строка гарантированно содержит корректное число с точкойИспользуйте Число() напрямую
Данные приходят из Excel, CSV или ввода пользователяНормализуйте строку: уберите пробелы, замените запятую на точку
Качество данных непредсказуемоОберните преобразование в Попытка...Исключение с логированием
Нужно преобразование внутри запросаИспользуйте ВЫРАЗИТЬ(... КАК ЧИСЛО), но только для совместимых значений

Проверка результата и контроль качества

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

Если значение записывается в реквизит с типом Число(10,2), а исходная строка содержала три знака после запятой, лишний разряд будет отброшен без предупреждения. Для денежных сумм это критично: проверяйте точность до записи объекта.

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

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

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

ТипЗнч(Результат) = Тип("Число")

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

Значение осталось строкой или стало Неопределено

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

Копейки/разряды совпадают с исходной строкой

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

Потеряны знаки после запятой или значение обнулено

Журнал регистрации
Норма

Нет записей об ошибках преобразования

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

Массовые ошибки при загрузке — проблема формата источника

Итог

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

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

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

Почему Число("123,45") выдаёт ошибку?

Функция ожидает точку в качестве разделителя дробной части независимо от региональных настроек. Замените запятую на точку через СтрЗаменить() перед вызовом.

Что вернёт Число() для пустой строки?

Будет вызвано исключение «Преобразование значения к типу Число не может быть выполнено». Проверяйте строку на пустоту через ПустаяСтрока() до преобразования.

Как преобразовать строку с пробелами-разделителями тысяч, например «1 234 567»?

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

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

Конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО) приводит только значения, уже совместимые с числовым типом, и не разбирает произвольные строки с запятыми или буквами. Разбор выполняйте на встроенном языке до или после запроса.

Как безопасно преобразовать строку, не прерывая выполнение кода?

Оберните вызов Число() в конструкцию Попытка...Исключение и верните значение по умолчанию, зафиксировав ошибку в журнале регистрации. Удобно оформить это отдельной функцией в общем модуле.

Что делать, если после преобразования теряются знаки после запятой?

Проверьте квалификатор числа у реквизита, в который записывается значение: например, Число(10,2) отбросит третий знак без предупреждения. Увеличьте точность в метаданных или округляйте явно через Окр().