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