Разработка и Конфигурация · 11 мин
1С: проверка, что символ является цифрой
Как в 1С проверить, что символ является цифрой: функции через код символа, СтрНайти, регулярные выражения. Готовые функции, примеры кода и типичные ошибки.
Проверка символа на принадлежность к цифрам — частая задача при разработке на встроенном языке 1С: валидация ввода в формах, разбор строк из файлов обмена, проверка кодов, артикулов, номеров документов. Встроенной функции вида «ЭтоЦифра» в платформе нет, поэтому проверку реализуют самостоятельно — и способов несколько.
Выбор подхода зависит от контекста: нужно проверить один символ или всю строку, учитывать ли только латинские цифры 0–9 или также цифры других алфавитов Unicode, где выполняется код (клиент или сервер), насколько критична производительность при массовой обработке. Ниже разобраны рабочие варианты с готовым кодом, их ограничения и типичные ошибки.
Почему в 1С нет готовой функции проверки на цифру
Встроенный язык 1С минималистичен: он включает базовые строковые функции (СтрДлина, Сред, Лев, Прав, СтрНайти, КодСимвола, Символ), но не содержит специализированных проверок типа символов. Это осознанное решение платформы — разработчик сам определяет, что считать цифрой в его задаче.
Неоднозначность действительно существует. Символ «5» — цифра в любой интерпретации, а символ «²» (верхний индекс) или римская цифра «Ⅻ» — уже вопрос постановки задачи. Кроме того, в Unicode есть цифры других систем письма (арабские, деванагари и др.), и для обмена с внешними системами это может иметь значение.
Поэтому первый шаг — определить, что именно требуется: строгая проверка на символы 0–9 (самый частый случай в учётных задачах) или расширенная проверка по категориям Unicode.
Способ 1: проверка через КодСимвола — самый надёжный
Цифры 0–9 в таблице Unicode идут подряд с кодами от 48 до 57. Это позволяет написать компактную и быструю функцию:
Функция ЭтоЦифра(Символ) Экспорт
Если СтрДлина(Символ) <> 1 Тогда
Возврат Ложь;
КонецЕсли;
Код = КодСимвола(Символ);
Возврат Код >= 48 И Код <= 57;
КонецФункции
Проверка длины в начале важна: если передать пустую строку, КодСимвола вызовет ошибку «Недопустимое значение параметра». Если передать строку из нескольких символов, функция молча проверит только первый — что может скрыть логическую ошибку в вызывающем коде.
Этот способ работает одинаково на клиенте и на сервере, не требует внешних компонент и выполняется быстро даже при массовой обработке миллионов символов. Для большинства учётных задач — рекомендуемый вариант.
Способ 2: проверка через СтрНайти по строке цифр
Альтернатива без работы с кодами — поиск символа в эталонной строке «0123456789»:
Функция ЭтоЦифра(Символ) Экспорт
Возврат СтрДлина(Символ) = 1 И СтрНайти("0123456789", Символ) > 0;
КонецФункции
Способ чуть медленнее сравнения кодов, но разница заметна только при очень больших объёмах. Зато он легко расширяется: если нужно считать допустимыми, например, цифры и знак минуса, эталонная строка меняется на «0123456789-» — логика остаётся прозрачной.
Тот же приём применяют для проверки букв, допустимых символов артикула, шестнадцатеричных цифр («0123456789ABCDEF») и других наборов. Это делает подход универсальным шаблоном для валидации ввода.
Способ 3: проверка всей строки, а не одного символа
Чаще на практике нужно проверить не один символ, а что вся строка состоит только из цифр — например, ИНН, номер телефона, код из штрихкода. Тогда используют цикл:
Функция СтрокаСостоитИзЦифр(Строка) Экспорт
Если ПустаяСтрока(Строка) Тогда
Возврат Ложь;
КонецЕсли;
Для Позиция = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, Позиция);
Если Код < 48 Или Код > 57 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Обратите внимание: КодСимвола умеет принимать строку и позицию, что избавляет от лишнего вызова Сред(). Проверка на пустую строку вынесена отдельно — в большинстве учётных задач пустое значение не считается «строкой из цифр», но в вашей логике решение может быть другим.
Альтернатива без цикла — попытка преобразования через ОписаниеТипов или сравнение строки с самой собой после удаления цифр, но такие трюки менее читаемы и чаще вводят в заблуждение, чем экономят время.
- 1Определите, что считать цифрой: только 0–9 или расширенный набор
- 2Проверьте строку на пустоту и задайте поведение для пустого значения
- 3Пройдите циклом по символам и сравните код каждого с диапазоном 48–57
- 4При первом неподходящем символе сразу верните Ложь
- 5Протестируйте функцию на граничных случаях: пустая строка, пробелы, знак минуса, буквы
Способ 4: регулярные выражения и внешние средства
Встроенной поддержки регулярных выражений во встроенном языке нет. На Windows-сервере исторически использовали COM-объект VBScript.RegExp, но он недоступен на Linux и в веб-клиенте, поэтому для новых разработок это неудачный выбор.
Если проверка выполняется на сервере и СУБД — можно вынести проверку в запрос, но в языке запросов 1С тоже нет прямой функции проверки символа на цифру; приходится строить громоздкие конструкции с ПОДСТРОКА и ВЫБОР, что оправдано только при отборе больших выборок на стороне базы.
Для типовых конфигураций посмотрите общие модули — в БСП (Библиотека стандартных подсистем) есть функции работы со строками, например проверки в модуле СтроковыеФункцииКлиентСервер. Использование готовых функций типовой библиотеки предпочтительнее собственных велосипедов: они протестированы и поддерживаются при обновлениях.
Сравнение способов проверки
Быстро, работает везде, без внешних зависимостей. Оптимален для массовой обработки
Чуть медленнее, но легко расширяется на произвольные наборы допустимых символов
Только Windows и толстый клиент, не работает в веб-клиенте и на Linux — для новых решений не рекомендуется
Лучший вариант в типовых конфигурациях: готовый протестированный код, но зависит от наличия библиотеки
Частые ошибки и подводные камни
Самая распространённая ошибка — забыть про пробелы и неразрывные пробелы. Строка «123 456» визуально выглядит как число, но пробел внутри не является цифрой. Если данные приходят из Excel или из сканера, перед проверкой часто нужно выполнить СокрЛП и, при необходимости, удалить внутренние разделители групп разрядов.
Вторая ошибка — путать проверку «строка из цифр» с проверкой «строка является числом». Значение «-12,5» — корректное число, но не строка из цифр. Для проверки на число правильнее использовать попытку преобразования или ОписаниеТипов, а не посимвольный разбор.
Третья группа проблем — производительность. Посимвольный цикл по строкам длиной в тысячи символов внутри обработки миллиона записей может стать узким местом. В таких случаях выносите проверку на уровень запроса или сокращайте объём обрабатываемых данных до разумного.
Проверка результата и тестирование функции
После написания функции прогоните её на контрольном наборе значений. Минимальный список: «0», «9», «5» (должны быть Истина), «А», «а», «-», «.», « » (пробел), пустая строка (должны быть Ложь), а для строковой версии — «123», «007», «12 3», «12,3», «1А2».
Особое внимание уделите символам, визуально похожим на цифры: кириллическая «О» и латинская «O» вместо нуля, буква «l» вместо единицы. Такие подмены типичны для данных, введённых вручную или распознанных OCR. Если задача критична (например, разбор штрихкодов), добавьте предварительную нормализацию строки.
Как проверить результат
Возвращает Истина для всех десяти цифр
Ложь на отдельных цифрах — ошибка в границах диапазона
Ложь для букв, минуса, точки, пробела
Истина на каком-либо нецифровом символе
Контролируемое поведение без исключений
Ошибка времени выполнения или непредсказуемый результат
Одинаковый результат в обоих контекстах
Расхождения из-за недоступных методов или COM-объектов
Когда проверки недостаточно: границы подхода
Посимвольная проверка отвечает только на вопрос «есть ли нецифровые символы». Она не проверяет смысловую корректность: ИНН из десяти цифр может не проходить контрольную сумму, номер телефона — не соответствовать формату страны, дата «32012026» — содержать несуществующий день.
Для таких задач посимвольная проверка — лишь первый фильтр. Далее подключают форматные проверки: длину строки, контрольные разряды, маски ввода. В формах 1С для полей с фиксированным форматом часто эффективнее использовать свойство «Маска» поля ввода — оно отсекает неподходящие символы ещё на этапе набора, без программной проверки.
Что важно запомнить
Готовой функции «ЭтоЦифра» в 1С нет: проверяйте код символа в диапазоне 48–57 или ищите символ в строке «0123456789». Всегда обрабатывайте пустую строку, отделяйте задачу «только цифры» от задачи «корректное число» и в типовых конфигурациях сначала ищите готовые функции в БСП.
Частые вопросы
Как проверить, что вся строка состоит только из цифр, без цикла?
Компактный вариант без явного цикла — сравнить длину строки до и после удаления цифр через СтрЗаменить для каждой цифры, но это десять вызовов замены и обычно медленнее цикла. На практике цикл с КодСимвола остаётся самым читаемым и быстрым решением.
Почему КодСимвола выдаёт ошибку в моей обработке?
Чаще всего функция получает пустую строку — например, при разборе файла с пустыми колонками. Перед вызовом проверяйте СтрДлина(Символ) = 1. Также убедитесь, что не передаёте в функцию Неопределено или значение другого типа.
Как учесть цифры других алфавитов Unicode?
Встроенные средства 1С не дают доступа к категориям Unicode. Если нужны, например, арабские цифры, расширьте проверку диапазонами их кодов или эталонной строкой с этими символами. Для учётных задач российского сегмента обычно достаточно диапазона 0–9.
Чем отличается проверка «только цифры» от проверки «это число»?
Строка «-12,5» — корректное число, но содержит минус и запятую, поэтому проверку на цифры не пройдёт. Для проверки на число используйте преобразование через ОписаниеТипов с ПривестиЗначение или попытку вычисления, а не посимвольный разбор.
Можно ли проверить символ на цифру прямо в запросе 1С?
Прямой функции нет, но можно построить условие через ПОДСТРОКА и сравнение с набором значений или через ВЫБОР с перечислением цифр. Такие конструкции громоздки и оправданы только когда фильтрацию нужно выполнить на стороне СУБД по большой таблице.
Есть ли готовая функция в типовых конфигурациях?
В конфигурациях на базе БСП проверьте общий модуль СтроковыеФункцииКлиентСервер — там есть вспомогательные функции работы со строками. Использование функций библиотеки предпочтительнее собственных аналогов: они учитывают особенности платформы и поддерживаются при обновлении конфигурации.