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

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

Как в 1С проверить, что символ — это число

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

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

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

Проверка одиночного символа через сравнение кодов

Самый быстрый способ — сравнить символ с границами диапазона цифр. В 1С строки сравниваются посимвольно по кодам, а цифры «0»–«9» идут в таблице символов подряд, поэтому работает простое двойное сравнение:

Функция ЭтоЦифра(Символ)

Возврат Символ >= "0" И Символ <= "9";

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

Функция вернёт Истина только для символов от «0» до «9». Буквы, пробелы, знаки препинания и спецсимволы дадут Ложь. Важно: функция ожидает ровно один символ. Если передать строку длиннее одного знака, сравнение будет выполняться по строковым правилам и результат станет непредсказуемым.

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

Функция ЭтоЦифра(Символ)

Возврат СтрНайти("0123456789", Символ) > 0;

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

Проверка всей строки: состоит ли она только из цифр

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

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

Если СтрДлина(Строка) = 0 Тогда

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

КонецЕсли;

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

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

Если СтрНайти("0123456789", Символ) = 0 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Обратите внимание на проверку пустой строки в начале. Без неё пустое значение формально «пройдёт» цикл и функция вернёт Истина, что почти всегда является ошибкой логики: пустой ИНН — не валидный ИНН.

Более компактный приём без цикла — разбить строку по каждой цифре через СтрРазделить. Если строка состоит только из цифр, то последовательное удаление всех цифр даст пустую строку:

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

Проверка = Строка;

Для Н = 0 По 9 Цикл

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

КонецЦикла;

Возврат СтрДлина(Проверка) = 0 И СтрДлина(Строка) > 0;

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

Порядок действий при проверке строки на цифры
  1. 1
    Убедитесь, что значение имеет тип Строка — при необходимости приведите через Строка(Значение)
  2. 2
    Удалите лишние пробелы: СокрЛП(Строка)
  3. 3
    Проверьте, что строка не пустая
  4. 4
    Пройдите посимвольно или замените все цифры и проверьте остаток
  5. 5
    При необходимости дополнительно проверьте длину (например, ИНН — 10 или 12 знаков)

Проверка через преобразование в число

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

Через описание типов

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

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

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

Если Результат = 0 И СокрЛП(СтрокаДанных) <> "0" Тогда

// преобразование не удалось

КонецЕсли;

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

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

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

Попытка

Возврат Число(СтрокаЗначения);

Исключение

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

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

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

Учтите, что Число() чувствительна к разделителю дробной части: в русской локали ожидается запятая, строка «12.5» может вызвать ошибку или преобразоваться не так, как ожидается, в зависимости от настроек. Данные из внешних файлов (CSV, XML) часто содержат точку — её стоит предварительно заменять через СтрЗаменить после проверки, что точка в строке одна.

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

Проверка кода символа

Ещё один способ — работа с кодом символа через КодСимвола(). Цифры «0»–«9» имеют последовательные коды (48–57 в Unicode), поэтому проверка выглядит так:

Функция ЭтоЦифраПоКоду(Символ)

Код = КодСимвола(Символ);

Возврат Код >= 48 И Код <= 57;

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

Этот вариант полезен, когда логика уже опирается на коды символов — например, при разборе потока байтов, обработке ESC-последовательностей принтера или посимвольном анализе данных из COM-портов и сканеров. Для обычной валидации пользовательского ввода он избыточен: сравнение с «0» и «9» читается проще.

Значения кодов 48–57 соответствуют стандартной таблице Unicode и одинаковы во всех поддерживаемых локалях платформы, поэтому переносимости кода это не нарушает.

Сравнение способов и рекомендации по выбору

У каждого подхода есть своя ниша. Сводное сравнение поможет выбрать без лишних экспериментов:

СпособЧто проверяетПлюсыОграничения
Сравнение с «0»–«9»Один символБыстро, простоТолько одиночный символ
СтрНайти в «0123456789»Один символЛегко расширить набор допустимых знаковЛожное срабатывание на пустой строке
Посимвольный циклВсю строкуПолный контроль, можно собирать позицию ошибкиМедленнее на длинных строках
СтрЗаменить цифрВсю строкуКомпактный код10 проходов по строке
Число() + ПопыткаЧисло целиком, включая дробныеУчитывает знак и дробную частьЗависит от локали, исключения медленные
ОписаниеТипов.ПривестиЗначениеЧисло целикомБез исключенийНе различает «0» и ошибку
Маршрут решения

Как выбрать действие

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

Производительность и массовые обработки

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

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

Также избегайте повторного создания объектов внутри цикла: ОписаниеТипов, литеральные строки-образцы и т.п. следует формировать один раз до цикла, а не на каждой итерации.

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

Проверка результата и отладка

После внедрения функции проверки стоит прогнать её на контрольном наборе значений. Минимальный набор: «0», «9», «123», «12а», «а12», пустая строка, строка из пробелов, «1 000» (с неразрывным пробелом), «-5», «3,14», «3.14». Каждое из этих значений должно дать ожидаемый результат именно в вашей логике.

Отдельное внимание — неразрывному пробелу (код 160), который часто попадает в числа при копировании из Excel или веб-страниц. СокрЛП его не удаляет. Если входные данные могут содержать такие символы, добавьте предварительную замену Символ(160) на пустую строку.

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

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

Функция на «0» и «9»
Норма

Возвращает Истина

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

Ложь — ошибка в границах диапазона

Функция на пустой строке
Норма

Возвращает Ложь (или отдельно обработано)

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

Истина — пустые значения пройдут дальше по логике

Строка с буквой в середине, например «12а3»
Норма

Ложь

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

Истина — проверяется только часть строки

Число с неразрывным пробелом «1 000»
Норма

Обрабатывается по задуманному правилу

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

Непредсказуемый результат или исключение

Часто задаваемые вопросы

Есть ли в 1С встроенная функция «ЭтоЧисло»?

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

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

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

Как проверить, что строка — целое положительное число?

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

СтрНайти("0123456789", "") возвращает 1 — это ошибка платформы?

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

Что быстрее: посимвольный цикл или Попытка с Число()?

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

Как учесть неразрывный пробел в числах из Excel?

СокрЛП не удаляет неразрывный пробел (код 160). Перед проверкой выполните СтрЗаменить(Строка, Символ(160), "") и затем СокрЛП. Это особенно важно при загрузке данных, скопированных из Excel, веб-страниц или PDF, где разряды чисел часто отделяются именно неразрывными пробелами.

Итог

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

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