При обработке текстовых данных и наименований контрагентов часто возникает задача очистить строку от префиксов (например, организационно-правовой формы «ООО», «АО») и суффиксов (номеров договоров, кодов), оставив исключительно само наименование в кавычках. Рассмотрим пример: дана строка ООО "Канцелярия" 123, и нам требуется получить результат "Канцелярия".
Разберем по шагам различные варианты реализации этой задачи на платформе 1С:Предприятие — от классических строковых функций до современных методов работы со строками.
Наиболее надежный и производительный способ в современных версиях платформы 1С:Предприятие 8.3 — последовательный поиск первой и второй кавычки с помощью функции СтрНайти и последующее извлечение фрагмента функцией Сред.
Проанализируем алгоритм:
Сред.Посмотрим на пример реализации:
ИсходнаяСтрока = "ООО ""Канцелярия"" 123";
СимволКавычки = """"; // Двойная кавычка в синтаксисе 1С задается как """"
Позиция1 = СтрНайти(ИсходнаяСтрока, СимволКавычки);
Если Позиция1 > 0 Тогда
Позиция2 = СтрНайти(ИсходнаяСтрока, СимволКавычки, , Позиция1 + 1);
Если Позиция2 > 0 Тогда
// Рассчитываем длину подстроки с учетом самих кавычек
ДлинаФрагмента = Позиция2 - Позиция1 + 1;
Результат = Сред(ИсходнаяСтрока, Позиция1, ДлинаФрагмента);
КонецЕсли;
КонецЕсли;
Важный момент: использование функции СтрНайти с указанием начальной позиции поиска исключает необходимость промежуточного обрезания строки, что повышает читаемость кода и скорость его выполнения.
Рассмотрим альтернативный лаконичный вариант, доступный в платформе 1С:Предприятие 8.3.6 и выше — разбиение строки в массив с помощью функции СтрРазделить.
Если в качестве разделителя указать символ кавычки, исходная строка разобьется на части: всё, что было до первой кавычки (индекс 0), текст внутри первой пары кавычек (индекс 1) и оставшийся хвост (индекс 2).
Посмотрим на пример кода:
ИсходнаяСтрока = "ООО ""Канцелярия"" 123";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, """", Истина);
Если МассивЧастей.Количество() >= 3 Тогда
// МассивЧастей[1] содержит текст строго между первой и второй кавычкой
Результат = """" + МассивЧастей[1] + """";
КонецЕсли;
Этот способ отличается компактностью, однако требует обязательной проверки количества элементов в полученном массиве, чтобы избежать ошибки выхода за границы массива при некорректных входных данных.
Разберем вариант, совместимый со старыми версиями платформы, где применяются базовые функции Найти, Лев, Прав и СтрДлина.
В этом подходе сначала отсекается левая часть до первой кавычки, а затем в полученном остатке находится вторая кавычка и отсекается правая часть:
ИсходнаяСтрока = "ООО ""Канцелярия"" 123";
СимволКавычки = Символ(34); // Код символа двойной кавычки
ПозицияПервой = Найти(ИсходнаяСтрока, СимволКавычки);
Если ПозицияПервой > 0 Тогда
ОстатокСтроки = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - ПозицияПервой);
ПозицияВторой = Найти(ОстатокСтроки, СимволКавычки);
Если ПозицияВторой > 0 Тогда
ТекстВнутри = Лев(ОстатокСтроки, ПозицияВторой - 1);
Результат = СимволКавычки + ТекстВнутри + СимволКавычки;
КонецЕсли;
КонецЕсли;
Обратите внимание: для поддержания чистоты кода рекомендуется избегать неявных магических чисел и выносить промежуточные вычисления в понятные переменные. Вместо Символ(34) в коде 1С предпочтительно использовать строковый литерал """".
Выясним причину возможных сбоев строковых алгоритмов при работе с реальными данными:
Найти или СтрНайти возвращает 0, выполнение математических операций с длиной строки приведет к некорректным индексам. Всегда проверяйте результат поиска перед извлечением.ООО "Торговый дом "Север"", поиск второй кавычки вернет только "Торговый дом ". Чтобы захватить всё наименование целиком от первой до последней кавычки, используйте поиск с конца строки с помощью перечисления НаправлениеПоиска.СКонца в функции СтрНайти.« и »). При необходимости перед извлечением строки выполните предварительную нормализацию с помощью СтрЗаменить или предусмотрите поиск соответствующих символов.