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