Разработка и Конфигурация · 9 мин
1С 8: как преобразовать значение в число
Как в 1С 8 преобразовать строку в число: функция Число(), ОписаниеТипов, обработка ошибок, разделители и типичные ошибки разработчика.
Во встроенном языке 1С:Предприятие 8 преобразование значения в число — одна из самых частых операций: данные приходят из файлов, форм, веб-сервисов и обменов в виде строк, а для расчётов, сравнений и записи в числовые реквизиты нужен именно числовой тип. Платформа предлагает несколько способов такого преобразования, и у каждого есть свои ограничения.
Основной инструмент — функция Число(), которая пытается интерпретировать переданное значение как число. Если строка не может быть преобразована, возникает ошибка выполнения, поэтому в реальном коде преобразование почти всегда оборачивают в проверки или конструкцию Попытка...Исключение. Ниже разобраны рабочие приёмы, типичные ловушки с разделителями и способы безопасной обработки нечисловых данных.
Функция Число(): базовый синтаксис и поведение
Функция Число() принимает один параметр — значение произвольного типа — и возвращает его числовое представление. Строка «123,45» преобразуется в число 123,45, дата — в число секунд (на практике это редко нужно), булево Истина — в 1, Ложь — в 0. Если значение преобразовать нельзя, например строка «абв», выполнение прерывается с ошибкой «Преобразование значения к типу Число не может быть выполнено».
ЧислоИзСтроки = Число("1250,75");
ЧислоИзБулева = Число(Истина); // результат 1
Важная особенность: функция чувствительна к разделителю дробной части. В строковом представлении числа внутри кода используется запятая, однако строки, полученные из внешних источников, часто содержат точку. Строка «123.45» в ряде случаев вызовет ошибку или будет интерпретирована не так, как ожидает разработчик, поэтому перед преобразованием разделитель принято нормализовать через СтрЗаменить().
СтрокаИзФайла = "123.45";
Нормализованная = СтрЗаменить(СтрокаИзФайла, ".", ",");
Значение = Число(Нормализованная);Безопасное преобразование через Попытка...Исключение
Поскольку ошибка преобразования прерывает выполнение кода, в прикладных решениях функцию Число() почти всегда вызывают внутри блока Попытка...Исключение. Это стандартный приём при разборе файлов загрузки, ответов веб-сервисов и пользовательского ввода, где формат данных не гарантирован.
Типовой шаблон безопасной функции выглядит так: очищаем строку от пробелов и неразрывных пробелов, заменяем точку на запятую, пытаемся выполнить преобразование, а при неудаче возвращаем 0 или Неопределено — в зависимости от логики прикладной задачи. Возврат Неопределено удобен, когда нужно отличить «некорректное значение» от «нулевого значения».
- 1Удалите пробелы и неразрывные пробелы (Символ(160)) из исходной строки
- 2Замените точку на запятую как разделитель дробной части
- 3Проверьте, что строка не пустая
- 4Выполните Число() внутри блока Попытка...Исключение
- 5При исключении верните значение по умолчанию и при необходимости запишите событие в журнал регистрации
Функция СтрокаВЧисло(Строка)
Результат = 0;
Очищенная = СтрЗаменить(Строка, Символ(160), "");
Очищенная = СтрЗаменить(Очищенная, " ", "");
Очищенная = СтрЗаменить(Очищенная, ".", ",");
Если Не ПустаяСтрока(Очищенная) Тогда
Попытка
Результат = Число(Очищенная);
Исключение
Результат = 0;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
Преобразование через ОписаниеТипов и реквизиты объектов
Второй способ — использование объекта ОписаниеТипов и его метода ПривестиЗначение(). Этот подход удобен, когда нужно привести значение к конкретной числовой квалификации: ограничить длину и точность так же, как это делает реквизит конфигурации. Некорректное значение метод приводит к нулю без генерации ошибки, что упрощает массовую обработку.
Описание = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
Значение = Описание.ПривестиЗначение("1234,567"); // 1234,57
Третий, неявный способ — присваивание строкового значения числовому реквизиту объекта. Платформа автоматически выполняет преобразование по описанию типов реквизита, и при невозможности преобразования реквизит получает значение 0. Это удобно в простых загрузках, но лишает контроля над ошибочными данными: отличить «в файле был ноль» от «в файле был мусор» уже нельзя.
Сравнение способов преобразования
Быстрый явный способ; требует обработки исключений и нормализации разделителя
Не вызывает ошибку, применяет квалификаторы длины и точности; некорректное значение превращается в 0
Самый простой код; нет контроля над ошибочными данными, ошибки загрузки маскируются
Особенности строк из внешних источников
Данные из Excel, CSV, XML и веб-сервисов редко приходят в «чистом» виде. Наиболее частые помехи: неразрывный пробел (код 160) как разделитель разрядов, символ валюты в конце строки, точка вместо запятой, минус в виде тире, а также числа в экспоненциальной записи из научных расчётов. Каждый из этих случаев приводит к ошибке или неверному результату, если строку не подготовить.
Практическое правило: перед преобразованием удаляйте все символы, кроме цифр, запятой, точки и знака минус, либо выполняйте целевые замены под известный формат источника. Для разделителей разрядов достаточно удалить пробелы обоих видов. Символ валюты и единицы измерения отсекают через СтрЗаменить() или регулярные выражения (в толстом клиенте и на сервере доступны через COM-объект VBScript.RegExp на Windows).
Числа в запросах и СКД
В языке запросов 1С преобразование выполняют операторы ВЫРАЗИТЬ(... КАК ЧИСЛО(длина, точность)) и функция ЕСТЬNULL() для замены NULL на ноль. ВЫРАЗИТЬ работает только с типами, допускающими приведение: строку произвольного содержимого в запросе в число не превратить — для этого данные предварительно обрабатывают во временной таблице на встроенном языке.
При работе с СКД и вычисляемыми полях помните, что сравнение строки с числом в отборе может неявно приводить типы и давать неочевидный результат. Надёжнее приводить типы явно на уровне запроса набора данных, а не полагаться на автоматику платформы.
Проверка результата и контроль качества загрузки
После массового преобразования полезно убедиться, что данные не искажены. Минимальный набор проверок: количество обработанных строк совпадает с количеством строк источника, суммы контрольных колонок сходятся с исходным файлом, доля записей с нулевым результатом не превышает ожидаемую. Резкий рост нулей — почти всегда признак того, что часть строк не преобразовалась и была заменена нулём.
Для ответственных загрузок (цены, остатки, обороты) ведите протокол: фиксируйте номер строки файла и исходное значение, которое не удалось преобразовать. Это позволяет быстро найти проблемный участок и не гадать, откуда взялась разница в итогах.
Как проверить результат
Совпадает с числом строк в файле
Часть строк пропущена или дублирована
Совпадает с суммой в источнике
Расхождение — искать строки с ошибкой преобразования
Соответствует ожиданиям по данным
Резкий рост нулей — признак массовой ошибки разбора
Частые вопросы
Что вернёт Число("") — пустую строку?
Вызов Число("") завершится ошибкой «Преобразование значения к типу Число не может быть выполнено». Пустую строку нужно проверять заранее через ПустаяСтрока() и подставлять значение по умолчанию, либо обрабатывать исключение.
Как преобразовать строку с точкой, например «99.99»?
Перед вызовом Число() замените точку на запятую: Число(СтрЗаменить(Строка, ".", ",")). Если в строке возможны и точки, и запятые одновременно (разделитель разрядов), сначала определите формат источника и удалите лишние символы.
Можно ли проверить, является ли строка числом, без ошибки?
Встроенной функции «ЭтоЧисло» в языке нет. Стандартный приём — Попытка с Число() внутри, либо посимвольная проверка строки, либо ОписаниеТипов.ПривестиЗначение() с последующим сравнением поведения на граничных значениях.
Чем отличается Число() от ПривестиЗначение()?
Число() при некорректном значении генерирует ошибку выполнения, а ОписаниеТипов.ПривестиЗначение() молча возвращает 0 и дополнительно применяет квалификаторы длины и точности. Для разбора данных с диагностикой удобнее Число() в Попытке, для массового приведения без диагностики — ПривестиЗначение().
Как преобразовать число обратно в строку без разделителей разрядов?
Используйте Формат(Значение, "ЧГ=0") — параметр ЧГ=0 отключает группировку разрядов. Также полезны параметры ЧЦ (общее число знаков) и ЧДЦ (число знаков дробной части) для фиксированного формата выгрузки.
Почему после присваивания строки числовому реквизиту там оказался ноль?
Платформа попыталась преобразовать строку по типу реквизита и при неудаче подставила значение по умолчанию — 0. Проверьте исходную строку на разделитель дробной части, пробелы и посторонние символы.
Что важно запомнить
Основной инструмент — функция Число(), всегда с нормализацией разделителя и обработкой исключений. Для массового приведения без ошибок подходит ОписаниеТипов.ПривестиЗначение(), а качество загрузки контролируйте по контрольным суммам и доле нулевых значений.