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

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

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

Метод 1: Использование базовых функций поиска Найти и СтрНайти

Самый простой и очевидный способ проверить, содержится ли подстрока или конкретный символ в строке — использовать функцию Найти (или ее более современный аналог СтрНайти; для нечеткого поиска часто применяют алгоритм Левенштейна). Рассмотрим ситуацию, когда нам нужно узнать, есть ли в тексте конкретное сочетание знаков.

Функция возвращает позицию первого найденного знака. Если результат больше нуля, значит, символ найден. Проанализируем пример:


ИсходнаяСтрока = "Артикул-123/45";
Если Найти(ИсходнаяСтрока, "/") > 0 Тогда
    Сообщить("В строке найден символ разделителя '/'");
КонецЕсли;

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


Позиция = СтрНайти(ИсходнаяСтрока, "123");
Если Позиция > 0 Тогда
    // Действия, если подстрока найдена
КонецЕсли;

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

Метод 2: Проверка наличия одного символа из набора (цикл)

Часто задача звучит иначе: нужно проверить, содержит ли строка хотя бы один символ из определенного списка (например, математические знаки "+", "-", "*", "/"). Если мы будем использовать Найти для каждого символа по отдельности, код станет громоздким. Рассмотрим решение через перебор символов самой строки.

Проанализируем ситуацию, когда нам нужно проверить регистрационный номер на наличие недопустимых знаков:


ДопустимыеСимволы = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ТестируемаяСтрока = "ABC-123"; // Здесь дефис недопустим
ЕстьОшибка = Ложь;

Для Поз = 1 По СтрДлина(ТестируемаяСтрока) Цикл
    ТекущийСимвол = Сред(ТестируемаяСтрока, Поз, 1);
    Если Найти(ДопустимыеСимволы, ТекущийСимвол) = 0 Тогда
        ЕстьОшибка = Истина;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если ЕстьОшибка Тогда
    Сообщить("Строка содержит недопустимые символы!");
КонецЕсли;

Метод 3: Использование функции СтрРазделить для поиска набора символов

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

Разберем этот метод на примере поиска спецсимволов:


СимволыПоиска = "+-="; // Ищем любой из этих символов
МассивРезультат = СтрРазделить(ВхСтрока, СимволыПоиска, Ложь);

Если МассивРезультат.Количество() > 1 Тогда
    Сообщить("В строке найден один из символов: " + СимволыПоиска);
КонецЕсли;

Обратите внимание: В старых версиях платформы СтрРазделить воспринимала строку разделителя как единую подстроку. В новых же версиях можно передать строку, и каждый её символ будет считаться отдельным разделителем (при условии корректной настройки параметров).

Метод 4: Логическая проверка через СтрСодержит (Платформа 8.3.20+)

Для тех, кто работает на актуальных версиях платформы, код можно сделать максимально читаемым с помощью функции СтрСодержит. Она возвращает булево значение (Истина или Ложь), что избавляет нас от сравнения с нулем.


Если СтрСодержит(СтрокаДанных, "@") Тогда
    Сообщить("Похоже, это адрес электронной почты");
КонецЕсли;

Метод 5: Использование регулярных выражений (RegExp)

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

Рассмотрим, как это работает:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; // Игнорировать регистр
RegExp.Global = Ложь;       // Нам достаточно одного совпадения
RegExp.Pattern = "[^а-яА-ЯёЁa-zA-Z0-9]"; // Шаблон: любой символ, НЕ являющийся буквой или цифрой

Если RegExp.Test(ТестируемаяСтрока) Тогда
    Сообщить("Найдены спецсимволы или знаки препинания!");
КонецЕсли;

Этот метод является самым мощным, так как позволяет описывать сложные правила поиска одной строкой шаблона.

Метод 6: Инструменты Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация разработана на базе БСП, в вашем распоряжении есть готовый программный интерфейс в общем модуле СтроковыеФункцииКлиентСервер. Использование стандартных функций гарантирует надежность и упрощает поддержку кода.

Рассмотрим полезные функции БСП:

  1. ТолькоЛатиница(Строка) — вернет истину, если в строке только английские буквы.
  2. СодержитТолькоДопустимыеСимволы(Строка, ДопустимыеСимволы) — универсальная проверка по вашему набору.
  3. РазложитьСтрокуВМассивПодстрок(Строка, Разделитель) — аналог СтрРазделить для старых версий платформы.

Метод 7: Проверка специальных (невидимых) символов

Иногда требуется найти символы переноса строки, табуляции или возврата каретки. В 1С для этого используются системные константы. Выясним, как проверить, является ли текст многострочным:


Если Найти(Текст, Символы.ПС) > 0 Тогда
    Сообщить("В тексте есть перенос строки");
КонецЕсли;

Аналогично можно проверять Символы.Таб (табуляция) или Символы.ВК (возврат каретки).

Сводная таблица методов

Подведем итог и выберем оптимальное решение в зависимости от ситуации:

  1. Нужно найти одну конкретную подстроку: Используем СтрНайти.
  2. Нужно проверить наличие хотя бы одного символа из списка: Используем СтрРазделить (с массивом разделителей) или цикл с функцией Сред.
  3. Нужна сложная проверка (маски, диапазоны): Используем RegExp.
  4. Нужна максимальная чистота кода (8.3.20+): Используем СтрСодержит.
  5. Нужна высокая производительность на огромных объемах: Найти остается одним из самых быстрых методов.

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

← На главную