Как в 1С получить подстроку после последнего пробела (например, Артикул)?

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

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

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

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

Одним из самых удобных и современных способов является использование встроенной функции СтрРазделить. Эта функция преобразует исходную строку в массив подстрок, используя указанный разделитель (в нашем случае — пробел).

Разберем этот метод по шагам:

  1. Сначала мы преобразуем строку в массив.
  2. Затем мы обращаемся к последнему элементу этого массива, который и будет являться искомым Артикулом.

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


ИсходнаяСтрока = "НаименованиеТовара Артикул12345";
МассивЧастей = СтрРазделить(СокрЛП(ИсходнаяСтрока), " ", Ложь);

Если МассивЧастей.Количество() > 0 Тогда
    Артикул = МассивЧастей[МассивЧастей.Количество() - 1];
КонецЕсли;

Важный нюанс: Обратите внимание на использование функции СокрЛП перед разделением. Это необходимо для того, чтобы исключить лишние пробелы в начале и конце строки. Если в конце строки будет случайный пробел, последним элементом массива может оказаться пустая строка. Также параметр Ложь в функции СтрРазделить (отвечающий за параметр "ВключатьПустые") позволяет игнорировать двойные пробелы между словами.

Метод 2: Поиск с конца строки с помощью СтрНайти

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

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

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


СтрокаПоиска = СокрЛП("Наименование Артикул");
ПозицияПробела = СтрНайти(СтрокаПоиска, " ", НаправлениеПоиска.СКонца);

Если ПозицияПробела > 0 Тогда
    Артикул = Сред(СтрокаПоиска, ПозицияПробела + 1);
Иначе
    Артикул = СтрокаПоиска; // Если пробел не найден, значит вся строка и есть артикул
КонецЕсли;

Этот метод работает быстрее, чем создание массива, так как 1С не тратит память на хранение всех частей строки, а лишь вычисляет индекс одного символа.

Метод 3: Преобразование в многострочную строку

Существует классический способ, который программисты 1С использовали десятилетиями еще до появления СтрРазделить. Он заключается в замене пробелов на символы переноса строки. После этого строка превращается в "список", и мы можем программно обращаться к нужной строке по номеру.

Выясним, как это работает на практике:


ИсходныйТекст = "Наименование Артикул";
МногострочныйТекст = СтрЗаменить(СокрЛП(ИсходныйТекст), " ", Символы.ПС);
КоличествоСлов = СтрЧислоСтрок(МногострочныйТекст);

Артикул = СтрПолучитьСтроку(МногострочныйТекст, КоличествоСлов);

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

Метод 4: Циклический перебор (алгоритмический подход)

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


ФразаИзСлов = "Нужно взять из этой строки только Артикул";
ВремСтр = ФразаИзСлов;
ПоследнийПробел = 0;

Для х = 1 По СтрЧислоВхождений(ФразаИзСлов, " ") Цикл
    ПоследнийПробел = Найти(ВремСтр, " ");
    // Заменяем найденный пробел на другой символ, чтобы поиск пошел дальше
    ВремСтр = Лев(ВремСтр, ПоследнийПробел - 1) + "_" + Сред(ВремСтр, ПоследнийПробел + 1);
КонецЦикла;

// Теперь в переменной ПоследнийПробел индекс последнего найденного вхождения
Артикул = Сред(ФразаИзСлов, ПоследнийПробел + 1);

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

Важные рекомендации по работе с данными

При работе со строками, полученными из внешних источников (загрузка из Excel, TXT или через API), мы часто сталкиваемся с "невидимыми" проблемами. Рассмотрим, как их избежать:

  1. Неразрывные пробелы: Часто вместо обычного пробела (код 32) встречается неразрывный пробел (код 160). Обычная функция Найти(Стр, " ") его не увидит. Перед обработкой рекомендуется выполнить нормализацию: Стр = СтрЗаменить(Стр, Символы.НПП, " ");.
  2. Лишние пробелы: Всегда используйте СокрЛП(). Если в строке "Наименование Артикул " (с двумя пробелами в конце) не убрать их, то функции поиска с конца вернут пустую строку.
  3. Пустые значения: Обязательно проверяйте результат поиска разделителя. Если функция Найти вернула 0, это означает, что в строке нет пробелов. В этом случае ваш код должен корректно решить: использовать ли всю строку как артикул или выдать ошибку.

Сравнение производительности

Проанализируем, какой метод выбрать:

Выбор конкретного метода зависит от версии вашей платформы и требований к чистоте кода. В большинстве современных конфигураций на базе 1С 8.3 оптимальным выбором будет Метод 1 (через массив) или Метод 2 (через поиск с конца).

← На главную