Разработка и Конфигурация · 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Определите требования: допустимы ли пробелы, знак, пустая строка, ведущие нули.
- 2Выберите способ: RegExp для строгой проверки, перебор символов для универсальности, БСП-функцию если она есть.
- 3Очистите строку от краевых и неразрывных пробелов перед проверкой.
- 4Реализуйте функцию в общем модуле, чтобы переиспользовать её на клиенте и сервере.
- 5Проверьте граничные случаи: пустая строка, один символ, буквы в середине, ведущий ноль.
Типичные ошибки и граничные случаи
Первая распространённая ошибка — забытые якоря в регулярном выражении: шаблон [0-9]+ без ^ и $ находит цифры в любой строке. Вторая — отсутствие обработки пустой строки: перебор по пустой строке возвращает «истина», хотя логически пустое значение обычно не считается валидным кодом.
Третья ошибка — проверка через Число() там, где нужны строго цифры: пользователь вводит «12,5» или «-10», проверка проходит, а дальше код ломается на сравнении длин или контрольных сумм. Четвёртая — игнорирование неразрывных пробелов и символа табуляции, которые визуально неотличимы от нормального ввода.
Как проверить результат
Функция возвращает Истина
Ложь — ошибка в шаблоне или логике перебора
Функция возвращает Ложь
Истина — забыты якоря или неверный диапазон кодов
Осознанное поведение согласно требованиям (обычно Ложь)
Случайный результат, зависящий от реализации
После СокрЛП проходит проверку
Проверка падает из-за неочищенного ввода
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. Число() проверяет другое и не подходит для кодов с ведущими нулями. Всегда обрабатывайте пустую строку и очищайте ввод от неразрывных пробелов, а в конфигурациях на БСП сначала проверьте наличие готовой функции ТолькоЦифрыВСтроке.