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

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

Как в 1С перевести строку в число

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

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

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

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

Базовый способ: функция Число()

Функция Число() — штатное средство встроенного языка 1С. Она принимает строку и возвращает значение типа Число. Синтаксис предельно прост:

Результат = Число("123,45"); // 123,45

Количество = Число("100"); // 100

Функция понимает целые и дробные значения. Разделитель дробной части зависит от региональных настроек сеанса: в русской локали это обычно запятая, но строка с точкой тоже может быть распознана в зависимости от настроек информационной базы. Это важный нюанс при обмене данными между системами с разными локалями.

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

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

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

Функция СтрокаВЧисло(Строка)

Попытка

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

Исключение

Возврат 0;

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

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

Обратите внимание на СокрЛП() — он убирает пробелы по краям строки. Без этой обработки строка вида « 100 » тоже может вызвать ошибку или дать неожиданный результат в зависимости от версии платформы.

Такой подход подходит для обработок загрузки, где ошибочное значение допустимо заменить нулём. Если же неверное значение должно блокировать операцию — например, при загрузке цен или курсов валют — в ветке Исключение нужно записывать ошибку в журнал и прерывать обработку документа, а не подставлять ноль молча.

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

Предварительная проверка строки

Иногда нужно не просто поймать исключение, а заранее определить, является ли строка числом, — например, чтобы подсветить пользователю ошибку ввода до сохранения. Универсальной штатной функции «ЭтоЧисло» во встроенном языке нет, поэтому проверку пишут вручную.

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

Функция ЭтоЧисло(Строка)

Строка = СокрЛП(Строка);

Если ПустаяСтрока(Строка) Тогда

Возврат Ложь;

КонецЕсли;

Допустимые = "0123456789,.-";

Для Позиция = 1 По СтрДлина(Строка) Цикл

Если СтрНайти(Допустимые, Сред(Строка, Позиция, 1)) = 0 Тогда

Возврат Ложь;

КонецЕсли;

КонецЦикла;

Возврат Истина;

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

Такая проверка отсекает явно нечисловые строки, но не гарантирует корректность формата: «1,2,3» пройдёт фильтр символов, хотя числом не является. Для строгой проверки комбинируйте посимвольный анализ с попыткой преобразования либо используйте ОписаниеТипов, описанное ниже.

Преобразование через ОписаниеТипов

Объект ОписаниеТипов позволяет привести значение к типу Число с заданной разрядностью и точностью. Метод ПривестиЗначение() работает мягче, чем Число(): для строки, которую нельзя преобразовать, он возвращает значение по умолчанию (обычно 0), а не вызывает исключение.

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

Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой));

Результат = ОписаниеЧисла.ПривестиЗначение("123,45");

Дополнительное преимущество — автоматическое округление до указанной точности. Если задано два знака после запятой, а в строке три, результат будет корректно округлён. Это удобно при загрузке сумм и цен, где лишние знаки недопустимы.

Ограничение способа: поведение при нечисловой строке зависит от контекста, поэтому для критичных данных всё равно стоит комбинировать приведение с явной проверкой результата — например, сравнивать исходную строку с обратным преобразованием.

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

Число(Строка)

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

Попытка + Число()

Универсальный безопасный вариант для внешних данных; требует решить, что возвращать при ошибке.

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

Не падает на ошибках и округляет до нужной точности; удобно для сумм и количеств.

Посимвольная проверка + Число()

Максимальный контроль формата, подходит для валидации пользовательского ввода до сохранения.

Типичные проблемы: пробелы, локаль и форматы

Самая частая причина «нерабочего» преобразования — неразрывный пробел (код 160). Числа, скопированные из Excel, Word или веб-страниц, часто содержат разделители разрядов в виде именно этого символа: «1 234 567». Визуально это обычный пробел, но СокрЛП() его внутри строки не удаляет.

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

Строка = СтрЗаменить(Строка, " ", "");

Вторая типичная ситуация — смешение разделителей. Файл может прийти с точкой, а база работает в русской локали с запятой. Решение — явно привести разделитель перед преобразованием: СтрЗаменить(Строка, ".", ",") или наоборот, в зависимости от настроек сеанса.

Третья группа проблем — экспоненциальная запись («1,5E+06») и специальные значения из внешних систем (NULL, N/A, пустые кавычки). Такие значения нужно отлавливать отдельными условиями до вызова Число(), иначе получите исключение или неверный ноль.

Типичные ошибки
01
Вызов Число() без Попытка на данных из файла — обмен падает на первой «грязной» строке
02
Игнорирование неразрывного пробела (Символ(160)) — числа с разрядностью не преобразуются
03
Подстановка 0 при ошибке без записи в журнал — ошибки загрузки теряются, суммы расходятся
04
Смешение точки и запятой как разделителя — результат зависит от локали и отличается в разных базах
05
Преобразование пустой строки без проверки ПустаяСтрока() — лишние исключения в цикле

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

После преобразования убедитесь, что результат соответствует ожиданиям. Минимальный набор проверок: тип значения, диапазон и обратное преобразование в строку. Функция ТипЗнч() покажет, действительно ли получилось число.

Если ТипЗнч(Результат) = Тип("Число") Тогда

// значение готово к расчётам

КонецЕсли;

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

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

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

Тип значения после преобразования
Норма

ТипЗнч() возвращает Число

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

Осталась строка или Неопределено

Дробная часть
Норма

Количество знаков соответствует ожидаемому

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

Число обрезано или разделитель съеден

Итоговые суммы загрузки
Норма

Сходятся с контрольной суммой источника

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

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

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

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

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

Как преобразовать строку с пробелами-разделителями разрядов?

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

Почему одна и та же строка преобразуется по-разному в разных базах?

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

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

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

Как отличить «ноль из строки» от ошибки преобразования?

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

Итог

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

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