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