Книга знаний

1С:Предприятие / v8

v8: Функция разбора/сбора телефонного номера

Функция для разбора сбора строки с несколькими телефонными номерами в массив структур определенного вида.Автор статьи: Гений 1С
Последняя редакция №1 от 12.07.06
URL: http://kb.mista.ru/article.php?id=287

Ключевые слова: функция,телефонный номер


Функция разбирает строку с телефонами, разделенным запятым в массив структур {КодСтраны, КодГорода, Телефон, Добавочный}
Примеры разбираемых конструкций:
+7(911)046-45-45#33, 456-11-11
#33, 8(100)456-11-11

При сборе вставляет тире в правильной позиции:
111-894
123-4567
22-44

Функция ТелефонныйНомерРазобрать(ПрмТелефон) Экспорт
    Перем Телефон;
    Перем Рез;
    Рез=Новый Массив();
    
    КоличествоНомеров=0;
    ИсхТелефон=СтрЗаменить(ПрмТелефон,"-","");
    ИсхТелефон=СтрЗаменить(ИсхТелефон," ","");
    //ЭтоКодСтраны=ложь;
    ВНачало=истина;
    Длина=СтрДлина(ИсхТелефон)+1;
    Для Инд=1 По Длина Цикл
        Если ВНачало Тогда
            ТекЧисло="";
            КодСтраны="";
            КодГорода="";
            Телефон="";
            Добавочный="";
            Уровень="Страна";
            ТелефонГотов=Ложь;
            ВНачало=ложь;
        КонецЕсли;
        Последний=Инд=Длина;
        Если НЕ Последний Тогда
            Симв=Сред(ИсхТелефон,Инд,1);
            Если Инд=1 и Симв="+" Тогда
                //ЭтоКодСтраны=истина;
                Продолжить; //Знак кода страны
            КонецЕсли;
            Если Симв>="0" И Симв<="9" тогда //Имеем число
                ТекЧисло=ТекЧисло+Симв;
            КонецЕсли;
            Если Симв="("тогда //Имеем код страны
                Если Уровень="Страна" Тогда
                    КодСтраны=ТекЧисло;
                    Уровень="Город";
                ИначеЕсли Уровень="Номер" Тогда
                    Телефон=ТекЧисло;
                    Уровень="Добавочный";
                КонецЕсли;
                ТекЧисло="";
            КонецЕсли;
            Если Симв=")"тогда //Имеем код города
                Если Уровень="Город" Тогда
                    КодГорода=ТекЧисло;
                    Уровень="Номер";
                ИначеЕсли Уровень="Добавочный" Тогда
                    Добавочный=ТекЧисло;
                    Уровень="Номер";
                КонецЕсли;
                ТекЧисло="";
            КонецЕсли;
            Если Симв="#" тогда //Имеем код города
                Телефон=ТекЧисло;
                ТекЧисло="";
                Уровень="Добавочный";
            КонецЕсли;
            Если Симв="," Тогда
                ТелефонГотов=Истина;
            КонецЕсли;
        Иначе
            ТелефонГотов=истина;
        КонецЕсли;
        
        Если ТелефонГотов Тогда
            Если ТекЧисло<>"" Тогда
                Если Уровень="Добавочный" Тогда
                    Добавочный=ТекЧисло;
                ИначеЕсли Уровень="Город" Тогда
                    КодГорода=ТекЧисло;
                ИначеЕсли Уровень="Страна" Тогда
                    КодСтраны=ТекЧисло;
                Иначе
                    Телефон=ТекЧисло;
                КонецЕсли;
            КонецЕсли;
            
            //Анализируем частные случаи
            //67895
            Если Телефон="" И КодСтраны<>"" И КодГорода="" Тогда
                Телефон=КодСтраны;
                КодСтраны="";
            КонецЕсли;
            
            //67895(13)
            Если КодСтраны<>"" И Телефон=""  И КодГорода<>"" И Добавочный="" Тогда
                Телефон=КодСтраны;
                Добавочный=КодГорода;
                КодГорода="";
                КодСтраны="";
            КонецЕсли;
            
            ТелефонГотов=ложь;
            ВНачало=истина;
            стрНомер=Новый Структура("КодСтраны,КодГорода,Телефон,Добавочный", КодСтраны,КодГорода,Телефон,Добавочный);
            Рез.Добавить(стрНомер);
        КонецЕсли;
    КонецЦикла;
    Возврат Рез;
КонецФункции




Функция ТелефонныйНомерСобрать(агрТелефоны) Экспорт
    Рез="";
    Для Каждого стрТелефон из агрТелефоны Цикл
        Телефон=стрТелефон.Телефон;
        Если СтрДлина(Телефон)=6 Тогда
            Делитель=3;
        ИначеЕсли СтрДлина(Телефон)=7 Тогда
            Делитель=3;
        ИначеЕсли СтрДлина(Телефон)=8 Тогда
            Делитель=4;
        ИначеЕсли СтрДлина(Телефон)=4 Тогда
            Делитель=2;
        Иначе
            Делитель=0;
        КонецЕсли;
        Если Делитель<>0 Тогда
            Телефон=Сред(Телефон, 1, Делитель)+"-"+Сред(Телефон, Делитель+1);
        КонецЕсли;

        Рез=Рез
        +?(Рез="","",",")
        +?(стрТелефон.КодСтраны="", "", "+"+стрТелефон.КодСтраны)
        +?(стрТелефон.КодГорода="", "" ,"("+стрТелефон.КодГорода+")")
        +?(стрТелефон.Телефон="", "", Телефон)  //добавить разбор по символам
        +?(стрТелефон.Добавочный="","","#"+стрТелефон.Добавочный)

    КонецЦикла;
    Возврат Рез;
КонецФункции


Не самый красивый код, но работает, как часы.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика