Как проверить наличие текста в строке в 1С: подробное руководство

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

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

Использование встроенных функций платформы

Самый простой и быстрый способ проверить наличие текста — использовать встроенные функции платформы. Рассмотрим два основных варианта: классическую функцию Найти() и более современную СтрНайти().

Функция Найти() возвращает позицию первого знака найденной подстроки. Если текст не найден, функция возвращает 0. Разберем пример реализации:


// Переменная N содержит исходный текст
N = "Проверка наличия текста в ERP УП 2.0";
ИскомыйТекст = "текста";

Если Найти(N, ИскомыйТекст) > 0 Тогда
    // Условие выполнится, если текст найден
    Сообщить("Текст найден!");
КонецЕсли;

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


Если СтрНайти(N, "некий текст") > 0 Тогда
    // Выполнить определенное условие
КонецЕсли;

Как получить результат в формате «Да» или «Нет»

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


Функция СтрокаСодержитТекст(ИсходнаяСтрока, Подстрока)
    Возврат СтрНайти(ИсходнаяСтрока, Подстрока) <> 0;
КонецФункции

// Пример вызова:
Если СтрокаСодержитТекст(N, "искомый текст") Тогда
    // Действие
КонецЕсли;

Важно помнить, что в 1С, в отличие от некоторых других языков программирования, отсутствует неявное приведение типов в операторе Если. Мы не можем написать Если СтрНайти(Строка, Подстрока) Тогда, так как это вызовет ошибку несовпадения типов (число и булево). Сравнение с нулем обязательно.

Учет регистра при поиске

Разберем важный нюанс: функции Найти() и СтрНайти() чувствительны к регистру. Это означает, что слово «Текст» не будет найдено, если мы ищем «текст». Чтобы сделать поиск регистронезависимым, проанализируем следующий прием — приведение обеих строк к одному регистру (например, к верхнему) с помощью функции ВРег().


ИсходнаяСтрока = "Система ERP";
ПоисковыйЗапрос = "erp";

Если СтрНайти(ВРег(ИсходнаяСтрока), ВРег(ПоисковыйЗапрос)) > 0 Тогда
    // Теперь поиск сработает, так как оба значения станут "СИСТЕМА ERP" и "ERP"
КонецЕсли;

Расширенные возможности функции СтрНайти

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

  1. Направление поиска: Мы можем искать не только с начала строки, но и с конца, используя системное перечисление НаправлениеПоиска.СКонца.
  2. Начальная позиция: Можно указать номер символа, с которого начнется поиск. Это полезно, если нужно пропустить заголовок или начало строки.
  3. Номер вхождения: Мы можем найти не первое, а, например, второе или третье вхождение подстроки.

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


ПозицияВторогоВхождения = СтрНайти(СтрокаДляПоиска, "текст", НаправлениеПоиска.СНачала, 1, 2);

Использование функций Библиотеки стандартных подсистем (БСП)

Если вы работаете в современной конфигурации, такой как ERP 2.0, комплексная автоматизация или УТ 11, в вашем распоряжении есть богатый набор функций БСП. Проанализируем общий модуль СтроковыеФункцииКлиентСервер. В нем есть готовая функция СтрокаСодержитПодстроку(), которая возвращает именно логическое значение.


Если СтроковыеФункцииКлиентСервер.СтрокаСодержитПодстроку(N, "текст") Тогда
    // Код для выполнения условия
КонецЕсли;

Использование функций БСП делает код более читаемым и стандартизированным для экосистемы 1С.

Поиск текста в запросах

Иногда проверка на наличие текста требуется не в программном коде над переменной, а непосредственно при выборке данных из базы. В этом случае мы используем оператор ПОДОБНО. Выясним, как правильно составить условие в запросе:


ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "%искомый текст%"

В языке запросов символ % является спецсимволом, заменяющим любую последовательность произвольных знаков. Таким образом, конструкция "%текст%" найдет вхождения в любом месте строки.

Сложный поиск с помощью регулярных выражений

Рассмотрим ситуацию, когда стандартного вхождения недостаточно. Например, если нужно найти текст по сложному шаблону (наличие цифр, определенный формат e-mail или телефона). В современных версиях платформы (8.3.24+) появились встроенные объекты для работы с регулярными выражениями.

Посмотрим, как это выглядит в коде:


РегВыр = Новый РегулярноеВыражение("текст[0-9]"); // Ищем слово "текст", после которого идет цифра
Если РегВыр.Подобно(СтрокаДляПроверки) Тогда
    // Условие выполнено
КонецЕсли;

Для более старых версий платформы под Windows часто используют COM-объект VBScript.RegExp, но встроенные средства платформы работают быстрее и являются кроссплатформенными.

Итоги

Мы разобрали множество способов проверки текста в строке. Для простых задач в коде идеально подходит СтрНайти(). Если вы цените лаконичность и работаете с БСП — используйте СтрокаСодержитПодстроку(). Для работы с базой данных незаменим оператор ПОДОБНО, а для сложного анализа текста теперь доступны мощные регулярные выражения.

← На главную