Работа со строковыми данными — одна из самых частых задач в практике программиста 1С. Будь то разбор комментария в платежном поручении, поиск артикула в наименовании или извлечение даты из текстового сообщения, нам необходимо владеть инструментами эффективного поиска. В этой статье мы подробно разберем современные и классические методы работы со строками, доступные в платформе 8.3, а также узнаем, как реализовать расширенный поиск объекта в базе 1С по части строки — для этого подойдёт умный поиск по фрагментам слов в 1С.
Для начала проанализируем самый простой сценарий: нам нужно найти позицию конкретного слова или фразы. В старых релизах платформы активно использовалась функция Найти, которая до сих пор сохранена для обратной совместимости. Однако, согласно современным стандартам разработки, мы рекомендуем использовать функцию СтрНайти.
Рассмотрим преимущества СтрНайти перед старой функцией Найти:
Посмотрим на пример, как найти вхождение слова и извлечь текст после него:
ИсходнаяСтрока = "Привет, сегодня 1 января 2030 года";
ИскомоеСлово = "сегодня";
Позиция = СтрНайти(ИсходнаяСтрока, ИскомоеСлово);
Если Позиция > 0 Тогда
// Извлекаем текст, начиная с найденной позиции
Результат = Сред(ИсходнаяСтрока, Позиция);
// Результат: "сегодня 1 января 2030 года"
КонецЕсли;
Выясним причину, почему этот метод может не подойти для сложных задач. Он требует точного совпадения подстроки. Если вам нужно учитывать опечатки или схожесть слов, лучше использовать улучшенный алгоритм Левенштейна для 1С, который позволяет выполнять интеллектуальное сравнение строк — для этого подойдёт обработка поиска дублей с нечетким сравнением.
Начиная с релизов платформы 8.3.23 и выше, в 1С появился встроенный механизм работы с регулярными выражениями. Это кардинально меняет подход к разбору сложных строк. Рассмотрим ситуацию, когда нам нужно извлечь фрагмент "сегодня 1 января", где число и месяц могут меняться.
Проанализируем пример кода, использующий функцию СтрНайтиПоРегулярномуВыражению. Этот метод позволяет найти текст, соответствующий определенному шаблону. Чтобы быстро проверить свои паттерны, можно запустить тестирование регулярных выражений на 1С в специальной обработке.
Текст = "Привет, сегодня 1 января 2030 года";
// Шаблон: слово "сегодня", пробел, цифры (день), пробел, буквы (месяц)
Шаблон = "сегодня\s\d{1,2}\s[а-яё]+";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, Шаблон, ИзменениеРегистра.БезУчетаРегистра);
Если РезультатПоиска <> Неопределено Тогда
НужнаяПодстрока = РезультатПоиска.Значение;
Сообщить(НужнаяПодстрока); // Выведет: "сегодня 1 января"
КонецЕсли;
Важный момент: регулярные выражения позволяют не просто найти текст, но и выделить в нем группы. Это крайне полезно, если выполняется сложная расшифровка битых ссылок из текста или когда нужно преобразовать текстовую дату в объект типа Дата.
Давайте разберем более сложный пример, который часто встречается при парсинге банковских выписок или логов — здесь поможет разбор банковской выписки по регулярным выражениям. Предположим, у нас есть строки с разными датами, и нам нужно получить из них полноценную дату 1С. Для этого мы создадим структуру соответствия месяцев их номерам и воспользуемся поиском по регулярному выражению.
&НаСервере
Функция ПолучитьДатуИзСтроки(Знач ВходнаяСтрока)
// Подготовим таблицу соответствия месяцев
Месяцы = Новый Структура;
Месяцы.Вставить("января", 1);
Месяцы.Вставить("февраля", 2);
Месяцы.Вставить("марта", 3);
// ... и так далее для всех месяцев
// Регулярное выражение для поиска: Число + Название месяца + Год
Шаблон = "(\d{1,2})\s+(января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)\s+(\d{4})";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ВходнаяСтрока, Шаблон);
Если РезультатПоиска = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// Получаем группы захвата (части строки, попавшие в скобки шаблона)
Группы = РезультатПоиска.ПолучитьГруппы();
День = Число(Группы[0].Значение);
МесяцТекст = НРег(Группы[1].Значение);
Год = Число(Группы[2].Значение);
НомерМесяца = 0;
Если Месяцы.Свойство(МесяцТекст, НомерМесяца) Тогда
Возврат Дата(Год, НомерМесяца, День);
КонецЕсли;
Возврат Неопределено;
КонецФункции
В данном примере мы использовали объект РезультатПоискаПоРегулярномуВыражению и его метод ПолучитьГруппы(). Это позволяет нам обращаться к отдельным частям найденного шаблона по индексам.
Если вы работаете в современной конфигурации, такой как "Бухгалтерия предприятия 3.0" или "ERP", вам доступны функции Библиотеки стандартных подсистем (БСП). Проанализируем возможности общего модуля СтроковыеФункцииКлиентСервер. Изучить их все поможет подробный справочник по методам БСП с примерами использования.
Часто задачу поиска можно решить простым разделением строки на массив слов. Рассмотрим, как это сделать:
СтрокаДляОбработки = "Привет, сегодня 1 января 2030 года";
// Разделяем строку по пробелам, удаляя лишние символы
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаДляОбработки, " ");
// Теперь мы можем обращаться к элементам по индексу
// МассивСлов[2] будет содержать "1"
// МассивСлов[3] будет содержать "января"
Этот метод наиболее производителен, если структура строки строго определена. Также на базе подобных алгоритмов часто реализуется подсчет количества слов в тексте для анализа содержимого. Мы рекомендуем использовать встроенные функции БСП при обработке больших массивов данных, так как регулярные выражения работают медленнее.
Выясним, какой инструмент выбрать в зависимости от ситуации:
СтрНайти.СтрПодобно.СтрНайтиПоРегулярномуВыражению.СтрЗаменитьПоРегулярномуВыражению.Помните о регистре символов! Функции СтрНайти и Найти чувствительны к регистру. Чтобы поиск был надежным, всегда приводите сравниваемые строки к одному регистру с помощью функций ВРег() или НРег().
Таким образом, мы рассмотрели весь спектр инструментов для работы с подстроками в 1С. Комбинируя эти методы, вы сможете решить практически любую задачу по парсингу и обработке текстовой информации.