// Функция для извлечения номера счета (20 цифр, начинается с 407 или 408)
Функция ИзвлечьНомерСчета(Текст) Экспорт
// Регулярное выражение для поиска счета
// 407|408 - начало счета
// \d{17} - еще 17 цифр (итого 20)
РегулярноеВыражение = "(407|408)\d{17}";
Попытка
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, РегулярноеВыражение, , , , Истина);
Если РезультатПоиска <> Неопределено И РезультатПоиска.НачальнаяПозиция <> 0 Тогда
Возврат Сред(Текст, РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);
Иначе
Возврат "";
КонецЕсли;
Исключение
Возврат "";
КонецПопытки;
КонецФункции
// Функция для извлечения БИК (9 цифр, идущих после слова БИК)
Функция ИзвлечьБИК(Текст) Экспорт
// Регулярное выражение для поиска БИК
// БИК - ключевое слово
// \D* - любые символы, кроме цифр (0 или более раз)
// (\d{9}) - захватываем 9 цифр
РегулярноеВыражение = "БИК\D*(\d{9})";
Попытка
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, РегулярноеВыражение, , , , Истина);
Если РезультатПоиска <> Неопределено И РезультатПоиска.НачальнаяПозиция <> 0 Тогда
// Извлекаем найденную подстроку целиком
НайденнаяСтрока = Сред(Текст, РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);
// Извлекаем только цифры из найденной строки
БИК = "";
Для Индекс = 1 По СтрДлина(НайденнаяСтрока) Цикл
ТекСимвол = Сред(НайденнаяСтрока, Индекс, 1);
Если СтрЧислоВхождений("0123456789", ТекСимвол) > 0 Тогда
БИК = БИК + ТекСимвол;
КонецЕсли;
КонецЦикла;
Возврат БИК;
Иначе
Возврат "";
КонецЕсли;
Исключение
Возврат "";
КонецПопытки;
КонецФункции
// Улучшенная версия извлечения БИК с использованием подстановок (если поддерживается)
Функция ИзвлечьБИК2(Текст) Экспорт
// Регулярное выражение для поиска БИК с захватом группы
// (?<=БИК\D*)\d{9} - позитивный просмотр назад для слова БИК и 9 цифр после него
РегулярноеВыражение = "(?<=БИК\D*)\d{9}";
Попытка
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, РегулярноеВыражение, , , , Истина);
Если РезультатПоиска <> Неопределено И РезультатПоиска.НачальнаяПозиция <> 0 Тогда
Возврат Сред(Текст, РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);
Иначе
Возврат "";
КонецЕсли;
Исключение
Возврат "";
КонецПопытки;
КонецФункции
// Универсальная функция для парсинга обоих значений сразу
Функция ПарситьРеквизиты(Текст) Экспорт
СтруктураРез = Новый Структура;
СтруктураРез.Вставить("НомерСчета", "");
СтруктураРез.Вставить("БИК", "");
СтруктураРез.НомерСчета = ИзвлечьНомерСчета(Текст);
СтруктураРез.БИК = ИзвлечьБИК(Текст); // Используем улучшенную версию
Возврат СтруктураРез;
КонецФункции
// Расширенная функция для поиска email с дополнительной валидацией
Функция ИзвлечьEmailРасширенный(Текст) Экспорт
// Более строгое регулярное выражение для email
// Учитывает больше особенностей формата email
РегулярноеВыражение = "[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?";
Попытка
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, РегулярноеВыражение, , , , Истина);
Если РезультатПоиска <> Неопределено И РезультатПоиска.НачальнаяПозиция <> 0 Тогда
Возврат Сред(Текст, РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);
Иначе
Возврат "";
КонецЕсли;
Исключение
Возврат "";
КонецПопытки;
КонецФункции
// Исправленная функция для поиска номера со слэшами (поддерживает буквы после слэшей)
Функция ИзвлечьНомерССлешами(Текст) Экспорт
Попытка
// ИСПРАВЛЕНО: Регулярное выражение поддерживает буквы после слэшей
// Начинается с букв (необязательно), затем могут быть цифры, затем группы /буквы или /цифры
РегулярноеВыражение = "[A-Za-zА-Яа-я]*\d*(?:\/[A-Za-zА-Яа-я\d]+)+";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, РегулярноеВыражение, , , , Истина);
Если РезультатПоиска <> Неопределено И РезультатПоиска.НачальнаяПозиция <> 0 Тогда
НайденныйНомер = Сред(Текст, РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);
НайденныйНомер = СтрЗаменить(НайденныйНомер, "№", "");
Возврат СокрЛП(НайденныйНомер);
Иначе
Возврат "";
КонецЕсли;
Исключение
Возврат "";
КонецПопытки;
КонецФункции
// Функция для нормализации даты (приведение к формату ДД.ММ.ГГГГ)
Функция НормализоватьДату(СтрокаДаты) Экспорт
Если ПустаяСтрока(СтрокаДаты) Тогда
Возврат "";
КонецЕсли;
Попытка
// Разделяем дату на части
Части = СтрРазделить(СтрокаДаты, ".");
Если Части.Количество() < 3 Тогда
Возврат СтрокаДаты;
КонецЕсли;
День = СокрЛП(Части[0]);
Месяц = СокрЛП(Части[1]);
Год = СокрЛП(Части[2]);
// Удаляем возможные буквы из года
ГодОчищенный = "";
Для Индекс = 1 По СтрДлина(Год) Цикл
ТекСимвол = Сред(Год, Индекс, 1);
Если Найти("0123456789", ТекСимвол) > 0 Тогда
ГодОчищенный = ГодОчищенный + ТекСимвол;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Год = ГодОчищенный;
// Добавляем ведущий ноль к дню если нужно
Если СтрДлина(День) = 1 Тогда
День = "0" + День;
КонецЕсли;
// Добавляем ведущий ноль к месяцу если нужно
Если СтрДлина(Месяц) = 1 Тогда
Месяц = "0" + Месяц;
КонецЕсли;
// Приводим год к 4 цифрам если нужно
Если СтрДлина(Год) = 2 Тогда
// Предполагаем, что 00-29 -> 2000-2029, 30-99 -> 1930-1999
ЧислоГод = Число(Год);
Если ЧислоГод < 30 Тогда
Год = "20" + Год;
Иначе
Год = "19" + Год;
КонецЕсли;
КонецЕсли;
// Если год уже 4 цифры, оставляем как есть
Если СтрДлина(Год) > 4 Тогда
Год = Лев(Год, 4);
КонецЕсли;
Возврат День + "." + Месяц + "." + Год;
Исключение
Возврат СтрокаДаты;
КонецПопытки;
КонецФункции
// Исправленная функция для поиска первой даты (поддерживает однозначные числа)
Функция ИзвлечьПервуюДату(Текст) Экспорт
Попытка
// ИСПРАВЛЕНО: Поиск даты в форматах Д.М.ГГГГ, ДД.М.ГГГГ, Д.ММ.ГГГГ и т.д.
РегулярноеВыражение = "\d{1,2}\.\d{1,2}\.\d{2,4}";
РезультатПоиска = СтрНайтиПоРегулярномуВыражению(Текст, РегулярноеВыражение, , , , Истина);
Если РезультатПоиска <> Неопределено И РезультатПоиска.НачальнаяПозиция <> 0 Тогда
НайденнаяДата = Сред(Текст, РезультатПоиска.НачальнаяПозиция, РезультатПоиска.Длина);
// Удаляем возможные буквы после даты
ПозицияГ = Найти(НайденнаяДата, "г");
Если ПозицияГ > 0 Тогда
НайденнаяДата = Лев(НайденнаяДата, ПозицияГ - 1);
КонецЕсли;
Возврат НайденнаяДата;
Иначе
Возврат "";
КонецЕсли;
Исключение
Возврат "";
КонецПопытки;
КонецФункции
&НаСервере
Функция ТолькоРусБуквы(Строка)
ДопустимыеСимволы = " АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЭэЮюЯяЫыьъ";
ЛишниеСимволы = СтрСоединить(СтрРазделить(Строка,ДопустимыеСимволы));
ИтоговаяСтрока = СтрСоединить(СтрРазделить(Строка,ЛишниеСимволы));
Возврат ИтоговаяСтрока;
КонецФункции
// Альтернативная функция с регулярным выражением для телефона
Функция ИзвлечьФИОИТелефонРег(Текст) Экспорт
СтруктураРез = Новый Структура;
СтруктураРез.Вставить("Фамилия", "");
СтруктураРез.Вставить("Имя", "");
СтруктураРез.Вставить("Отчество", "");
СтруктураРез.Вставить("Телефон", "");
СтруктураРез.Вставить("ТелефонОчищенный", "");
СтруктураРез.Вставить("ФИОПолное", "");
СтруктураРез.Вставить("ИсходнаяСтрока", Текст);
Попытка
// Разбиваем строку на слова (разделители - пробелы)
МассивСлов = СтрРазделить(Текст, " ", Ложь);
// Берем первые три слова как ФИО
Если МассивСлов.Количество() >= 3 Тогда
СтруктураРез.Фамилия = МассивСлов[0];
СтруктураРез.Имя = МассивСлов[1];
СтруктураРез.Отчество = МассивСлов[2];
СтруктураРез.ФИОПолное = МассивСлов[0] + " " + МассивСлов[1] + " " + МассивСлов[2];
КонецЕсли;
// Регулярное выражение для поиска телефона (начинается с +)
РегулярноеВыражениеТелефон = "\+[\d\s\-\(\)]+";
РезультатПоискаТелефон = СтрНайтиПоРегулярномуВыражению(Текст, РегулярноеВыражениеТелефон, , , , Истина);
Если РезультатПоискаТелефон <> Неопределено И РезультатПоискаТелефон.НачальнаяПозиция <> 0 Тогда
НайденныйТелефон = Сред(Текст, РезультатПоискаТелефон.НачальнаяПозиция, РезультатПоискаТелефон.Длина);
СтруктураРез.Телефон = СокрЛП(НайденныйТелефон);
// Очищаем телефон от лишних символов
ОчищенныйТелефон = "";
Для Индекс = 1 По СтрДлина(НайденныйТелефон) Цикл
ТекСимвол = Сред(НайденныйТелефон, Индекс, 1);
Если ТекСимвол = "+" ИЛИ (ТекСимвол >= "0" И ТекСимвол <= "9") Тогда
ОчищенныйТелефон = ОчищенныйТелефон + ТекСимвол;
КонецЕсли;
КонецЦикла;
СтруктураРез.ТелефонОчищенный = ОчищенныйТелефон;
КонецЕсли;
Исключение
// В случае ошибки возвращаем пустую структуру
КонецПопытки;
Возврат СтруктураРез;
КонецФункции
адресок = СокрЛП(ПолучитьЗнач(ТабличныйДокумент,Сч,1));
фиотел = СокрЛП(ПолучитьЗнач(ТабличныйДокумент,Сч,2));
договор = СокрЛП(ПолучитьЗнач(ТабличныйДокумент,Сч,3));
имеил = СокрЛП(ПолучитьЗнач(ТабличныйДокумент,Сч,4));
счетбик = СокрЛП(ПолучитьЗнач(ТабличныйДокумент,Сч,5));
денёк = СокрЛП(ПолучитьЗнач(ТабличныйДокумент,Сч,6));
тариф = СокрЛП(ПолучитьЗнач(ТабличныйДокумент,Сч,7));
//Сообщить(ПарситьРеквизиты(счетбик).НомерСчета);
//Сообщить(ПарситьРеквизиты(счетбик).БИК);
//Сообщить(ИзвлечьEmailРасширенный(имеил));
//Сообщить(ИзвлечьНомерССлешами(договор));
//Сообщить(НормализоватьДату(ИзвлечьПервуюДату(договор)));
//Сообщить(ТолькоРусБуквы(ИзвлечьФИОИТелефонРег(фиотел).ФИОПолное));
//Сообщить(ИзвлечьФИОИТелефонРег(фиотел).ТелефонОчищенный);