Загрузка данных
// --- ШАГ 1: ТИП БИЛЕТА ---
Функция ИзвлечьТипБилета(ОстатокСтроки, ШаблонТип)
ТипБилета = "";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ОстатокСтроки, ШаблонТип);
Если РезультатПоиска <> Неопределено Тогда
Блок = РезультатПоиска.Значение;
// Извлекаем первую группу с помощью замены найденного блока на $1
ТипБилета = СокрЛП(СтрЗаменитьПоРегулярномуВыражению(Блок, ШаблонТип, "$1"));
ОстатокСтроки = СокрЛП(Сред(ОстатокСтроки, РезультатПоиска.Длина + 1));
КонецЕсли;
Возврат ТипБилета;
КонецФункции
// --- ШАГ 2: ПЕРЕВОЗЧИК И ИНН ---
Функция ИзвлечьПеревозчикаИИнн(ОстатокСтроки, ШаблонПеревозчик)
Результат = Новый Структура("Перевозчик, ИНН", "", "");
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ОстатокСтроки, ШаблонПеревозчик);
Если РезультатПоиска <> Неопределено Тогда
Блок = РезультатПоиска.Значение;
// Перевозчик находится в первой группе ($1)
Результат.Перевозчик = СокрЛП(СтрЗаменитьПоРегулярномуВыражению(Блок, ШаблонПеревозчик, "$1"));
// ИНН находится во второй группе ($2). Очищаем от литерала "$2", если группа пустая.
ТекстИНН = СокрЛП(СтрЗаменитьПоРегулярномуВыражению(Блок, ШаблонПеревозчик, "$2"));
Результат.ИНН = СтрЗаменить(ТекстИНН, "$2", "");
ОстатокСтроки = СокрЛП(СтрЗаменить(ОстатокСтроки, Блок, ""));
КонецЕсли;
Возврат Результат;
КонецФункции
// --- ШАГ 3: КЛАСС ОБСЛУЖИВАНИЯ ---
Функция ИзвлечьКлассБилета(ОстатокСтроки, ШаблонКласс)
КлассБилета = "";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ОстатокСтроки, ШаблонКласс);
Если РезультатПоиска <> Неопределено Тогда
Блок = РезультатПоиска.Значение;
КлассБилета = СокрЛП(СтрЗаменитьПоРегулярномуВыражению(Блок, ШаблонКласс, "$1"));
ОстатокСтроки = СокрЛП(СтрЗаменить(ОстатокСтроки, Блок, ""));
КонецЕсли;
Возврат КлассБилета;
КонецФункции
// --- ШАГ 4: ДАТА, ПАССАЖИР, ДОП. ИНФО ---
Функция ИзвлечьДатуПассажираДопИнфо(ОстатокСтроки, ШаблонДата, ШаблонПассажир)
Результат = Новый Структура("Дата, Пассажир, ДопИнфо", "", "", "");
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ОстатокСтроки, ШаблонДата);
Если РезультатПоиска <> Неопределено Тогда
Результат.Дата = РезультатПоиска.Значение;
ПозицияДаты = СтрНайти(ОстатокСтроки, Результат.Дата);
Хвост = СокрЛП(Сред(ОстатокСтроки, ПозицияДаты + СтрДлина(Результат.Дата)));
ОстатокСтроки = СокрЛП(Лев(ОстатокСтроки, ПозицияДаты - 1));
ПозЗапятой = СтрНайти(Хвост, ",");
Если ПозЗапятой > 0 Тогда
Результат.Пассажир = СокрЛП(Лев(Хвост, ПозЗапятой - 1));
Результат.ДопИнфо = СокрЛП(Сред(Хвост, ПозЗапятой + 1));
Иначе
Результат.Пассажир = Хвост;
КонецЕсли;
Иначе
// Бездатные билеты - ищем ФИО с конца строки
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ОстатокСтроки, ШаблонПассажир);
Если РезультатПоиска <> Неопределено Тогда
Блок = РезультатПоиска.Значение;
Результат.Пассажир = СокрЛП(СтрЗаменитьПоРегулярномуВыражению(Блок, ШаблонПассажир, "$1"));
ОстатокСтроки = СокрЛП(Лев(ОстатокСтроки, СтрДлина(ОстатокСтроки) - РезультатПоиска.Длина));
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
// --- ШАГ 5: НОМЕР БИЛЕТА И МАРШРУТ ---
Функция ИзвлечьНомерИМаршрут(ОстатокСтроки, ШаблонНомерМаршрут, ШаблонМусорСлеш, ШаблонМусорУдалить)
Результат = Новый Структура("НомерБилета, Маршрут", "", "");
// Глобальная функция для очистки от лишних слов
ОстатокСтроки = СтрЗаменитьПоРегулярномуВыражению(ОстатокСтроки, ШаблонМусорСлеш, "/ ");
ОстатокСтроки = СтрЗаменитьПоРегулярномуВыражению(ОстатокСтроки, ШаблонМусорУдалить, "");
ОстатокСтроки = СокрЛП(ОстатокСтроки);
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(ОстатокСтроки, ШаблонНомерМаршрут);
Если РезультатПоиска <> Неопределено Тогда
Блок = РезультатПоиска.Значение;
Результат.НомерБилета = СокрЛП(СтрЗаменитьПоРегулярномуВыражению(Блок, ШаблонНомерМаршрут, "$1"));
ТекстМаршрута = СокрЛП(СтрЗаменитьПоРегулярномуВыражению(Блок, ШаблонНомерМаршрут, "$2"));
Результат.Маршрут = СтрЗаменить(ТекстМаршрута, "$2", "");
Иначе
Результат.НомерБилета = ОстатокСтроки;
КонецЕсли;
Возврат Результат;
КонецФункции