Как проверить наличие цифр или нескольких символов в строке 1С: эффективные методы и примеры

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Способ 1. Классический перебор цифр в цикле

Начнем с самого простого и понятного метода, который упоминается в обсуждении. Если нам нужно узнать, есть ли в тексте хотя бы одна цифра, мы можем просто запустить цикл по эталонным символам (от 0 до 9) и проверить их вхождение с помощью функции Найти().

Разберем пример кода для этого метода:


ЦифраЕсть = Ложь;
Для Счетчик = 0 По 9 Цикл
    Если Найти(Текст, Строка(Счетчик)) > 0 Тогда
        ЦифраЕсть = Истина;
        Прервать; // Выходим из цикла, как только нашли первое совпадение
    КонецЕсли;
КонецЦикла;

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

Способ 2. Проверка кодов символов в строке

Рассмотрим более производительный вариант. Вместо того чтобы искать 10 разных подстрок во всем тексте, мы можем один раз пройти по всей строке и проверить код каждого символа. Нам известно, что в кодировке Unicode цифры от 0 до 9 имеют последовательные коды с 48 по 57.

Проанализируем реализацию этого подхода:


Функция СодержитЦифры(Текст) Экспорт
    Для Позиция = 1 По СтрДлина(Текст) Цикл
        Код = КодСимвола(Сред(Текст, Позиция, 1));
        // Код 48 соответствует "0", код 57 соответствует "9"
        Если Код >= 48 И Код <= 57 Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
    Возврат Ложь;
КонецФункции

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

Способ 3. Использование языка запросов и оператора ПОДОБНО

Интересный и лаконичный способ — использование возможностей языка запросов. Оператор ПОДОБНО поддерживает работу с диапазонами символов в квадратных скобках. Это позволяет написать проверку буквально одной строкой.

Выясним, как это реализовать:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   &Текст ПОДОБНО ""%[0-9]%"" КАК ЕстьЦифры";
Запрос.УстановитьПараметр("Текст", ИсходнаяСтрока);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
    ЦифраЕсть = Результат.ЕстьЦифры;
КонецЕсли;

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

Способ 4. Регулярные выражения (RegExp)

Регулярные выражения — это стандарт индустрии для работы с текстом. В 1С нет встроенного объекта для RegExp, но в среде Windows мы можем использовать COM-объект VBScript.RegExp. Вопреки опасениям некоторых разработчиков, это не "внешняя компонента", которую нужно устанавливать отдельно, — это часть операционной системы.

Разберем по шагам создание функции проверки:


// Создаем объект регулярного выражения
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; // Игнорировать регистр
RegExp.Global = Ложь;       // Нам достаточно первого нахождения
RegExp.Pattern = "\d";      // Шаблон \d означает любую цифру

Если RegExp.Test(Текст) Тогда
    Сообщить("В строке есть цифры");
КонецЕсли;

Этот метод является самым мощным. Если завтра задача усложнится (например, нужно будет найти не просто цифру, а три цифры подряд, разделенные дефисом), вам достаточно будет просто изменить строку Pattern, не переписывая алгоритм.

Способ 5. Использование функции СтрРазделить (для платформы 8.3.6+)

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

Посмотрим на пример:


Цифры = "0123456789";
МассивЧастей = СтрРазделить(Текст, Цифры, Ложь);
Если МассивЧастей.Количество() > 1 Тогда
    // В тексте были цифры, так как строка была разделена
КонецЕсли;

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

Способ 6. Метод исключения через СтрЗаменить

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

Проанализируем ситуацию на примере:


ВременнаяСтрока = Текст;
Для Счетчик = 0 По 9 Цикл
    ВременнаяСтрока = СтрЗаменить(ВременнаяСтрока, Строка(Счетчик), "");
КонецЦикла;

Если СтрДлина(ВременнаяСтрока) <> СтрДлина(Текст) Тогда
    Сообщить("Цифры найдены!");
КонецЕсли;

Этот метод хорош тем, что количество итераций цикла всегда фиксировано (ровно 10), независимо от длины строки. Для очень длинных текстов, где цифры встречаются редко, это может работать быстрее, чем посимвольный перебор.

Подведение итогов: что выбрать?

Рассмотрев все варианты, мы можем сделать следующие выводы:

  1. Для простых задач и универсальности: используйте обычный цикл с КодСимвола(). Это быстро, надежно и не зависит от ОС или сервера БД.
  2. Для сложной валидации (email, телефоны, маски): лучше один раз разобраться в VBScript.RegExp.
  3. Для массовой проверки данных в запросах: используйте оператор ПОДОБНО "%[0-9]%".
  4. Для быстрого написания "на коленке": подойдет метод с 10-кратным СтрЗаменить() или Найти().

Помните, что при работе с большими объемами данных в цикле стоит отдавать предпочтение методам, которые минимизируют создание новых строк и обращение к тяжелым объектам. Надеемся, этот разбор поможет вам выбрать наиболее эффективное решение для вашей задачи!

← На главную