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

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

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

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

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

Во встроенном языке 1С есть штатная функция Число(), которая выполняет такое преобразование. Однако она строга к формату: лишний пробел, неразрывный пробел из Excel, запятая вместо точки или буква «О» вместо нуля приводят к ошибке выполнения. Поэтому в рабочих механизмах простого вызова Число(Строка) обычно недостаточно — нужна предварительная очистка строки и защита от нештатных ситуаций.

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

Функция Число() — базовый способ преобразования

Функция Число() принимает строку и возвращает значение типа «Число». Синтаксис предельно прост: Результат = Число("123,45"). Важная особенность: в качестве разделителя дробной части функция ожидает символ, соответствующий региональным настройкам сеанса — чаще всего это запятая, но в ряде случаев точка. Поведение зависит от настроек информационной базы и операционной системы.

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

Число1 = Число("100");       // 100

Число2 = Число("123,45"); // 123.45 (при запятой как разделителе)

Число3 = Число(" 50 "); // пробелы по краям допустимы

Число4 = Число("12а3"); // ошибка выполнения

Обратите внимание: пробелы по краям строки функция обычно игнорирует, но пробелы внутри числа (например, разделители разрядов «1 000 000») вызывают ошибку. Это самая частая причина сбоев при загрузке сумм из внешних файлов.

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

В прикладном коде, где входные данные не контролируются (файлы контрагентов, выгрузки из сторонних программ), преобразование всегда стоит оборачивать в конструкцию Попытка...Исключение...КонецПопытки. Это позволяет не прерывать обработку всего пакета данных из-за одной некорректной строки.

Типовой шаблон безопасной функции выглядит так:

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

Результат = 0;

Попытка

Результат = Число(Строка);

Исключение

Результат = 0;

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

Возврат Результат;

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

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

Порядок действий для безопасного преобразования
  1. 1
    Очистите строку от неразрывных пробелов и разделителей разрядов
  2. 2
    Приведите разделитель дробной части к ожидаемому символу
  3. 3
    Выполните Число() внутри Попытка...Исключение
  4. 4
    Проверьте результат и обработайте случай неудачи отдельно

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

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

Универсальная очистка выполняется через СтрЗаменить():

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

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

Строка = СтрЗаменить(Строка, Символы.Таб, ""); // табуляции

Строка = СтрЗаменить(Строка, ",", "."); // при необходимости точка

Результат = Число(Строка);

Порядок замен имеет значение. Сначала удаляйте все виды пробелов, потом приводите разделитель дробной части. Если в исходных данных встречаются и точка, и запятая (например, формат «1,234.56» — тысячи через запятую), логика усложняется: нужно сначала определить, какой символ является десятичным разделителем, и только потом чистить строку.

Числа с валютой и единицами измерения

Строки вида «1 500 руб.» или «25 кг» требуют удаления буквенной части. Простой способ — регулярный перебор символов с проверкой, является ли символ цифрой, знаком минус или разделителем. В типовых конфигурациях для этого нередко есть готовые функции в общих модулях работы со строками — перед написанием своей проверьте наличие таковых в вашей конфигурации.

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

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

Альтернативный способ — использование объекта ОписаниеТипов и его метода ПривестиЗначение(). Этот подход мягче: вместо генерации ошибки он при неудаче возвращает значение по умолчанию для числового типа, то есть ноль.

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

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

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

Когда какой способ выбрать

Сравнение вариантов

Число() напрямую

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

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

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

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

Хорош, когда нужно получить число без исключений и допустимо значение 0 по умолчанию; заодно задаёт разрядность

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

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

Посимвольная проверка полезна, когда нужно строгое правило: например, только цифры без знака и дробной части (проверка, что строка — целое положительное число). Для этого перебирают символы строки и сравнивают каждый с диапазоном «0»–«9»:

Функция ТолькоЦифры(Строка)

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

Символ = Сред(Строка, Позиция, 1);

Если НЕ (Символ >= "0" И Символ <= "9") Тогда

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

КонецЕсли;

КонецЦикла;

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

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

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

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

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

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

Тип Число, арифметические операции выполняются без ошибок

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

Значение осталось строкой или равно 0 при явно ненулевых исходных данных

Обработка файла целиком
Норма

Все строки загружены, ошибки преобразования зафиксированы в протоколе

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

Загрузка прервалась на середине файла без сообщения о причине

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

Копейки и знаки после запятой сохранились корректно

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

Число округлилось до целого или разряды «переехали» из-за неверного разделителя

Обратная задача и смежные сценарии

Обратное преобразование — числа в строку — выполняется функцией Строка() или автоматически при конкатенации. Здесь есть своя ловушка: при формировании строк для обмена (XML, JSON, запросы к API) число может записаться с региональным разделителем, который приёмная система не поймёт. Для машинных форматов используйте Формат() с явным указанием группировки и разделителя, например Формат(Значение, "ЧГ=; ЧРД=.").

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

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

Итог

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

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