Как в 1С обрезать строку до скобок, кавычек или символа табуляции

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

В процессе разработки на платформе 1С:Предприятие часто возникает задача по обработке строковых данных. Одной из типичных операций является извлечение части строки до определенного символа-разделителя. Например, если у нас есть строка вида "Магазин1(Кропоткина)", и нам нужно получить только название магазина, отбросив уточнение в скобках. В этой статье мы подробно разберем все способы решения этой задачи: от классических функций работы со строками до современных механизмов регулярных выражений.

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

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

Рассмотрим алгоритм действий:

  1. Вызываем функцию СтрРазделить, передавая исходную строку и символ разделителя (в нашем случае — открывающую скобку "(").
  2. Функция возвращает массив подстрок.
  3. Первый элемент массива (с индексом 0) и будет искомым текстом до скобки.

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


ИсходнаяСтрока = "Магазин1(Кропоткина)";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, "(");
Результат = МассивЧастей[0];
// В результате переменная будет содержать "Магазин1"

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

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

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

Разберем по шагам правильную реализацию с защитой от ошибок:


ИсходнаяСтрока = "Магазин1(Кропоткина)";
ПозицияСкобки = СтрНайти(ИсходнаяСтрока, "(");

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

Важный нюанс: всегда проверяйте результат функции СтрНайти. Если символ не найден, функция вернет 0. Попытка выполнить Лев(Строка, -1) в некоторых контекстах может привести к ошибке или непредсказуемому поведению, поэтому условие Если ПозицияСкобки > 0 является обязательным для качественного кода.

Способ 3. Регулярные выражения (для платформы 8.3.24 и выше)

Если ваша информационная база работает на современной версии платформы (начиная с 8.3.24), мы можем использовать нативный объект РегулярноеВыражение. Это самый гибкий способ, который позволяет решать задачу "в одну строку" даже при наличии сложных условий.

Выясним причину, по которой это удобно: регулярное выражение может искать сразу несколько типов разделителей (скобку, кавычку или пробел) и автоматически игнорировать лишние пробелы. Рассмотрим пример:


// Создаем объект регулярного выражения
РегЭкс = Новый РегулярноеВыражение("^[^(\s]+"); 
// Паттерн означает: найти все символы от начала строки до первой скобки или пробела
РезультатПоиска = РегЭкс.Найти(ИсходнаяСтрока);

Если РезультатПоиска <> Неопределено Тогда
    Результат = РезультатПоиска.Значение;
КонецЕсли;

Использование РегулярноеВыражение избавляет разработчика от написания сложных конструкций из множества вложенных условий Если...ИначеЕсли.

Способ 4. Функции Библиотеки Стандартных Подсистем (БСП)

Если вы разрабатываете в типовой конфигурации (например, 1С:Бухгалтерия или 1С:ERP), крайне рекомендуется использовать возможности общего модуля СтроковыеФункцииКлиентСервер. Это стандарт "хорошего тона" в среде 1С-разработчиков.

Проанализируем пример использования функции разложения строки:


// Подходит, если нужно получить текст до разделителя
Результат = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходнаяСтрока, "(")[0];

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

Работа со спецсимволами: табуляция и кавычки

В вопросе автора упоминалось, что до кавычек или табуляции обрезать строку проще. На самом деле механизмы идентичны, меняется только искомый символ. Давайте разберем, как правильно указывать эти спецсимволы в коде 1С.

Символ табуляции: Для поиска табуляции нельзя просто нажать клавишу Tab в конфигураторе. Используйте системное перечисление Символы.


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

Символ кавычки: В языке 1С кавычка внутри строкового литерала экранируется другой кавычкой. То есть для поиска одной кавычки в строке нужно написать четыре кавычки подряд.


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

Очистка результата и невидимые символы

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

Поэтому мы настоятельно рекомендуем всегда завершать обработку функцией СокрЛП(). Рассмотрим комплексный пример безопасной обработки:


Функция ПолучитьНазваниеБезСкобок(Знач ВходнаяСтрока) Экспорт
    
    // 1. Ищем позицию разделителя
    Поз = СтрНайти(ВходнаяСтрока, "(");
    
    // 2. Обрезаем, если нашли
    Если Поз > 0 Тогда
        ВходнаяСтрока = Лев(ВходнаяСтрока, Поз - 1);
    КонецЕсли;
    
    // 3. Удаляем лишние пробелы по краям
    Возврат СокрЛП(ВходнаяСтрока);
    
КонецФункции

Подведение итогов

Мы рассмотрели несколько эффективных методов обрезки строки. Для простых задач идеально подходит СтрРазделить или Лев(). Для сложных конфигураций на базе БСП лучше применять готовые модули, а для самых продвинутых случаев и новых платформ — регулярные выражения. Выбор метода зависит от версии вашей платформы и требований к отказоустойчивости кода. Для расширенной обработки текста можно использовать библиотеку готовых методов работы со строками.

← На главную