Как в 1С извлечь текст, находящийся между заданными символами-разделителями

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

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

Способ 1. Использование метода СтрРазделить

Начиная с версии платформы 8.3.6, разработчикам стал доступен крайне удобный метод СтрРазделить. Этот метод разбивает исходную строку на массив подстрок, используя указанный разделитель. Проанализируем ситуацию, когда искомый текст находится внутри одной пары звездочек.

Если мы имеем строку вида "Префикс *Нужный текст* Суффикс" и разделим ее по символу *, то получим массив из трех элементов:

  1. Элемент с индексом [0]: Текст до первой звездочки ("Префикс ").
  2. Элемент с индексом [1]: Текст между первой и второй звездочкой (наш целевой текст).
  3. Элемент с индексом [2]: Текст после второй звездочки (" Суффикс").

Рассмотрим пример кода, который был признан наиболее эффективным в обсуждении:


ТекстИсточник = "Слово слово слово .. слово *То что надо выделить* слово слово";
МассивЧастей = СтрРазделить(ТекстИсточник, "*");

// Проверяем, что в строке было как минимум две звездочки (массив содержит 3+ элемента)
Если МассивЧастей.Количество() >= 3 Тогда
    Результат = МассивЧастей[1];
    Сообщить(Результат);
КонецЕсли;

Важный нюанс: всегда следует проверять количество элементов в полученном массиве. Если в исходной строке не окажется разделителей или будет только одна звездочка, обращение к индексу [1] вызовет фатальную ошибку выполнения программы «Индекс находится за границами массива».

Способ 2. Классический метод через СтрНайти и Сред

Если вы работаете на старых версиях платформы или хотите избежать создания массива (что может быть критично при обработке огромных объемов данных в цикле), целесообразно использовать функции поиска позиций. Этот метод считается «классическим» и работает максимально быстро. Для расширения возможностей стандартных строковых алгоритмов можно использовать набор методов для работы со строками в 1С.

Разберем алгоритм по шагам:

  1. Находим позицию первого вхождения символа *.
  2. Находим позицию второго вхождения символа *, начиная поиск со следующей позиции после первого вхождения.
  3. Вычисляем длину искомой подстроки и извлекаем ее с помощью функции Сред.

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


Текст = "Слово слово *искомое* слово";
СимволРазделитель = "*";

Поз1 = СтрНайти(Текст, СимволРазделитель);
Если Поз1 > 0 Тогда
    // Ищем вторую звездочку, начиная со следующего символа
    Поз2 = СтрНайти(Текст, СимволРазделитель, , Поз1 + 1);
    
    Если Поз2 > 0 Тогда
        // Длина текста — это разница позиций минус единица
        ДлинаТекста = Поз2 - Поз1 - 1;
        Результат = Сред(Текст, Поз1 + 1, ДлинаТекста);
        Сообщить(Результат);
    КонецЕсли;
КонецЕсли;

Этот метод надежен, так как мы явно контролируем наличие обоих разделителей перед извлечением данных.

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

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

Выясним, как составить правильный паттерн. Для поиска текста между двумя звездочками подойдет шаблон: \*([^*]*)\*. Рассмотрим подробнее, что он означает:

Пример использования в коде 1С:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Истина;
RegExp.Pattern = "\*([^*]*)\*";

Текст = "Первый *блок* и второй *фрагмент* текста";
Matches = RegExp.Execute(Текст);

Для Каждого Match Из Matches Цикл
    // SubMatches(0) содержит текст внутри скобок нашего паттерна
    Сообщить("Найдено: " + Match.SubMatches(0));
КонецЦикла;

Использование RegExp позволяет избежать проблем с «жадностью» поиска, когда стандартные функции могут ошибочно захватить лишний текст между первой и самой последней звездочкой в предложении. При необходимости комплексного применения внешних скриптов для обработки данных подойдёт библиотека функций VBScript для обработки строк и данных.

Способ 4. Обработка нескольких вхождений через СтрРазделить

Если в вашей строке содержится несколько блоков, выделенных звездочками (например, "параметр1: *значение1*, параметр2: *значение2*"), метод СтрРазделить также может быть очень полезен. При разделении такой строки все элементы массива с нечетными индексами (1, 3, 5...) будут содержать текст, находившийся между разделителями.

Посмотрим на пример обработки в цикле:


МассивЧастей = СтрРазделить(ИсходнаяСтрока, "*");
Для Счетчик = 0 По МассивЧастей.Количество() - 1 Цикл
    // Каждый второй элемент (индексы 1, 3, 5...) — это данные между разделителями
    Если Счетчик % 2 <> 0 Тогда 
        Сообщить("Найден выделенный текст: " + МассивЧастей[Счетчик]);
    КонецЕсли;
КонецЦикла;

Рекомендации по выбору метода

Подводя итог, проанализируем, какой метод лучше выбрать в зависимости от условий задачи:

  1. Простая строка и одна пара символов: Используйте СтрРазделить с обязательной проверкой количества элементов. Это самый современный и лаконичный код.
  2. Высокая производительность: В циклах с миллионами итераций лучше использовать СтрНайти и Сред, так как они не порождают создание тяжелых объектов (массивов или COM-объектов).
  3. Сложный поиск или многострочный текст: Однозначно выбирайте RegExp. Это позволит гибко настраивать правила поиска, игнорировать регистр или искать текст по сложным шаблонам внутри разделителей.
  4. Старые версии платформы (ниже 8.3.6): Используйте комбинацию СтрЗаменить(Текст, "*", Символы.ПС) и последующий перебор строк через СтрПолучитьСтроку, либо стандартный СтрНайти.

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

← На главную