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

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

Как проверить, что в строке только цифры, в 1С

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

Проверка того, что строка состоит только из цифр, — одна из самых частых задач при разработке на платформе 1С:Предприятие. Она встречается при валидации введённых данных (ИНН, ОГРН, штрихкоды, номера документов), при разборе файлов обмена и при контроле пользовательского ввода на формах.

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

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

Способ 1. Типовая функция ТолькоЦифрыВСтроке из БСП

Если конфигурация построена на Библиотеке стандартных подсистем (а это большинство типовых решений: УТ, ERP, Бухгалтерия, ЗУП), то готовая функция уже есть в общем модуле СтроковыеФункцииКлиентСервер:

Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("123456") Тогда

// строка состоит только из цифр

КонецЕсли;

Функция возвращает Истина, если все символы строки — цифры. У неё есть второй необязательный параметр, который определяет поведение в спорных случаях:

  • УчитыватьЛидирующиеНули — если Истина, строка из одних нулей считается корректной;
  • УчитыватьПробелы — если Ложь, пробелы внутри строки приведут к результату Ложь.

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

Способ 2. Собственная функция перебора символов

Когда БСП недоступна (самописная конфигурация, внешняя обработка без зависимостей), проверку пишут вручную. Идея проста: пройти по каждому символу и сравнить его код с диапазоном кодов цифр (48–57 в Unicode):

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

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

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

КонецЕсли;

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

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

Если КодСимвола < 48 Или КодСимвола > 57 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Этот вариант полностью контролируем: вы сами решаете, как трактовать пустую строку, пробелы, знаки «+» и «−». Например, для проверки суммы с возможным минусом достаточно разрешить символ «-» только в первой позиции.

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

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

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

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

Проблема метода в том, что нечисловая строка превращается в 0, а строка "0" — тоже в 0, поэтому одним преобразованием корректную проверку не построить. Обычно комбинируют: сначала проверяют, что строка не пустая и не состоит из пробелов, затем сравнивают строковое представление результата с исходным значением.

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

Способ 4. Регулярные выражения

В клиент-серверных решениях на Windows можно использовать COM-объект VBScript.RegExp:

RegExp = Новый COMОбъект("VBScript.RegExp");

RegExp.Pattern = "^\d+$";

ТолькоЦифры = RegExp.Test(ПроверяемаяСтрока);

Шаблон ^\d+$ означает: от начала до конца строки — одна или более цифр. Метод выразителен и легко расширяется (например, ^\d{10}$|^\d{12}$ для ИНН юридического и физического лица).

Сравнение способов и критерии выбора

СпособЗависимостиПлатформаОсобенности
ТолькоЦифрыВСтроке (БСП)Требуется БСПЛюбаяГотовое решение, пустая строка = Истина
Перебор символов по кодамНетЛюбаяПолный контроль над правилами
ПривестиЗначение в числоНетЛюбаяТеряет лидирующие нули, неоднозначен с "0"
RegExp (COM)Windows, COMТолько Windows-клиент/серверГибкие шаблоны, не работает в веб-клиенте

Выбор зависит от контекста. Для типовой конфигурации на БСП берите готовую функцию — меньше кода и единообразие с остальным решением. Для внешних обработок без зависимостей — собственную функцию. Регулярные выражения оправданы, когда проверка сложнее простого «только цифры» и решение гарантированно работает на Windows.

Маршрут решения

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

Конфигурация на базе БСПИспользуйте СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке()
Внешняя обработка без зависимостейНапишите функцию перебора символов с проверкой кодов 48–57
Нужен сложный шаблон и гарантирован WindowsПримените VBScript.RegExp с шаблоном ^\d+$
Нужны лидирующие нули (ИНН, штрихкод)Не используйте преобразование в число — только посимвольную проверку

Частые ошибки при проверке

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

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

Третья — не учесть пробелы и неразрывные пробелы, которые попадают в данные при копировании из Excel или PDF. Перед проверкой полезно выполнить СокрЛП(), а иногда и удалить внутренние пробелы через СтрЗаменить(), если формат это допускает.

Типичные ошибки
01
Проверка через Число() или ПривестиЗначение для кодов с лидирующими нулями — теряется первый ноль, проверка врёт
02
Игнорирование пустой строки — поле без ввода проходит валидацию
03
Использование VBScript.RegExp в веб-клиенте — исключение в момент выполнения
04
Сравнение символов со строкой '0123456789' через Найти без учёта национальных цифр — редкие, но реальные ложные срабатывания

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

После внедрения функции прогоните её на контрольном наборе значений. Минимальный набор: "123" (Истина), "12а3" (Ложь), "" (по вашему правилу), " 123 " (после СокрЛП — Истина), "0" (Истина), "12,5" (Ложь, если разделитель не разрешён), "+7" (Ложь для строгой проверки).

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

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

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

Строка '12345'
Норма

Функция возвращает Истина

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

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

Строка '12а3'
Норма

Функция возвращает Ложь

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

Истина — проверка пропускает буквы

Пустая строка
Норма

Результат соответствует вашему правилу для пустого ввода

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

Поведение случайное, зависит от реализации

Строка '007'
Норма

Истина и значение не потеряно

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

Строка превратилась в число 7

FAQ

Чем ТолькоЦифрыВСтроке отличается от ЭтоЧисло?

ТолькоЦифрыВСтроке проверяет состав символов: каждый символ должен быть цифрой, лидирующие нули допустимы. ЭтоЧисло определяет, можно ли интерпретировать значение как число, и работает с точкой, знаком минус и экспоненциальной записью. Для ИНН и штрихкодов нужна первая, для сумм — вторая.

Как проверить ИНН — только цифры и длина 10 или 12?

Сначала выполните СокрЛП, затем проверьте длину: СтрДлина должна быть 10 или 12. После этого примените ТолькоЦифрыВСтроке или посимвольную проверку. Преобразование в число не используйте — ИНН может начинаться с нуля.

Почему пустая строка проходит проверку в типовой функции?

Это задуманное поведение: функция отвечает на вопрос «все ли символы — цифры», а в пустой строке нецифровых символов нет. Если пустое значение недопустимо, добавьте перед вызовом условие Не ПустаяСтрока(Значение).

Работает ли VBScript.RegExp на сервере Linux?

Нет. COM-технология доступна только в Windows. На Linux-сервере создание COMОбъекта вызовет исключение. Для кроссплатформенного кода используйте перебор символов или типовые функции БСП.

Как разрешить в строке цифры и один разделитель — точку или запятую?

Модифицируйте посимвольную проверку: заведите счётчик разделителей, разрешайте символы "." и "," только если счётчик равен нулю, и увеличивайте его при встрече. Либо используйте регулярное выражение вида ^\d+([.,]\d+)?$ в Windows-окружении.

Что делать с пробелами внутри числа, скопированного из Excel?

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

Итог

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

Для типовых конфигураций используйте СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке, для независимого кода — посимвольную проверку кодов 48–57. Не проверяйте строки с лидирующими нулями через числа, явно обрабатывайте пустую строку и помните, что RegExp через COM работает только на Windows.