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