Как получить подстроку после последней запятой в 1С?

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

При парсинге наименований номенклатуры, адресов или загружаемых строк из внешних источников часто возникает задача извлечь последнюю значащую часть строки — например, артикул, код или модификацию, отделенную запятой. Рассмотрим исходный пример: есть строка "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б", из которой необходимо получить подстроку "243-1005015-Б".

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

Способ 1. Оптимальный метод: поиск с конца через СтрНайти

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

Разберем по шагам реализацию данного алгоритма:

  1. Находим позицию последней запятой в строке с помощью параметра НаправлениеПоиска.СКонца.
  2. Если запятая найдена (позиция больше нуля), отсекаем правую часть строки с помощью функции Сред, начиная с символа, следующего за разделителем.
  3. Обязательно очищаем результат от начальных и конечных пробелов с помощью функции СокрЛП.

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


ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
ПозицияРазделителя = СтрНайти(ИсходнаяСтрока, ",", НаправлениеПоиска.СКонца);

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

Преимущество: максимальная производительность. При обработке сотен тысяч строк в цикле этот способ работает быстрее остальных.

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

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

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


ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ",", Ложь);

Если МассивЧастей.Количество() > 0 Тогда
    Результат = СокрЛП(МассивЧастей[МассивЧастей.Количество() - 1]);
Иначе
    Результат = "";
КонецЕсли;

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

Способ 3. Замена разделителя на перенос строк (устаревший подход)

В более старых версиях платформы (до появления СтрРазделить и расширенного синтаксиса СтрНайти) классическим приемом была замена разделителя на символ переноса строки Символы.ПП с последующей выборкой последней строки через СтрПолучитьСтроку и СтрЧислоСтрок.

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


ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
ВременнаяСтрока = СтрЗаменить(ИсходнаяСтрока, ",", Символы.ПП);
КоличествоСтрок = СтрЧислоСтрок(ВременнаяСтрока);

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

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

Способ 4. Использование функций Библиотеки стандартных подсистем (БСП)

Если разработка ведется в типовой конфигурации, в общем модуле СтроковыеФункцииКлиентСервер доступны готовые методы для разделения строк:


ИсходнаяСтрока = "КОЛЕНВАЛ Д-240 со шлицами, 2 шпонки, 7 отв. (Беларусь), 243-1005015-Б";
МассивЧастей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходнаяСтрока, ",");

Если МассивЧастей.Количество() > 0 Тогда
    Результат = СокрЛП(МассивЧастей[МассивЧастей.Количество() - 1]);
Иначе
    Результат = "";
КонецЕсли;

Способ 5. Регулярные выражения (RegExp)

Для поиска подстроки можно использовать регулярное выражение, находящее совпадение после последней запятой: ,(?![^,]*,)(.+).

Однако необходимо учитывать существенное ограничение: во встроенном языке 1С нет штатного движка регулярных выражений. Их использование возможно только через COM-объект VBScript.RegExp, который поддерживается исключительно в операционной системе Windows. При запуске на сервере под Linux или в веб-клиенте данный подход вызовет критическую ошибку.

Обработка краевых ситуаций (Edge Cases)

При написании надежного кода рекомендуем предусмотреть следующие ситуации:

  1. Значения Неопределено и NULL: если строка получается из реквизита базы данных или результата запроса, убедитесь, что значение имеет строковый тип, либо используйте ЕСТЬNULL в запросе, иначе функции работы со строками вызовут ошибку «Несоответствие типов».
  2. Отсутствие разделителя: если в строке нет запятых, алгоритм должен корректно вернуть всю строку целиком или пустое значение в зависимости от требований бизнес-логики.
  3. Пробелы вокруг разделителя: всегда оборачивайте итоговый фрагмент в СокрЛП, так как после запятой в тексте практически всегда следует пробел.
← На главную