При разработке конфигураций и форм ввода часто возникает задача проверки корректности введенных данных, таких как номера телефонов, артикулы, серии документов или коды контрактов. Главная цель такой проверки — убедиться, что строка содержит только цифры или строго определенный набор разрешенных символов (например, знак + в начале телефонного номера).
Рассмотрим несколько эффективных способов решения этой задачи в 1С: от посимвольной обработки до использования стандартных функций Библиотеки стандартных подсистем (БСП).
Наиболее наглядный и гибкий метод посимвольной проверки заключается в формировании строки с разрешенными символами и последующем обходе проверяемого текста в цикле с использованием функции СтрНайти (или Найти в старых версиях платформ).
Разберем по шагам, как реализовать такой алгоритм:
"0123456789").СтрДлина.Сред извлечем текущий символ и проверим его наличие в строке допустимых символов.Посмотрим на пример кода:
ДопустимыеСимволы = "0123456789";
Корректно = Истина;
Для Сч = 1 По СтрДлина(ПолеПроверки) Цикл
Символ = Сред(ПолеПроверки, Сч, 1);
Если СтрНайти(ДопустимыеСимволы, Символ) = 0 Тогда
Корректно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Корректно Тогда
Сообщить("Обнаружены недопустимые символы! Строка должна содержать только цифры.");
КонецЕсли;
В платформе 1С строки можно сравнивать так же, как и числа. Символы лежат в стандартной кодировке, поэтому для проверки того, является ли символ цифрой, достаточно сравнить его с границами "0" и "9".
Важно: При сравнении строк значения обязательно должны быть заключены в кавычки, чтобы платформа 1С сравнивала их именно как строковые типы данных, а не числа.
Проанализируем пример проверки, учитывающий специальный символ + на первой позиции (например, для международных номеров телефонов):
ДлинаСтроки = СтрДлина(Поле1);
СтрокаКорректна = Истина;
Для Сч = 1 По ДлинаСтроки Цикл
ТекСимвол = Сред(Поле1, Сч, 1);
// Первый символ может быть плюсом или цифрой
Если Сч = 1 И ТекСимвол = "+" Тогда
Продолжить;
КонецЕсли;
// Проверяем, входит ли символ в диапазон от "0" до "9"
Если НЕ (ТекСимвол >= "0" И ТекСимвол <= "9") Тогда
СтрокаКорректна = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ СтрокаКорректна Тогда
Сообщить("Поле должно содержать номер формата +7XXXXXXXXXX или только цифры!");
КонецЕсли;
Если требуется проверить строку без использования циклов посимвольного перебора, можно применить метод последовательного удаления допустимых символов из копии исходной строки с помощью СтрЗаменить. Если после удаления всех цифр длина оставшейся строки больше нуля, значит, в тексте присутствуют посторонние знаки или буквы.
Рассмотрим пример этого подхода:
ПроверочнаяСтрока = Поле1;
// Если допустим плюс в начале, уберем его
Если СтрНачинаетсяС(ПроверочнаяСтрока, "+") Тогда
ПроверочнаяСтрока = Сред(ПроверочнаяСтрока, 2);
КонецЕсли;
// Убираем все цифры
Для Цифра = 0 По 9 Цикл
ПроверочнаяСтрока = СтрЗаменить(ПроверочнаяСтрока, Строка(Цифра), "");
КонецЦикла;
// Если что-то осталось, значит были сторонние символы
Если СтрДлина(ПроверочнаяСтрока) > 0 Тогда
Сообщить("Введены недопустимые символы: " + ПроверочнаяСтрока);
КонецЕсли;
Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), вам не нужно писать собственные циклы проверки. В типовых решениях уже есть готовые клиенто-серверные функции.
Для проверки на наличие только цифр подходит функция:
ТолькоЦифры = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Поле1, Истина);
Если НЕ ТолькоЦифры Тогда
Сообщить("Строка должна состоять исключительно из цифр!");
КонецЕсли;
Для полноценной работы с номерами телефонов в БСП предусмотрена подсистема УправлениеКонтактнойИнформацией, которая умеет автоматически валидировать и разлагать номер на код страны, код города и основной номер.
Интерактивно ограничить ввод пользователя можно через свойство Маска у элемента формы (например, задав значение +7 999 999 99 99). Однако важно помнить о следующих нюансах: