В работе с 1С:Предприятие часто возникает задача валидации данных — например, когда нужно убедиться, что пользователь ввёл именно цифру, а не букву или спецсимвол. Ошибки на этом этапе могут привести к сбоям в расчётах, неправильному формированию документов или даже падению системы при обработке больших массивов данных. Особенно критично это для бухгалтерских и складских модулей, где цифровые значения напрямую влияют на финансовые операции.
В этой статье разберём все возможные способы проверки символа на цифру в 1С 8.3 и 8.2 — от стандартных функций встроенного языка до регулярных выражений и низкоуровневых приёмов. Каждый метод проиллюстрирован практическим примером, а в конце вы найдёте сравнительную таблицу по производительности и удобству применения. Если вы разрабатываете обработки для загрузки данных из Excel, парсите текстовые файлы или валидируете ввод пользователя — эти техники сэкономят вам часы отладки.
1. Стандартная функция ТипЗнч(): простой, но ограниченный подход
Самый очевидный способ — использовать встроенную функцию ТипЗнч(). Она возвращает тип значения, что позволяет косвенно определить, является ли символ цифрой. Однако у этого метода есть серьёзные ограничения.
Пример кода для проверки одного символа:
Символ = "5";
Если ТипЗнч(Вал(Символ)) = Тип("Число") Тогда
Сообщить("Это цифра!");
Иначе
Сообщить("Это НЕ цифра!");
КонецЕсли;
- ✅ Плюсы: не требует дополнительных библиотек, работает во всех версиях 1С.
- ❌ Минусы:
- 🔹 Не отличает цифру
"0"от пустой строки (оба приводятся к числу0). - 🔹 Ломается на символах с пробелами или неразрывными пробелами (
НПП). - 🔹 Медленнее специализированных функций при массовой обработке.
- 🔹 Не отличает цифру
⚠️ Внимание: ФункцияВал()автоматически обрезает пробелы в начале и конце строки. Если вам нужно проверить символ с пробелами (например, в данных из Excel), используйтеСокрЛП(Символ)перед проверкой.
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С сталкиваются с подводными камнями при проверке символов. Вот самые распространённые ошибки и способы их предотвращения:
-
Пустые строки и
NULL.Функция
Вал("")возвращает0, из-за чего пустая строка ошибочно распознаётся как цифра. Всегда добавляйте проверку:Если ПустаяСтрока(Символ) ТогдаВозврат Ложь;
КонецЕсли;
-
Невидимые символы.
В данных из Excel или XML могут встречаться неразрывные пробелы (
НПП, код160) или символы табуляции. ИспользуйтеСокрЛП()или проверку по коду. -
Локаль-зависимые цифры.
В некоторых странах (например, в арабских) используются местные цифры, которые
Вал()не распознаёт. Для таких случаев подойдёт только регулярное выражение с\p{N}.
⚠️ Внимание: Если вы работаете с данными из внешних источников (например, загружаете прайс-листы поставщиков), всегда тестируйте валидацию на реальных файлах. Часто в них встречаются "мусорные" символы, которые ломают стандартные проверки.
Удалить пробелы (СокрЛП())|Проверить на пустую строку|Использовать метод, поддерживающий юникод (если нужно)|Тестировать на реальных данных-->
6. Практическое применение: примеры из реальных задач
Рассмотрим, как проверка символов применяется в типовых сценариях работы с 1С:
📄 Валидация номера документа
При загрузке документов из Excel или PDF часто нужно убедиться, что номер содержит только цифры и разделители (например, "123-45/2026"). Решение:
РегВыр = Новый РегулярноеВыражение("^\d[-/]?\d+$");
Если НЕ РегВыр.Тест(НомерДокумента) Тогда
Сообщить("Некорректный формат номера!");
КонецЕсли;
👤 Проверка ИНН при вводе
ИНН может содержать только цифры (10 или 12 знаков). Используем комбинированный подход:
Функция ПроверитьИНН(Значение)
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
Возврат Ложь;
КонецЕсли;
Значение = СокрЛП(Значение);
Если Длина(Значение) <> 10 И Длина(Значение) <> 12 Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого Симв Из Значение Цикл
Если КодСимвола(Симв) < 48 Или КодСимвола(Симв) > 57 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции;
📊 Парсинг CSV-файлов
При загрузке данных из CSV часто встречаются ячейки с "мусором" (например, "N/A" вместо числа). Фильтруем их так:
Если НЕ ЭтоЦифра(Строка[1]) И Строка[1] <> "" Тогда
Продолжить; // Пропускаем некорректные строки
КонецЕсли;
Для массовой обработки данных (тысячи строк) отдавайте предпочтение методу КодСимвола() — он работает в 5–10 раз быстрее регулярных выражений и функций Найти().
7. Сравнение методов: что выбрать для вашей задачи
Выбор способа проверки зависит от трёх факторов:
- Производительность. Для обработки больших объёмов данных (например, при загрузке справочников) используйте
КодСимвола()илиНайти(). - Точность. Если нужна поддержка юникода или сложные шаблоны (например, для ИНН с разделителями), берите
РегулярноеВыражение. - Совместимость. Для старых версий 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.