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

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

Как из строки сделать число в 1С

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

Задача преобразования строки в число возникает в 1С постоянно: при загрузке данных из файлов Excel и CSV, при обмене с веб-сервисами, при разборе штрихкодов и при обработке пользовательского ввода. Встроенный язык платформы предоставляет несколько инструментов для этого, и выбор зависит от того, насколько «чистые» данные вы получаете и что должно произойти при ошибке.

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

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

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

КодВСтроке = "1234,56";

Результат = Число(КодВСтроке); // ошибка: запятая недопустима

СтрокаЦена = "1234.56";

Результат = Число(СтрокаЦена); // 1234.56 — успешно

Обратите внимание: разделителем дробной части должна быть именно точка, независимо от региональных настроек сеанса. Запятая, пробелы-разделители разрядов, символы валюты приводят к исключению «Преобразование значения к типу Число не может быть выполнено».

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

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

СтрокаИзФайла = "1 234,56";

Чистая = СтрокаИзФайла;

Чистая = СтрЗаменить(Чистая, " ", ""); // обычные пробелы

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

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

Результат = Число(Чистая); // 1234.56

Неразрывный пробел (код 160) — частый источник проблем при загрузке из Excel и веб-страниц. Визуально он неотличим от обычного пробела, поэтому строка выглядит корректной, а преобразование падает. Удаляйте его явно через Символ(160).

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

Обработка ошибок через Попытка/Исключение

Если строка может оказаться некорректной (пустая, текстовая, с мусором), вызов Число() нужно защитить. Самый простой способ — конструкция Попытка...Исключение с возвратом значения по умолчанию.

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

Попытка

Возврат Число(Строка);

Исключение

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

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

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

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

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

Конструкция Попытка/Исключение — дорогая операция, и в циклах на больших объёмах она замедляет обработку. Альтернатива — предварительная проверка, состоит ли строка только из допустимых символов, или использование приведения типов через ОписаниеТипов.

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

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

// при неудаче вернёт 0 без исключения

Метод ПривестиЗначение() не генерирует исключение: при невозможности преобразования возвращает значение по умолчанию для типа (для числа — 0). Это удобно для массовой обработки, но помните: отличить «не удалось распознать» от «в строке действительно был ноль» таким способом нельзя без дополнительной проверки.

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

Число() + Попытка/Исключение

Подходит для разовых преобразований и когда важно знать об ошибке. Медленнее в больших циклах.

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

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

Ручной разбор строки

Полный контроль над форматом и локализацией. Больше кода, нужно тестировать.

Особые случаи: булево, даты, строки с форматированием

Число из строки с единицами измерения

Строки вида «150 кг» или «1 200 руб.» требуют отсечения нечисловой части. Практичный приём — оставить в строке только цифры, точку, запятую и минус, пройдя по символам, либо найти первый пробел и взять левую часть через Лев() и СтрНайти().

Отрицательные числа и скобки

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

Число из числа — лишняя операция

Если значение уже имеет тип «Число», вызывать Число() повторно не нужно. Проверить тип можно через ТипЗнч(Значение) = Тип("Число"). Это полезно в универсальных обработках, где тип входящего параметра заранее неизвестен.

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

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

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

Отдельно проверяйте потерю точности. Если в строке «0,1 + 0,2», то после преобразования вы получите двоичное приближение десятичного числа — при сравнениях используйте округление или сравнение с допуском, а не строгое равенство.

Итог

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

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

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

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

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

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

Удалите все пробелы: обычные через СтрЗаменить(Строка, " ", "") и неразрывные через СтрЗаменить(Строка, Символ(160), ""), затем вызовите Число().

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

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

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

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

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

Число() вызовет исключение. Если нужно извлечь цифры из смешанной строки, пройдите по символам и оставьте только цифры и допустимые знаки, затем преобразуйте результат.

Теряется ли точность при преобразовании длинных дробных чисел?

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