В процессе разработки в среде 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);
Если вы работаете в современной конфигурации, такой как ERP 2.0, комплексная автоматизация или УТ 11, в вашем распоряжении есть богатый набор функций БСП. Проанализируем общий модуль СтроковыеФункцииКлиентСервер. В нем есть готовая функция СтрокаСодержитПодстроку(), которая возвращает именно логическое значение.
Если СтроковыеФункцииКлиентСервер.СтрокаСодержитПодстроку(N, "текст") Тогда
// Код для выполнения условия
КонецЕсли;
Использование функций БСП делает код более читаемым и стандартизированным для экосистемы 1С.
Иногда проверка на наличие текста требуется не в программном коде над переменной, а непосредственно при выборке данных из базы. В этом случае мы используем оператор ПОДОБНО. Выясним, как правильно составить условие в запросе:
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование ПОДОБНО "%искомый текст%"
В языке запросов символ % является спецсимволом, заменяющим любую последовательность произвольных знаков. Таким образом, конструкция "%текст%" найдет вхождения в любом месте строки.
Рассмотрим ситуацию, когда стандартного вхождения недостаточно. Например, если нужно найти текст по сложному шаблону (наличие цифр, определенный формат e-mail или телефона). В современных версиях платформы (8.3.24+) появились встроенные объекты для работы с регулярными выражениями.
Посмотрим, как это выглядит в коде:
РегВыр = Новый РегулярноеВыражение("текст[0-9]"); // Ищем слово "текст", после которого идет цифра
Если РегВыр.Подобно(СтрокаДляПроверки) Тогда
// Условие выполнено
КонецЕсли;
Для более старых версий платформы под Windows часто используют COM-объект VBScript.RegExp, но встроенные средства платформы работают быстрее и являются кроссплатформенными.
Мы разобрали множество способов проверки текста в строке. Для простых задач в коде идеально подходит СтрНайти(). Если вы цените лаконичность и работаете с БСП — используйте СтрокаСодержитПодстроку(). Для работы с базой данных незаменим оператор ПОДОБНО, а для сложного анализа текста теперь доступны мощные регулярные выражения.