Разработка и Конфигурация · 11 мин
Как в 1С проверить, что символ — это число
Как в 1С проверить, что символ является числом: функции проверки строки на цифры, готовые процедуры, обработка ошибок преобразования и типичные ошибки разработчиков.
Задача проверить, является ли символ или строка числом, возникает в 1С постоянно: при разборе штрихкодов, валидации введённых пользователем данных, загрузке файлов обмена, парсинге наименований. Встроенной функции вида «ЭтоЦифра()» во встроенном языке нет, поэтому проверку реализуют вручную — и у этого есть несколько рабочих способов с разной скоростью и надёжностью.
Выбор подхода зависит от того, что именно нужно проверить: одиночный символ, строку из цифр или значение, которое должно превратиться в число с учётом дробной части и знака. Ниже разобраны все основные варианты с готовым кодом, который можно переносить в общий модуль или процедуру формы.
Проверка одиночного символа через сравнение кодов
Самый быстрый способ — сравнить символ с границами диапазона цифр. В 1С строки сравниваются посимвольно по кодам, а цифры «0»–«9» идут в таблице символов подряд, поэтому работает простое двойное сравнение:
Функция ЭтоЦифра(Символ)
Возврат Символ >= "0" И Символ <= "9";
КонецФункции
Функция вернёт Истина только для символов от «0» до «9». Буквы, пробелы, знаки препинания и спецсимволы дадут Ложь. Важно: функция ожидает ровно один символ. Если передать строку длиннее одного знака, сравнение будет выполняться по строковым правилам и результат станет непредсказуемым.
Альтернатива — поиск вхождения в строку-образец. Такой вариант читается чуть медленнее, но легко расширяется, если нужно допустить, например, ещё и точку с минусом:
Функция ЭтоЦифра(Символ)
Возврат СтрНайти("0123456789", Символ) > 0;
КонецФункции
Проверка всей строки: состоит ли она только из цифр
Когда нужно убедиться, что строка целиком состоит из цифр (ИНН, штрихкод, номер телефона без форматирования), используют посимвольный цикл. Классический вариант:
Функция СтрокаСодержитТолькоЦифры(Строка)
Если СтрДлина(Строка) = 0 Тогда
Возврат Ложь;
КонецЕсли;
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти("0123456789", Символ) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Обратите внимание на проверку пустой строки в начале. Без неё пустое значение формально «пройдёт» цикл и функция вернёт Истина, что почти всегда является ошибкой логики: пустой ИНН — не валидный ИНН.
Более компактный приём без цикла — разбить строку по каждой цифре через СтрРазделить. Если строка состоит только из цифр, то последовательное удаление всех цифр даст пустую строку:
Функция СтрокаСодержитТолькоЦифры(Строка)
Проверка = Строка;
Для Н = 0 По 9 Цикл
Проверка = СтрЗаменить(Проверка, Строка(Н), "");
КонецЦикла;
Возврат СтрДлина(Проверка) = 0 И СтрДлина(Строка) > 0;
КонецФункции
- 1Убедитесь, что значение имеет тип Строка — при необходимости приведите через Строка(Значение)
- 2Удалите лишние пробелы: СокрЛП(Строка)
- 3Проверьте, что строка не пустая
- 4Пройдите посимвольно или замените все цифры и проверьте остаток
- 5При необходимости дополнительно проверьте длину (например, ИНН — 10 или 12 знаков)
Проверка через преобразование в число
Если цель — не просто «цифры», а корректное число (с минусом, дробной частью), посимвольная проверка становится громоздкой. Надёжнее попытаться выполнить преобразование и обработать результат.
Через описание типов
Способ без исключений: создать ОписаниеТипов и вызвать ПривестиЗначение. Если строка не преобразуется, метод вернёт 0 — но это же значение вернёт и для строки «0», поэтому способ подходит, только когда ноль недопустим или обрабатывается отдельно:
ОписаниеЧисло = Новый ОписаниеТипов("Число");
Результат = ОписаниеЧисло.ПривестиЗначение(СтрокаДанных);
Если Результат = 0 И СокрЛП(СтрокаДанных) <> "0" Тогда
// преобразование не удалось
КонецЕсли;
Через Попытка...Исключение
Более строгий вариант — вызвать функцию Число() внутри блока Попытка. Для нечисловой строки будет вызвано исключение, которое можно перехватить:
Функция СтрокаВЧисло(СтрокаЗначения, ЗначениеПоУмолчанию = 0)
Попытка
Возврат Число(СтрокаЗначения);
Исключение
Возврат ЗначениеПоУмолчанию;
КонецПопытки;
КонецФункции
Учтите, что Число() чувствительна к разделителю дробной части: в русской локали ожидается запятая, строка «12.5» может вызвать ошибку или преобразоваться не так, как ожидается, в зависимости от настроек. Данные из внешних файлов (CSV, XML) часто содержат точку — её стоит предварительно заменять через СтрЗаменить после проверки, что точка в строке одна.
Проверка кода символа
Ещё один способ — работа с кодом символа через КодСимвола(). Цифры «0»–«9» имеют последовательные коды (48–57 в Unicode), поэтому проверка выглядит так:
Функция ЭтоЦифраПоКоду(Символ)
Код = КодСимвола(Символ);
Возврат Код >= 48 И Код <= 57;
КонецФункции
Этот вариант полезен, когда логика уже опирается на коды символов — например, при разборе потока байтов, обработке ESC-последовательностей принтера или посимвольном анализе данных из COM-портов и сканеров. Для обычной валидации пользовательского ввода он избыточен: сравнение с «0» и «9» читается проще.
Значения кодов 48–57 соответствуют стандартной таблице Unicode и одинаковы во всех поддерживаемых локалях платформы, поэтому переносимости кода это не нарушает.
Сравнение способов и рекомендации по выбору
У каждого подхода есть своя ниша. Сводное сравнение поможет выбрать без лишних экспериментов:
| Способ | Что проверяет | Плюсы | Ограничения |
|---|---|---|---|
| Сравнение с «0»–«9» | Один символ | Быстро, просто | Только одиночный символ |
| СтрНайти в «0123456789» | Один символ | Легко расширить набор допустимых знаков | Ложное срабатывание на пустой строке |
| Посимвольный цикл | Всю строку | Полный контроль, можно собирать позицию ошибки | Медленнее на длинных строках |
| СтрЗаменить цифр | Всю строку | Компактный код | 10 проходов по строке |
| Число() + Попытка | Число целиком, включая дробные | Учитывает знак и дробную часть | Зависит от локали, исключения медленные |
| ОписаниеТипов.ПривестиЗначение | Число целиком | Без исключений | Не различает «0» и ошибку |
Как выбрать действие
Производительность и массовые обработки
При разовой проверке пользовательского ввода разница между способами незаметна. Но в массовых обработках — загрузке прайсов на десятки тысяч строк, разборе больших текстовых файлов — выбор влияет на время выполнения.
Самые затратные операции — исключения. Конструкция Попытка...Исключение, срабатывающая на каждой «плохой» строке, заметно медленнее прямых сравнений. Если доля ошибочных значений велика, лучше сначала отфильтровать данные дешёвой посимвольной проверкой, а Число() вызывать только для прошедших фильтр значений.
Также избегайте повторного создания объектов внутри цикла: ОписаниеТипов, литеральные строки-образцы и т.п. следует формировать один раз до цикла, а не на каждой итерации.
Универсальный приём для обменов: проверяйте строку на «только цифры» до преобразования, а не после. Это избавляет от исключений, а заодно позволяет записать в журнал регистрации точную позицию и значение, на котором разбор остановился, — такие записи сильно упрощают поиск причин сбоев загрузки.
Проверка результата и отладка
После внедрения функции проверки стоит прогнать её на контрольном наборе значений. Минимальный набор: «0», «9», «123», «12а», «а12», пустая строка, строка из пробелов, «1 000» (с неразрывным пробелом), «-5», «3,14», «3.14». Каждое из этих значений должно дать ожидаемый результат именно в вашей логике.
Отдельное внимание — неразрывному пробелу (код 160), который часто попадает в числа при копировании из Excel или веб-страниц. СокрЛП его не удаляет. Если входные данные могут содержать такие символы, добавьте предварительную замену Символ(160) на пустую строку.
Как проверить результат
Возвращает Истина
Ложь — ошибка в границах диапазона
Возвращает Ложь (или отдельно обработано)
Истина — пустые значения пройдут дальше по логике
Ложь
Истина — проверяется только часть строки
Обрабатывается по задуманному правилу
Непредсказуемый результат или исключение
Часто задаваемые вопросы
Есть ли в 1С встроенная функция «ЭтоЧисло»?
Нет, штатной функции проверки «является ли строка числом» во встроенном языке нет. Проверку реализуют самостоятельно: сравнением символов, посимвольным циклом, через ОписаниеТипов или Число() в блоке Попытка...Исключение. В типовых конфигурациях встречаются похожие функции в общих модулях (например, проверки в составе БСП), но это библиотечный код, а не функция платформы.
Почему Число("12.5") выдаёт ошибку?
Функция Число() ожидает разделитель дробной части в соответствии с региональными настройками сеанса. В русской локали это запятая, поэтому строка с точкой может не преобразоваться. Перед преобразованием замените точку на запятую через СтрЗаменить, предварительно убедившись, что точка в строке одна и строка не содержит других лишних символов.
Как проверить, что строка — целое положительное число?
Используйте посимвольную проверку на «только цифры» с обязательным отсечением пустой строки. После этого при необходимости проверьте длину и первый символ (например, чтобы исключить ведущие нули). Преобразование через Число() здесь менее удобно, так как допустит знак минус и дробную часть.
СтрНайти("0123456789", "") возвращает 1 — это ошибка платформы?
Нет, это документированное поведение: поиск пустой подстроки считается успешным и возвращает позицию 1. Поэтому перед проверкой символа через СтрНайти всегда убеждайтесь, что проверяемое значение не пустое, иначе пустая строка ошибочно пройдёт как «цифра».
Что быстрее: посимвольный цикл или Попытка с Число()?
На корректных данных разница невелика. Но если исключение срабатывает часто, Попытка...Исключение заметно медленнее прямых сравнений. В массовых загрузках выгоднее сначала отфильтровать строки дешёвой посимвольной проверкой, а Число() вызывать только для заведомо цифровых значений.
Как учесть неразрывный пробел в числах из Excel?
СокрЛП не удаляет неразрывный пробел (код 160). Перед проверкой выполните СтрЗаменить(Строка, Символ(160), "") и затем СокрЛП. Это особенно важно при загрузке данных, скопированных из Excel, веб-страниц или PDF, где разряды чисел часто отделяются именно неразрывными пробелами.
Что важно запомнить
Готовой функции проверки на цифру в 1С нет. Один символ проверяйте сравнением с «0»–«9», строку из цифр — посимвольным циклом с отсечением пустоты, преобразование в число — через Число() в Попытке или ОписаниеТипов. Всегда обрабатывайте пустые строки, пробелы и разделитель дробной части — именно на них ломается большинство проверок.