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