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

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

Проверка в 1С, что строка содержит только цифры

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

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

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

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

Регулярное выражение — самый лаконичный и надёжный вариант. В 1С доступен объект RegExp (в тонком, толстом и веб-клиенте, а также на сервере при определённых настройках). Шаблон ^[0-9]+$ означает: строка от начала до конца состоит из одного или более символов цифр.

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

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

RegExp.Pattern = "^[0-9]+$";

RegExp.Global = Истина;

Возврат RegExp.Test(Строка);

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

В управляемых формах и на сервере вместо COM-объекта используют встроенный объект:

RegExp = Новый RegExp("^[0-9]+$");

Если RegExp.Соответствует(Строка) Тогда

// строка содержит только цифры

КонецЕсли;

Обратите внимание на якоря ^ и $: без них выражение найдёт цифры внутри любой строки, и «АБВ123» тоже пройдёт проверку. Квантификатор + требует хотя бы одну цифру — пустая строка проверку не пройдёт. Если пустая строка допустима, замените + на *.

Способ 2. Перебор символов с проверкой кодов

Если регулярные выражения недоступны или нежелательны (например, из-за ограничений безопасной конфигурации), строку проверяют посимвольно. Коды цифр «0»–«9» в Unicode идут подряд с 48 по 57, поэтому достаточно сравнить код каждого символа.

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

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

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

КонецЕсли;

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Альтернатива без кодов — проверка вхождения символа в строку-алфавит «0123456789» через СтрНайти. Такой подход нагляднее и его легко расширить: например, добавить в алфавит пробел или знак «+», если формат это допускает.

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

Допустимые = "0123456789";

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

Если СтрНайти(Допустимые, Сред(Строка, Позиция, 1)) = 0 Тогда

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

КонецЕсли;

КонецЦикла;

Возврат Не ПустаяСтрока(Строка);

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

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

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

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

Функция СтрокаЯвляетсяЧислом(Строка) Экспорт

Попытка

ЗначениеЧисло = Число(Строка);

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

Исключение

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

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

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

У этого способа есть принципиальное отличие: он проверяет не «только цифры», а «является числом». Строки «12.5», «-7», «+3» и «1 000» (с пробелом как разделителем групп в некоторых условиях) тоже пройдут проверку. Для ИНН или штрихкода это ошибка — там допустимы исключительно цифры.

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

Готовые функции из БСП

Если конфигурация построена на Библиотеке стандартных подсистем, часть работы уже сделана. В общем модуле СтроковыеФункцииКлиентСервер есть функция ТолькоЦифрыВСтроке (в разных версиях БСП сигнатура может отличаться — проверьте состав параметров в своей версии).

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

// строка содержит только цифры

КонецЕсли;

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

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

Регулярное выражение

Короткий код, строгая проверка. Ограничение: зависит от доступности объекта RegExp в среде исполнения.

Перебор символов

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

Число() с Попытка/Исключение

Просто, но проверяет «это число», а не «только цифры»: пропускает минус, точку, пробелы.

БСП: ТолькоЦифрыВСтроке

Готовое решение без своего кода. Ограничение: доступно только в конфигурациях на БСП, сигнатура зависит от версии.

Проверка при вводе в форме

В управляемой форме проверку удобно выполнять в обработчике ПриИзменении поля ввода или при записи объекта. Для немедленной реакции на ввод используют клиентскую процедуру: функция с перебором символов работает на клиенте без вызова сервера, что исключает лишние обращения.

&НаКлиенте

Процедура ИННПриИзменении(Элемент)

Если Не ТолькоЦифры(Объект.ИНН) Тогда

ТекстСообщения = НСтр("ru = 'ИНН должен содержать только цифры'");

ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения, , "Объект.ИНН");

КонецЕсли;

КонецПроцедуры

Дополнительно полезно очищать ввод от пробелов по краям через СокрЛП до проверки: скопированный из Excel номер часто содержит неразрывные пробелы, которые пользователь не видит. Для полной зачистки неразрывных пробелов применяют СтрЗаменить(Строка, Символ(160), "").

Порядок действий
  1. 1
    Определите требования: допустимы ли пробелы, знак, пустая строка, ведущие нули.
  2. 2
    Выберите способ: RegExp для строгой проверки, перебор символов для универсальности, БСП-функцию если она есть.
  3. 3
    Очистите строку от краевых и неразрывных пробелов перед проверкой.
  4. 4
    Реализуйте функцию в общем модуле, чтобы переиспользовать её на клиенте и сервере.
  5. 5
    Проверьте граничные случаи: пустая строка, один символ, буквы в середине, ведущий ноль.

Типичные ошибки и граничные случаи

Первая распространённая ошибка — забытые якоря в регулярном выражении: шаблон [0-9]+ без ^ и $ находит цифры в любой строке. Вторая — отсутствие обработки пустой строки: перебор по пустой строке возвращает «истина», хотя логически пустое значение обычно не считается валидным кодом.

Третья ошибка — проверка через Число() там, где нужны строго цифры: пользователь вводит «12,5» или «-10», проверка проходит, а дальше код ломается на сравнении длин или контрольных сумм. Четвёртая — игнорирование неразрывных пробелов и символа табуляции, которые визуально неотличимы от нормального ввода.

Типичные ошибки
01
Шаблон [0-9]+ без якорей — пропускает строки вида «АБВ123», где цифры лишь часть текста.
02
Проверка через Число() для штрихкодов — теряются ведущие нули и пропускаются минус, точка, пробелы.
03
Не обработана пустая строка — функция возвращает Истина, и пустое значение записывается в базу.
04
Не удалены неразрывные пробелы из скопированных данных — проверка «неожиданно» не проходит.
Контрольные точки

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

Строка «123456»
Норма

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

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

Ложь — ошибка в шаблоне или логике перебора

Строка «12А45»
Норма

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

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

Истина — забыты якоря или неверный диапазон кодов

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

Осознанное поведение согласно требованиям (обычно Ложь)

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

Случайный результат, зависящий от реализации

Строка « 123 » с пробелами
Норма

После СокрЛП проходит проверку

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

Проверка падает из-за неочищенного ввода

FAQ

Как проверить, что строка содержит только цифры и её длина ровно 10 символов?

Объедините условия: СтрДлина(Строка) = 10 И ТолькоЦифры(Строка). В регулярном выражении это задаётся одним шаблоном ^[0-9]{10}$ — квантификатор в фигурных скобках фиксирует точное количество символов.

Работает ли объект RegExp в веб-клиенте и на сервере?

Встроенный объект RegExp доступен в тонком и веб-клиенте, а также на сервере. COM-объект VBScript.RegExp работает только под Windows и в веб-клиенте недоступен, поэтому для кроссплатформенного кода используйте встроенный объект или перебор символов.

Как разрешить в строке цифры и пробелы между группами?

В регулярном выражении добавьте пробел в класс символов: ^[0-9 ]+$. При переборе — добавьте пробел в строку допустимых символов. Если пробелы нужно только игнорировать, проще удалить их через СтрЗаменить до проверки.

Чем отличается проверка «только цифры» от проверки «это число»?

«Только цифры» — проверка состава символов: строка «00123» валидна. «Это число» — проверка возможности преобразования: пройдут «-5», «3.14», но ведущие нули потеряются. Для идентификаторов и кодов нужен первый вариант, для количеств и сумм — второй.

Почему проверка не проходит для строки, скопированной из Excel?

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

Где разместить функцию проверки, чтобы использовать её везде?

Создайте общий модуль с признаками «Сервер» и «Вызов сервера» (или «Клиент (управляемое приложение)» для чисто клиентской логики) и поместите функцию туда с ключевым словом Экспорт. Так проверка будет единообразной во всех формах и объектах конфигурации.

Итог

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

Для строгой проверки «только цифры» используйте регулярное выражение ^[0-9]+$ или перебор символов с кодами 48–57. Число() проверяет другое и не подходит для кодов с ведущими нулями. Всегда обрабатывайте пустую строку и очищайте ввод от неразрывных пробелов, а в конфигурациях на БСП сначала проверьте наличие готовой функции ТолькоЦифрыВСтроке.