Разработка и Конфигурация · 9 мин
Как в 1С преобразовать значение к числу
Как в 1С преобразовать строку в число: функция Число(), обработка ошибок, разделители, проверка результата, типовые ошибки и примеры кода для разработчика.
Преобразование строки в число — одна из самых частых задач при разработке на встроенном языке 1С. Она возникает при загрузке данных из файлов, обмене с внешними системами, разборе пользовательского ввода и обработке значений, полученных из XML или JSON. Ошибка в таком преобразовании приводит либо к падению кода с исключением, либо к тихой порче данных, когда вместо числа записывается ноль или пустое значение.
В платформе 1С нет «умного» автоматического приведения типов, как в некоторых скриптовых языках. Разработчик сам отвечает за то, чтобы строка была корректно распознана как число. Для этого есть штатная функция Число(), механизм описания типов и ряд приёмов безопасного разбора, которые рассмотрены ниже.
Материал ориентирован на практику: вы узнаете, как работает базовое преобразование, как обработать разделители дробной части и пробелы, как проверить строку до преобразования и какие ошибки чаще всего допускают разработчики.
Базовое преобразование: функция Число()
Основной инструмент преобразования — встроенная функция Число(). Она принимает строку, дату, булево или число и возвращает значение числового типа. Простейший пример:
Результат = Число("123,45"); // ошибка: запятая не распознаётся
Результат = Число("123.45"); // корректно: 123,45
Результат = Число("1000"); // корректно: 1000
Ключевая особенность: функция ожидает точку в качестве разделителя дробной части, независимо от региональных настроек сеанса. Строка с запятой вызовет исключение «Преобразование значения к типу Число не может быть выполнено». Это самая частая причина ошибок при загрузке данных из Excel и CSV, где числа часто записаны с запятой.
Если входная строка содержит недопустимые символы — буквы, знаки валют, неразрывные пробелы — преобразование также завершится исключением. Поэтому в прикладном коде вызов Число() почти всегда требует предварительной подготовки строки или обработки ошибок.
Попытка
Результат = Число(СтрокаЗначение);
Исключение
Результат = 0;
ЗаписьЖурналаРегистрации("Ошибка преобразования: " + СтрокаЗначение);
КонецПопытки;Подготовка строки перед преобразованием
Реальные данные редко приходят в «чистом» виде. Перед вызовом Число() строку стоит нормализовать: убрать лишние пробелы, заменить запятую на точку, удалить символы валют и разделители групп разрядов.
Типовой набор действий выглядит так:
Стр = СокрЛП(ИсходнаяСтрока);
Стр = СтрЗаменить(Стр, " ", ""); // разделители тысяч
Стр = СтрЗаменить(Стр, Символ(160), ""); // неразрывный пробел
Стр = СтрЗаменить(Стр, ",", "."); // запятая в точку
Стр = СтрЗаменить(Стр, "руб.", "");
Результат = Число(Стр);
Обратите внимание на неразрывный пробел (символ с кодом 160). Он часто встречается в данных, скопированных из Excel или выгруженных из веб-форм, и визуально неотличим от обычного пробела. Функция СокрЛП() его не удаляет в середине строки, поэтому нужна явная замена.
Безопасное преобразование через попытку-исключение
Когда качество входных данных не гарантировано, правильнее не проверять строку вручную, а перехватывать исключение. Конструкция Попытка...Исключение позволяет задать значение по умолчанию и зафиксировать проблему в журнале регистрации.
Удобно оформить это как отдельную функцию в общем модуле, чтобы не дублировать код по всей конфигурации:
Функция СтрокаВЧисло(Стр, ЗначениеПоУмолчанию = 0) Экспорт
Попытка
Возврат Число(СтрЗаменить(СокрЛП(Стр), ",", "."));
Исключение
Возврат ЗначениеПоУмолчанию;
КонецПопытки;
КонецФункции
Такой подход особенно полезен при пакетной загрузке: одна «битая» строка файла не должна прерывать обработку тысяч корректных записей. При этом ошибки не следует глотать молча — минимум логируйте их, иначе потери данных останутся незамеченными.
Проверка строки без исключения
В некоторых сценариях исключения нежелательны — например, в циклах с большим числом итераций, где частые исключения замедляют выполнение. Тогда строку проверяют регулярным выражением или посимвольным анализом до преобразования.
Пример проверки с помощью объекта ОписаниеТипов — платформа сама попытается привести значение и вернёт неопределено при неудаче:
ОписаниеЧисла = Новый ОписаниеТипов("Число");
Результат = ОписаниеЧисла.ПривестиЗначение(СтрокаЗначение);
Если ТипЗнч(Результат) = Тип("Число") Тогда
// преобразование успешно
КонецЕсли;
Учтите, что ПривестиЗначение() при неудаче возвращает значение по умолчанию для типа (для числа — 0), а не сигнализирует об ошибке, поэтому дополнительно сравнивайте исходную строку с ожидаемым форматом, если ноль для вас — осмысленное значение.
Число из строки в запросах и СКД
В языке запросов 1С тоже есть приведение типов через конструкцию ВЫРАЗИТЬ(... КАК ЧИСЛО(15,2)). Однако она работает иначе, чем функция встроенного языка: запрос не выполняет разбор произвольной строки, а лишь приводит значение, уже совместимое с числовым типом. Строку «123,45» запрос в число не превратит корректно.
Поэтому если числа хранятся в строковых реквизитах (что само по себе признак проблемы проектирования), преобразование выполняйте на этапе выгрузки результата запроса в таблицу значений или при записи данных, а не в тексте запроса. В СКД для вычисляемых полей доступны функции встроенного языка, включая обработку в событии «ПриКомпоновкеРезультата».
Особые случаи: булево, дата, экспоненциальная запись
Функция Число() умеет приводить и другие типы: Число(Истина) вернёт 1, Число(Ложь) — 0. Дата при преобразовании даст число секунд, но такой приём почти не используется на практике и ухудшает читаемость кода.
Числа в экспоненциальной записи («1.5E+3») из внешних источников могут распознаваться по-разному в зависимости от контекста. Надёжнее разобрать такое значение вручную: отделить мантиссу и порядок, затем вычислить результат через Pow(). То же относится к шестнадцатеричным и двоичным строкам — штатной функции для них нет, нужен собственный разбор.
Как выбрать действие
Проверка результата и контроль качества
После преобразования убедитесь, что результат соответствует ожиданиям. Минимальный набор проверок: тип значения, попадание в допустимый диапазон и отсутствие потери точности при округлении до квалификатора числа, заданного в метаданных.
Если значение записывается в реквизит с типом Число(10,2), а исходная строка содержала три знака после запятой, лишний разряд будет отброшен без предупреждения. Для денежных сумм это критично: проверяйте точность до записи объекта.
Как проверить результат
ТипЗнч(Результат) = Тип("Число")
Значение осталось строкой или стало Неопределено
Копейки/разряды совпадают с исходной строкой
Потеряны знаки после запятой или значение обнулено
Нет записей об ошибках преобразования
Массовые ошибки при загрузке — проблема формата источника
Что важно запомнить
Основной инструмент — функция Число(), ожидающая точку как разделитель дробной части. Перед преобразованием нормализуйте строку, при непредсказуемых данных используйте попытку-исключение с логированием и никогда не маскируйте ошибки нулём без контроля.
Частые вопросы
Почему Число("123,45") выдаёт ошибку?
Функция ожидает точку в качестве разделителя дробной части независимо от региональных настроек. Замените запятую на точку через СтрЗаменить() перед вызовом.
Что вернёт Число() для пустой строки?
Будет вызвано исключение «Преобразование значения к типу Число не может быть выполнено». Проверяйте строку на пустоту через ПустаяСтрока() до преобразования.
Как преобразовать строку с пробелами-разделителями тысяч, например «1 234 567»?
Удалите все пробелы, включая неразрывный (Символ(160)), через СтрЗаменить(), затем вызовите Число(). СокрЛП() удаляет пробелы только по краям строки.
Можно ли преобразовать строку в число в запросе?
Конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО) приводит только значения, уже совместимые с числовым типом, и не разбирает произвольные строки с запятыми или буквами. Разбор выполняйте на встроенном языке до или после запроса.
Как безопасно преобразовать строку, не прерывая выполнение кода?
Оберните вызов Число() в конструкцию Попытка...Исключение и верните значение по умолчанию, зафиксировав ошибку в журнале регистрации. Удобно оформить это отдельной функцией в общем модуле.
Что делать, если после преобразования теряются знаки после запятой?
Проверьте квалификатор числа у реквизита, в который записывается значение: например, Число(10,2) отбросит третий знак без предупреждения. Увеличьте точность в метаданных или округляйте явно через Окр().