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