Загрузка данных


// Выполняет пошаговый разбор одной склеенной строки билета
Функция РаспарситьСтрокуБилета(Знач СтрокаБилета, РегВыражения)
    
    ДанныеБилета = Новый Структура;
    ДанныеБилета.Вставить("ТипБилета", "");
    ДанныеБилета.Вставить("Перевозчик", "");
    ДанныеБилета.Вставить("ИНН", "");
    ДанныеБилета.Вставить("НомерБилета", "");
    ДанныеБилета.Вставить("Маршрут", "");
    ДанныеБилета.Вставить("Дата", "");
    ДанныеБилета.Вставить("Класс", "");
    ДанныеБилета.Вставить("Пассажир", "");
    ДанныеБилета.Вставить("ДопИнфо", "");
    ДанныеБилета.Вставить("ИсходнаяСтрока", СтрокаБилета); 
    
    ОстатокСтроки = СтрокаБилета;
    
    // ШАГ 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].Значение);
        КонецЕсли;
    Иначе
        Результат.НомерБилета = ОстатокСтроки;
    КонецЕсли;
    
    // Здесь ОстатокСтроки уже не нужно возвращать, т.к. это последний шаг
    Возврат Результат;
КонецФункции