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

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

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

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

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

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

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

Функция Число() принимает один параметр — значение произвольного типа — и возвращает его числовое представление. Строка «123,45» преобразуется в число 123,45, дата — в число секунд (на практике это редко нужно), булево Истина — в 1, Ложь — в 0. Если значение преобразовать нельзя, например строка «абв», выполнение прерывается с ошибкой «Преобразование значения к типу Число не может быть выполнено».

ЧислоИзСтроки = Число("1250,75");

ЧислоИзБулева = Число(Истина); // результат 1

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

bsl
СтрокаИзФайла = "123.45";
Нормализованная = СтрЗаменить(СтрокаИзФайла, ".", ",");
Значение = Число(Нормализованная);

Безопасное преобразование через Попытка...Исключение

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

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

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

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

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

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

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

Если Не ПустаяСтрока(Очищенная) Тогда

Попытка

Результат = Число(Очищенная);

Исключение

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

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

КонецЕсли;

Возврат Результат;

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

Преобразование через ОписаниеТипов и реквизиты объектов

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

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

Значение = Описание.ПривестиЗначение("1234,567"); // 1234,57

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

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

Число()

Быстрый явный способ; требует обработки исключений и нормализации разделителя

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

Не вызывает ошибку, применяет квалификаторы длины и точности; некорректное значение превращается в 0

Присваивание реквизиту

Самый простой код; нет контроля над ошибочными данными, ошибки загрузки маскируются

Особенности строк из внешних источников

Данные из Excel, CSV, XML и веб-сервисов редко приходят в «чистом» виде. Наиболее частые помехи: неразрывный пробел (код 160) как разделитель разрядов, символ валюты в конце строки, точка вместо запятой, минус в виде тире, а также числа в экспоненциальной записи из научных расчётов. Каждый из этих случаев приводит к ошибке или неверному результату, если строку не подготовить.

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

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

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

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

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

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

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

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

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

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

Количество загруженных строк
Норма

Совпадает с числом строк в файле

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

Часть строк пропущена или дублирована

Контрольная сумма по числовой колонке
Норма

Совпадает с суммой в источнике

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

Расхождение — искать строки с ошибкой преобразования

Доля нулевых значений
Норма

Соответствует ожиданиям по данным

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

Резкий рост нулей — признак массовой ошибки разбора

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

Что вернёт Число("") — пустую строку?

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

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

Перед вызовом Число() замените точку на запятую: Число(СтрЗаменить(Строка, ".", ",")). Если в строке возможны и точки, и запятые одновременно (разделитель разрядов), сначала определите формат источника и удалите лишние символы.

Можно ли проверить, является ли строка числом, без ошибки?

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

Чем отличается Число() от ПривестиЗначение()?

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

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

Используйте Формат(Значение, "ЧГ=0") — параметр ЧГ=0 отключает группировку разрядов. Также полезны параметры ЧЦ (общее число знаков) и ЧДЦ (число знаков дробной части) для фиксированного формата выгрузки.

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

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

Итог

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

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