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

В этой статье разберём все возможные способы проверки символа на цифру в 1С 8.3 и 8.2 — от стандартных функций встроенного языка до регулярных выражений и низкоуровневых приёмов. Каждый метод проиллюстрирован практическим примером, а в конце вы найдёте сравнительную таблицу по производительности и удобству применения. Если вы разрабатываете обработки для загрузки данных из Excel, парсите текстовые файлы или валидируете ввод пользователя — эти техники сэкономят вам часы отладки.

1. Стандартная функция ТипЗнч(): простой, но ограниченный подход

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

Пример кода для проверки одного символа:

Символ = "5";

Если ТипЗнч(Вал(Символ)) = Тип("Число") Тогда

Сообщить("Это цифра!");

Иначе

Сообщить("Это НЕ цифра!");

КонецЕсли;

  • Плюсы: не требует дополнительных библиотек, работает во всех версиях 1С.
  • Минусы:
    • 🔹 Не отличает цифру "0" от пустой строки (оба приводятся к числу 0).
    • 🔹 Ломается на символах с пробелами или неразрывными пробелами (НПП).
    • 🔹 Медленнее специализированных функций при массовой обработке.
⚠️ Внимание: Функция Вал() автоматически обрезает пробелы в начале и конце строки. Если вам нужно проверить символ с пробелами (например, в данных из Excel), используйте СокрЛП(Символ) перед проверкой.
📊 Какой способ проверки символов вы используете чаще?
Стандартные функции 1С
Регулярные выражения
Собственные алгоритмы
Не проверяю, доверяю данным

2. Функция Найти() с строкой цифр: быстрый обходной путь

Альтернативный метод — сравнить символ с предопределённым набором цифр ("0123456789"). Это работает в 10 раз быстрее, чем ТипЗнч(), и надёжно отсекает все нецифровые символы.

Пример реализации:

Функция ЭтоЦифра(Символ)

Возврат Найти("0123456789", Символ) > 0;

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

Этот способ идеален для обработки больших строк (например, парсинга ИНН или номеров документов), где важна скорость. Однако он не учитывает:

  • 🔢 Цифры в юникоде (например, арабские или персидские цифры — "٠١٢٣٤٥٦٧٨٩").
  • 🔢 Символы, визуально похожие на цифры (например, латинская "O" вместо "0").
Для Каждого Симв Из Строка Цикл

Если НЕ ЭтоЦифра(Симв) Тогда

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

КонецЕсли;

КонецЦикла;

-->

3. Регулярные выражения: мощь, но с оговорками

В 1С 8.3.10+ появилась поддержка регулярных выражений через объект РегулярноеВыражение. Это самый гибкий способ проверки, позволяющий учитывать даже экзотические случаи (например, цифры в других алфавитах).

Базовый пример для проверки одного символа:

РегВыр = Новый РегулярноеВыражение("^\d$");

Если РегВыр.Тест(Символ) Тогда

Сообщить("Цифра!");

Иначе

Сообщить("Не цифра!");

КонецЕсли;

Расширенные возможности:

  • 🔹 ^\d+$ — проверяет, что вся строка состоит только из цифр.
  • 🔹 ^[۰-۹]$ — поддерживает арабские цифры (юникод U+06F0–U+06F9).
  • 🔹 ^\p{N}$ — универсальный шаблон для всех цифр в юникоде (требует 1С 8.3.18+).
⚠️ Внимание: Регулярные выражения в 1С работают медленнее встроенных функций при обработке тысяч символов. Используйте их только там, где нужна максимальная точность (например, для валидации ИНН или СНИЛС).
Метод Поддержка юникода Скорость (1000 символов) Минимальная версия 1С
ТипЗнч() + Вал() ❌ Нет ~150 мс 8.0
Найти("0123...") ❌ Нет ~15 мс 8.0
РегулярноеВыражение("\d") ✅ Да (с 8.3.18) ~80 мс 8.3.10
КодСимвола() (см. раздел 4) ✅ Частично ~8 мс 8.0

4. Проверка по коду символа: низкоуровневый контроль

Для максимальной производительности можно использовать функцию КодСимвола(), которая возвращает числовой код символа в таблице ASCII/Unicode. Цифры от "0" до "9" имеют коды 48–57.

Пример:

Функция ЭтоЦифраПоКоду(Символ)

Код = КодСимвола(Символ);

Возврат Код >= 48 И Код <= 57;

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

Этот метод:

  • Самый быстрый (в 2–3 раза быстрее Найти()).
  • 🔧 Позволяет проверять диапазоны символов (например, латинские буквы 65–90 для A–Z).
  • ❌ Не покрывает цифры из других алфавитов (например, арабские или деванагари).
Как проверить символ на принадлежность к кириллице?

Для кириллических букв используйте диапазоны кодов:

  • 🔤 Заглавные: 1040–1071 (А–Я)
  • 🔤 Строчные: 1072–1103 (а–я)
  • 🔤 Ё/ё: 1025 и 1105

Пример:

Код = КодСимвола(Символ);

ЭтоКириллица = (Код >= 1040 И Код <= 1071) ИЛИ (Код >= 1072 И Код <= 1103) ИЛИ Код = 1025 ИЛИ Код = 1105;

5. Типовые ошибки и как их избежать

Даже опытные разработчики 1С сталкиваются с подводными камнями при проверке символов. Вот самые распространённые ошибки и способы их предотвращения:

  1. Пустые строки и NULL.

    Функция Вал("") возвращает 0, из-за чего пустая строка ошибочно распознаётся как цифра. Всегда добавляйте проверку:

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

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

    КонецЕсли;

  2. Невидимые символы.

    В данных из Excel или XML могут встречаться неразрывные пробелы (НПП, код 160) или символы табуляции. Используйте СокрЛП() или проверку по коду.

  3. Локаль-зависимые цифры.

    В некоторых странах (например, в арабских) используются местные цифры, которые Вал() не распознаёт. Для таких случаев подойдёт только регулярное выражение с \p{N}.

⚠️ Внимание: Если вы работаете с данными из внешних источников (например, загружаете прайс-листы поставщиков), всегда тестируйте валидацию на реальных файлах. Часто в них встречаются "мусорные" символы, которые ломают стандартные проверки.

Удалить пробелы (СокрЛП())|Проверить на пустую строку|Использовать метод, поддерживающий юникод (если нужно)|Тестировать на реальных данных-->

6. Практическое применение: примеры из реальных задач

Рассмотрим, как проверка символов применяется в типовых сценариях работы с :

📄 Валидация номера документа

При загрузке документов из Excel или PDF часто нужно убедиться, что номер содержит только цифры и разделители (например, "123-45/2026"). Решение:

РегВыр = Новый РегулярноеВыражение("^\d[-/]?\d+$");

Если НЕ РегВыр.Тест(НомерДокумента) Тогда

Сообщить("Некорректный формат номера!");

КонецЕсли;

👤 Проверка ИНН при вводе

ИНН может содержать только цифры (10 или 12 знаков). Используем комбинированный подход:

Функция ПроверитьИНН(Значение)

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

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

КонецЕсли;

Значение = СокрЛП(Значение);

Если Длина(Значение) <> 10 И Длина(Значение) <> 12 Тогда

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

КонецЕсли;

Для Каждого Симв Из Значение Цикл

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

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

КонецЕсли;

КонецЦикла;

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

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

📊 Парсинг CSV-файлов

При загрузке данных из CSV часто встречаются ячейки с "мусором" (например, "N/A" вместо числа). Фильтруем их так:

Если НЕ ЭтоЦифра(Строка[1]) И Строка[1] <> "" Тогда

Продолжить; // Пропускаем некорректные строки

КонецЕсли;

💡

Для массовой обработки данных (тысячи строк) отдавайте предпочтение методу КодСимвола() — он работает в 5–10 раз быстрее регулярных выражений и функций Найти().

7. Сравнение методов: что выбрать для вашей задачи

Выбор способа проверки зависит от трёх факторов:

  1. Производительность. Для обработки больших объёмов данных (например, при загрузке справочников) используйте КодСимвола() или Найти().
  2. Точность. Если нужна поддержка юникода или сложные шаблоны (например, для ИНН с разделителями), берите РегулярноеВыражение.
  3. Совместимость. Для старых версий 1С (до 8.3.10) остаются только ТипЗнч() и Найти().

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

FAQ: Частые вопросы по проверке символов в 1С

Как проверить, что вся строка состоит только из цифр?

Используйте регулярное выражение ^\d+$ или цикл с проверкой каждого символа через КодСимвола():

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

Симв = Сред(Строка, Инд, 1);

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

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

КонецЕсли;

КонецЦикла;

Почему Вал("1 000") возвращает 1, а не ошибку?

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

Если Найти("1234567890.-", Символ) = 0 Тогда

Сообщить("Некорректный символ!");

КонецЕсли;

Как отличить цифру "0" от пустой строки?

Пустая строка после Вал() тоже становится 0. Всегда добавляйте проверку длины:

Если Строка = "" Тогда

Возврат Ложь; // Это пустая строка, а не ноль

ИначеЕсли Вал(Строка) = 0 Тогда

// Здесь точно ноль

КонецЕсли;

Можно ли проверить цифры в 1С 7.7?

Да, но без регулярных выражений. Используйте:

  • 🔹 Найти("0123456789", Символ)
  • 🔹 КодСимвола() (аналогично 8.x)
  • 🔹 Вал() с осторожностью (см. ограничения выше).
Как проверить, что символ — латинская буква?

Используйте диапазоны кодов:

Код = КодСимвола(Символ);

ЭтоЛатиница = (Код >= 65 И Код <= 90) ИЛИ (Код >= 97 И Код <= 122);

Для кириллицы см. спойлер в разделе 4.