При парсинге наименований номенклатуры, адресов или загружаемых строк из внешних источников часто возникает задача извлечь последнюю значащую часть строки — например, артикул, код или модификацию, отделенную запятой. Рассмотрим исходный пример: есть строка "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б", из которой необходимо получить подстроку "243-1005015-Б".
В платформе 1С:Предприятие существует несколько способов решения этой задачи. Разберем каждый вариант подробно, проанализируем их производительность, кроссплатформенность и возможные краевые случаи.
Начиная с версии платформы 8.3.6, метод глобального контекста СтрНайти поддерживает параметр направления поиска НаправлениеПоиска.СКонца. Это наиболее быстрый и экономный по памяти вариант, так как платформа не создает промежуточных массивов или копий строк в оперативной памяти.
Разберем по шагам реализацию данного алгоритма:
НаправлениеПоиска.СКонца.Сред, начиная с символа, следующего за разделителем.СокрЛП.Посмотрим на пример программного кода:
ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
ПозицияРазделителя = СтрНайти(ИсходнаяСтрока, ",", НаправлениеПоиска.СКонца);
Если ПозицияРазделителя > 0 Тогда
Результат = СокрЛП(Сред(ИсходнаяСтрока, ПозицияРазделителя + 1));
Иначе
Результат = СокрЛП(ИсходнаяСтрока);
КонецЕсли;
Преимущество: максимальная производительность. При обработке сотен тысяч строк в цикле этот способ работает быстрее остальных.
В платформе 1С предусмотрена штатная функция СтрРазделить, которая преобразует строку в массив подстрок по указанному символу-разделителю. Чтобы получить последний фрагмент, достаточно обратиться к последнему элементу полученного массива.
Посмотрим на реализацию:
ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ",", Ложь);
Если МассивЧастей.Количество() > 0 Тогда
Результат = СокрЛП(МассивЧастей[МассивЧастей.Количество() - 1]);
Иначе
Результат = "";
КонецЕсли;
Важная деталь: обратите внимание на третий параметр функции — ВключатьПустые. Если установить его в значение Ложь, платформа автоматически отбросит пустые подстроки (например, если в конце исходного текста случайно оказалась завершающая запятая).
В более старых версиях платформы (до появления СтрРазделить и расширенного синтаксиса СтрНайти) классическим приемом была замена разделителя на символ переноса строки Символы.ПП с последующей выборкой последней строки через СтрПолучитьСтроку и СтрЧислоСтрок.
Рассмотрим пример:
ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
ВременнаяСтрока = СтрЗаменить(ИсходнаяСтрока, ",", Символы.ПП);
КоличествоСтрок = СтрЧислоСтрок(ВременнаяСтрока);
Если КоличествоСтрок > 0 Тогда
Результат = СокрЛП(СтрПолучитьСтроку(ВременнаяСтрока, КоличествоСтрок));
Иначе
Результат = "";
КонецЕсли;
Ограничение метода: если в исходном тексте уже присутствовали реальные символы переноса строк (например, при парсинге многострочного комментария), расчет количества строк и выборка последней строки приведут к неверному результату.
Если разработка ведется в типовой конфигурации, в общем модуле СтроковыеФункцииКлиентСервер доступны готовые методы для разделения строк:
ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
МассивЧастей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходнаяСтрока, ",");
Если МассивЧастей.Количество() > 0 Тогда
Результат = СокрЛП(МассивЧастей[МассивЧастей.Количество() - 1]);
Иначе
Результат = "";
КонецЕсли;
Для поиска подстроки можно использовать регулярное выражение, находящее совпадение после последней запятой: ,(?![^,]*,)(.+).
Однако необходимо учитывать существенное ограничение: во встроенном языке 1С нет штатного движка регулярных выражений. Их использование возможно только через COM-объект VBScript.RegExp, который поддерживается исключительно в операционной системе Windows. При запуске на сервере под Linux или в веб-клиенте данный подход вызовет критическую ошибку.
При написании надежного кода рекомендуем предусмотреть следующие ситуации:
ЕСТЬNULL в запросе, иначе функции работы со строками вызовут ошибку «Несоответствие типов».СокрЛП, так как после запятой в тексте практически всегда следует пробел.