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

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

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

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

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

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

Способ 1. Перебор символов с проверкой кода каждого знака

Классический и самый контролируемый вариант — пройти по строке циклом и проверить, что код каждого символа лежит в диапазоне кодов цифр. В 1С коды символов «0»–«9» идут подряд, поэтому достаточно сравнить КодСимвола(Символ) с кодами символов «0» и «9».

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

Пустая = СтрДлина(Строка) = 0;

Если Пустая Тогда

Возврат Ложь; // пустую строку не считаем числовой

КонецЕсли;

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

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

Если Код < КодСимвола("0") Или Код > КодСимвола("9") Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Такая функция работает на любой платформе (Windows, Linux, веб-клиент), не зависит от внешних компонентов и даёт однозначный результат. Отдельно решите, как обрабатывать пустую строку: в большинстве учётных задач пустое значение — это ошибка ввода, поэтому функция возвращает Ложь.

Альтернатива без кодов символов — сравнение через СтрНайти("0123456789", Символ): если символ не входит в строку-алфавит, функция вернёт 0. Результат тот же, но сравнение кодов обычно читается нагляднее.

Способ 2. Быстрая проверка через СтрЧислоВхождений

Компактный приём: посчитать, сколько раз в строке встречается каждая цифра, и сравнить сумму с длиной строки. Если сумма совпадает — других символов в строке нет.

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

Если Не ЗначениеЗаполнено(Строка) Тогда

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

КонецЕсли;

ВсегоЦифр = СтрЧислоВхождений(Строка, "0")

+ СтрЧислоВхождений(Строка, "1")

+ СтрЧислоВхождений(Строка, "2")

+ СтрЧислоВхождений(Строка, "3")

+ СтрЧислоВхождений(Строка, "4")

+ СтрЧислоВхождений(Строка, "5")

+ СтрЧислоВхождений(Строка, "6")

+ СтрЧислоВхождений(Строка, "7")

+ СтрЧислоВхождений(Строка, "8")

+ СтрЧислоВхождений(Строка, "9");

Возврат ВсегоЦифр = СтрДлина(Строка);

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

Способ короче в записи, но выполняет десять проходов по строке вместо одного. Для коротких полей (ИНН, код подразделения) разница незаметна, а при массовой проверке длинных строк в цикле обработки данных перебор символов предпочтительнее.

Способ 3. Регулярные выражения через VBScript.RegExp

Если проверка сложнее простого «только цифры» (например, «ровно 10 цифр» или «цифры с допустимым разделителем»), удобны регулярные выражения. В тонком и веб-клиенте штатного механизма регулярных выражений нет, поэтому используют COM-объект VBScript.RegExp — он доступен только на Windows-клиенте или Windows-сервере.

Функция ТолькоЦифрыРегулярноеВыражение(Знач Строка) Экспорт

Попытка

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

Исключение

Возврат Неопределено; // COM недоступен — нужен другой способ

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

RegExp.Pattern = "^\d+$"; // строка целиком из цифр

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

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

Шаблон ^\d+$ означает: от начала до конца строки — одна или более цифр. Для строгой длины используйте ^\d{10}$ (ровно 10 цифр) или ^\d{10,12}$ (от 10 до 12).

Способ 4. Проверка через преобразование Число() и её подводные камни

Иногда встречается подход «преобразовать в число и сравнить обратно»: Строка = Строка(Число(Строка)). Этот приём ненадёжен, и вот почему.

  • Функция Число() допускает пробелы, знак минуса, десятичный разделитель и даже экспоненциальную запись. Строка «-12,5» успешно преобразуется, хотя содержит не только цифры.
  • Обратное преобразование теряет ведущие нули: «007» превратится в «7», и сравнение покажет несовпадение — ложное срабатывание для кодов и номеров.
  • Для некорректной строки Число() возвращает 0, и строка «0» становится неотличимой от строки «абв» без дополнительных проверок.

Вывод: для валидации «только цифры» преобразование типов не подходит. Оно уместно только когда нужно дополнительно убедиться, что значение вообще интерпретируется как число, а не проверить состав символов.

Типичные ошибки
01
Проверять через Число() и терять ведущие нули в кодах и штрихкодах — сравнение «007» = «7» даёт ложный отказ
02
Считать пустую строку валидным числом — при записи в базу это приводит к пустым значениям обязательных полей
03
Использовать VBScript.RegExp в серверном коде на Linux — получаете исключение в рабочей базе
04
Забывать про неразрывные пробелы и табуляцию, которые копируются из Excel вместе с номером

Выбор способа под задачу

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

Перебор символов с КодСимвола

Универсальный, работает везде, один проход по строке. Подходит по умолчанию, особенно на сервере и в веб-клиенте

СтрЧислоВхождений

Короткая запись без цикла. Подходит для разовых проверок коротких строк, медленнее при массовой обработке

VBScript.RegExp

Гибкие шаблоны (длина, разделители). Только Windows, требует обработки исключений

Число() с обратным сравнением

Не рекомендуется для проверки состава строки: теряет ведущие нули и пропускает знаки

Для типовых проверок в формах и при загрузке данных берите перебор символов — он предсказуем и не зависит от окружения. Регулярные выражения оправданы, когда условие сложное и гарантированно Windows-окружение, например обработка на компьютере бухгалтера.

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

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

Код выполняется на сервере или в веб-клиентеИспользуйте перебор символов через КодСимвола — COM-объекты там могут быть недоступны
Нужно проверить точную длину (ИНН 10 или 12 цифр)Проверьте СтрДлина отдельно или используйте шаблон ^\d{10}$ в RegExp
Строка приходит из Excel или внешнего файлаСначала очистите её: СокрЛП и замена неразрывного пробела (Символ(160)) на пустую строку
Проверяется поле, где допустимы разделители тысяч или минусПроверка «только цифры» не подходит — валидируйте как число через ОписаниеТипа или попытку преобразования

Подготовка строки перед проверкой

Реальные данные редко бывают чистыми. Пользователь копирует номер из письма или Excel, и вместе с цифрами приходят пробелы, неразрывные пробелы, дефисы и скобки (типично для телефонов). Перед проверкой строку стоит нормализовать.

Функция ПодготовитьСтроку(Знач Строка)

Результат = СокрЛП(Строка);

Результат = СтрЗаменить(Результат, Символ(160), ""); // неразрывный пробел

Результат = СтрЗаменить(Результат, " ", "");

Возврат Результат;

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

Для телефонов дополнительно удаляют «(», «)», «-» и ведущий «+7» или «8». Важно: нормализация меняет данные — решите заранее, сохранять ли в базу очищенное значение или исходное, и оформите это в правилах обработки.

Порядок действий при валидации поля
  1. 1
    Получите строку и примените СокрЛП, удалите неразрывные пробелы Символ(160)
  2. 2
    Проверьте, что строка не пустая после очистки
  3. 3
    Проверьте состав символов функцией перебора или СтрЧислоВхождений
  4. 4
    Проверьте длину, если она регламентирована (ИНН — 10 или 12, ОГРН — 13 или 15)
  5. 5
    При ошибке выведите понятное сообщение с указанием поля и не записывайте некорректное значение

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

После внедрения функции проверьте её на граничных значениях: пустая строка, строка из одних пробелов, строка с ведущими нулями («001234»), очень длинная строка, строка с кириллической «о» вместо нуля и латинской «O» — визуально похожие символы, которые проверка обязана отклонить.

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

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

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

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

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

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

Строка «12 34» с пробелом
Норма

Ложь без очистки, Истина после нормализации — если пробелы допустимы

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

Пробел проходит проверку без явной очистки

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

Истина, ведущие нули сохраняются

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

Ложь — значит используется преобразование через Число()

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

Ложь с понятным сообщением пользователю

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

Истина или необработанная ошибка

Для массовой загрузки (например, при импорте контрагентов) собирайте ошибки в таблицу значений с номером строки и значением поля, а не прерывайте обработку на первой ошибке. Так пользователь исправит все проблемы за одну итерацию.

Итог

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

Надёжная проверка «только цифры» в 1С — перебор символов с КодСимвола: работает везде и не теряет ведущие нули. Перед проверкой очищайте строку от пробелов и неразрывных пробелов, пустую строку считайте ошибкой, а Число() для валидации состава строки не используйте.

Частые вопросы

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

Сначала проверьте длину: СтрДлина(Строка) = 10, затем состав символов любым из способов выше. Для ИНН дополнительно существует контрольное число — проверка контрольной суммы отсекает случайные опечатки, которые формально состоят из цифр.

Почему ведущие нули пропадают при проверке?

Это признак того, что строка преобразуется в число и обратно. Тип «Число» не хранит ведущие нули. Проверяйте состав символов без преобразования типов, и храните коды, штрихкоды и номера в реквизитах строкового типа.

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

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

Работает ли перебор символов на сервере Linux и в веб-клиенте?

Да. КодСимвола, СтрДлина и циклы — часть встроенного языка и исполняются на любой платформе, включая сервер под Linux, веб-клиент и мобильную платформу. Ограничения есть только у COM-объектов вроде VBScript.RegExp.

Как проверить строку в запросе, без кода?

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

Строка пришла из Excel и не проходит проверку, хотя видны только цифры. В чём причина?

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