Как в 1С извлечь текст в кавычках из строки

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

При обработке текстовых данных и наименований контрагентов часто возникает задача очистить строку от префиксов (например, организационно-правовой формы «ООО», «АО») и суффиксов (номеров договоров, кодов), оставив исключительно само наименование в кавычках. Рассмотрим пример: дана строка ООО "Канцелярия" 123, и нам требуется получить результат "Канцелярия".

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

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

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

Проанализируем алгоритм:

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

Посмотрим на пример реализации:


ИсходнаяСтрока = "ООО ""Канцелярия"" 123";
СимволКавычки = """"; // Двойная кавычка в синтаксисе 1С задается как """"

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

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

Способ 2. Разбиение строки через СтрРазделить

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

Если в качестве разделителя указать символ кавычки, исходная строка разобьется на части: всё, что было до первой кавычки (индекс 0), текст внутри первой пары кавычек (индекс 1) и оставшийся хвост (индекс 2).

Посмотрим на пример кода:


ИсходнаяСтрока = "ООО ""Канцелярия"" 123";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, """", Истина);

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

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

Способ 3. Классический вариант через Лев, Прав и Найти

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

В этом подходе сначала отсекается левая часть до первой кавычки, а затем в полученном остатке находится вторая кавычка и отсекается правая часть:


ИсходнаяСтрока = "ООО ""Канцелярия"" 123";
СимволКавычки = Символ(34); // Код символа двойной кавычки

ПозицияПервой = Найти(ИсходнаяСтрока, СимволКавычки);
Если ПозицияПервой > 0 Тогда
    ОстатокСтроки = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - ПозицияПервой);
    ПозицияВторой = Найти(ОстатокСтроки, СимволКавычки);
    
    Если ПозицияВторой > 0 Тогда
        ТекстВнутри = Лев(ОстатокСтроки, ПозицияВторой - 1);
        Результат = СимволКавычки + ТекстВнутри + СимволКавычки;
    КонецЕсли;
КонецЕсли;

Обратите внимание: для поддержания чистоты кода рекомендуется избегать неявных магических чисел и выносить промежуточные вычисления в понятные переменные. Вместо Символ(34) в коде 1С предпочтительно использовать строковый литерал """".

Обработка краевых случаев и вложенных кавычек

Выясним причину возможных сбоев строковых алгоритмов при работе с реальными данными:

  1. Отсутствие кавычек в строке: если функция Найти или СтрНайти возвращает 0, выполнение математических операций с длиной строки приведет к некорректным индексам. Всегда проверяйте результат поиска перед извлечением.
  2. Вложенные кавычки: если в строке содержится конструкция вида ООО "Торговый дом "Север"", поиск второй кавычки вернет только "Торговый дом ". Чтобы захватить всё наименование целиком от первой до последней кавычки, используйте поиск с конца строки с помощью перечисления НаправлениеПоиска.СКонца в функции СтрНайти.
  3. Типографские кавычки: пользователи часто вводят кавычки-ёлочки (« и »). При необходимости перед извлечением строки выполните предварительную нормализацию с помощью СтрЗаменить или предусмотрите поиск соответствующих символов.
← На главную