В начало

Загрузка телефонов через почту

 

Нужно загрузить телефоны из почты из файла приложения в формате XSLX. Это по сути половина обмена между двумя базами, точнее код в Базе-приемнике.

 

Листинг. Общий модуль для регламентного задания

                         

Функция ПроверкаФорматаТелефонаИзЕДС(Знач Телефон)

           

            Телефон = СтрЗаменить(Телефон, "(", "");

            Телефон = СтрЗаменить(Телефон, ")", "");

            Телефон = СтрЗаменить(Телефон, "-", "");

            Телефон = СтрЗаменить(Телефон, " ", "");

           

            Если СтрДлина(Телефон) <> 11 ИЛИ

                        Лев(Телефон, 1) <> "8" Тогда

                        Возврат ЛОЖЬ;

            Иначе

                        Возврат ИСТИНА;

            КонецЕсли;

           

КонецФункции

 

&НаСервере

Функция ПроверкаТелефонаВЛС(Знач ЛС, Знач Телефон)

           

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |           Партнеры.Ссылка КАК Ссылка

                        |ИЗ

                        |           Справочник.Партнеры КАК Партнеры

                        |ГДЕ

                        |           Партнеры.Ссылка = &Ссылка

                        |           И Партнеры.F1_ТелефонСтрока ПОДОБНО &Телефон";

           

            Запрос.УстановитьПараметр("Ссылка", ЛС);

            Запрос.УстановитьПараметр("Телефон", "%" + Телефон + "%");

 

            Результат = Запрос.Выполнить();  

            Выборка = Результат.Выбрать();

           

            Если Выборка.Следующий() Тогда

                        Возврат Истина;

            Иначе

                        Возврат Ложь;

            КонецЕсли;   

           

КонецФункции//ПроверкаТелефонаВЛС

 

&НаСервере

Функция ПолучитьСсылкуНаЛС(Знач стрФИО, Знач стрКодФИАС)

           

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |           Партнеры.Ссылка КАК Ссылка

                        |ИЗ

                        |           Справочник.Партнеры КАК Партнеры

                        |ГДЕ

                        |           Партнеры.F1_Дом.КодДомаПоФИАС = &КодФИАС

                        |           И Партнеры.F1_ФИО = &ФИО";

           

            Запрос.УстановитьПараметр("ФИО", стрФИО);

            Запрос.УстановитьПараметр("КодФИАС", стрКодФИАС);

           

            Результат = Запрос.Выполнить();  

            Выборка = Результат.Выбрать();

           

            Если Выборка.Следующий() Тогда

                        Возврат Выборка.Ссылка;

            Иначе

                        Возврат Неопределено;

            КонецЕсли;   

           

КонецФункции//ПолучитьСсылкуНаЛС

 

&НаСервере

Процедура ЗагрузитьТелефоны_ИзТЗ(Знач тзТелефоны)       

           

            //============================

            //Колонки ТЗ

            //============================

            //1 - ФИО

            //2 - КодФИАС

            //3 - Телефоны

           

            Для Каждого ТекСтр Из тзТелефоны Цикл

                        //==============

                        //Строковые

                        //==============

                        стрФИО = ТекСтр.ФИО;

                        стрКодФИАС = ТекСтр.КодФИАС;

                        стрТелефоны = ТекСтр.Телефоны;

                       

                        //=====================

                        //Преобразование типов

                        //=====================

                        //дДатаОплаты = СтрокуВДату(стрДатаОплаты);

                        мТелефоны = СтрРазделить(стрТелефоны, ";", Ложь);

                       

                        Если НЕ ЗначениеЗаполнено(стрФИО) ИЛИ

                                    НЕ ЗначениеЗаполнено(стрКодФиас) ИЛИ

                                    НЕ ЗначениеЗаполнено(стрТелефоны) Тогда

                                   ПРОДОЛЖИТЬ;

                        КонецЕсли;

           

                        //============

                        //Ссылки

                        //============

                        ссЛС = ПолучитьСсылкуНаЛС(стрФИО, стрКодФИАС);

                       

                        Если НЕ ЗначениеЗаполнено(ссЛС) Тогда

                                   ПРОДОЛЖИТЬ;

                        КонецЕсли;   

                       

                        //===================================

                        //Проверяем телефон в ЛС и добавляем,

                        //если его нет

                        //===================================

                        Для Каждого ТекТел Из мТелефоны Цикл

                                   НаличиеТелефонаВДЗФЗ = ПроверкаТелефонаВЛС(ссЛС, ТекТел);

                                   ПроверкаФормата = ПроверкаФорматаТелефонаИзЕДС(ТекТел);

                                  

                                   Если НЕ НаличиеТелефонаВДЗФЗ И

                                                ПроверкаФормата Тогда

                                                

                                               обЛС = ссЛС.ПолучитьОбъект();

                                              

                                               Если ЗначениеЗаполнено(ссЛС.F1_ТелефонСтрока) Тогда

                                                          

                                                           Если Прав(ссЛС.F1_ТелефонСтрока, 1) <> ";" Тогда

                                                                       обЛС.F1_ТелефонСтрока = ссЛС.F1_ТелефонСтрока + ";" + ТекТел;

                                                           Иначе

                                                                       обЛС.F1_ТелефонСтрока = ссЛС.F1_ТелефонСтрока + ТекТел;

                                                           КонецЕсли;

                                                          

                                               Иначе

                                                           обЛС.F1_ТелефонСтрока = ТекТел;

                                               КонецЕсли;   

                                              

                                               Попытка 

                                                           обЛС.Записать();

                                               Исключение 

                                               КонецПопытки;

                                              

                                   КонецЕсли;

                        КонецЦикла;//мТелефоны   

                       

            КонецЦикла;//тзТелефоны

                       

КонецПроцедуры

 

&НаСервере

Функция ЗагрузитьТелефоны_ИзВремФайла_вТЗ(ИмяВремФайла)

                       

            //Создаем Табличный документ для перебора

            ТабличныйДокумент = Новый ТабличныйДокумент;

            ТабличныйДокумент.Прочитать(ИмяВремФайла);

           

            //Заголовки таблицы

            Заголовки = "";

            Для НомерКолонки = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл

                        Заголовки = Заголовки + НомерКолонки + " " + СокрЛП(ТабличныйДокумент.Область(1, НомерКолонки).Текст) + Символы.ПС; 

                        Если ТабличныйДокумент.ШиринаТаблицы <> 7 Тогда

                        КонецЕсли;   

            КонецЦикла;

           

            //============================

            //Колонки файла с Телефонами

            //============================

            //1 ФИО

            //2 КодФИАС

            //3 Телефоны

 

            тзТелефоны = Новый ТаблицаЗначений;

            тзТелефоны.Колонки.Добавить("ФИО");//1

            тзТелефоны.Колонки.Добавить("КодФИАС");//2

            тзТелефоны.Колонки.Добавить("Телефоны");//3

 

            Если ТабличныйДокумент.Области.Количество() > 1 Тогда

                        //Зафиксировать ошибку

            КонецЕсли;   

           

            //Перебор строк

            Для НомерСтроки = 2 По ТабличныйДокумент.ВысотаТаблицы Цикл

                                              

                        иксФИО = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, 1).Текст);

                        иксКодФИАС = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, 2).Текст);

                        иксТелефоны = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, 3).Текст);

                       

                        //=======================

                        //Добавляем строку в ТЗ

                        //=======================

                        Если НЕ ЗначениеЗаполнено(иксФИО) ИЛИ

                                    НЕ ЗначениеЗаполнено(иксКодФИАС) ИЛИ

                                    НЕ ЗначениеЗаполнено(иксТелефоны) Тогда

                                               ПРОДОЛЖИТЬ;

                        КонецЕсли; 

                       

                        СтрокаТЗ = тзТелефоны.Добавить();   

                       

                        СтрокаТЗ.ФИО = иксФИО;

                        СтрокаТЗ.КодФИАС = иксКодФИАС;

                        СтрокаТЗ.Телефоны = иксТелефоны;

                                              

            КонецЦикла;//Перебор строк

           

            Если ЗначениеЗаполнено(тзТелефоны) Тогда

                        Возврат тзТелефоны;

            Иначе

                        Возврат Неопределено;

            КонецЕсли;   

                                                                                                         

КонецФункции

 

&НаСервере

Процедура ЗагрузитьТелефоны(Знач ДвоичныеДанныеФайла)

           

            НачалоЗагрузки = ТекущаяДата();

            ИмяВремФайлаНаСервере = ПолучитьИмяВременногоФайла("xlsx");

            ДвоичныеДанныеФайла.Записать(ИмяВремФайлаНаСервере);      

           

                        тзТелефоны = ЗагрузитьТелефоны_ИзВремФайла_вТЗ(ИмяВремФайлаНаСервере);

                        тзТелефоны.Свернуть("ФИО, КодФИАС, Телефоны", );

                       

                        Если ЗначениеЗаполнено(тзТелефоны) Тогда

                                   ЗагрузитьТелефоны_ИзТЗ(тзТелефоны);

                        КонецЕсли;

                       

            РегистрыСведений.ЖурналЗагрузкиДанных.ЗаписатьВЖурналЗагрузкиДанных("Загрузка телефонов из ЕДС", ИмяВремФайлаНаСервере, ТекущаяДата() - НачалоЗагрузки, тзТелефоны.Количество());

                       

            УдалитьФайлы(ИмяВремФайлаНаСервере);//Удаляем временные файлы

 

КонецПроцедуры//ЗагрузитьТелефоны

 

&НаСервере

Функция СозданиеИнтернетПрофиля(Знач ТекЯщик)

 

    ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль;

    ПочтовыйПрофиль.ВремяОжидания = 300;

           

            // Исходящая почта

            //Если ФормироватьIMAPПрофиль Тогда

            ПочтовыйПрофиль.АдресСервераIMAP = ТекЯщик.АдресСервераIMAP;

            ПочтовыйПрофиль.ПользовательIMAP = ТекЯщик.ПользовательIMAP;

            ПочтовыйПрофиль.ПарольIMAP = ТекЯщик.ПарольIMAP;

            ПочтовыйПрофиль.ПортIMAP = ТекЯщик.ПортIMAP;

           

            Попытка

                        ПочтовыйПрофиль.ИспользоватьSSLIMAP = Истина;

            Исключение

            КонецПопытки;       

            //КонецЕсли;

 

            //Если ФормироватьSMTPПрофиль Тогда

            ПочтовыйПрофиль.АдресСервераSMTP   = ТекЯщик.АдресСервераSMTP;

            ПочтовыйПрофиль.ПортSMTP           = ТекЯщик.ПортSMTP;

            ПочтовыйПрофиль.ПользовательSMTP   = ТекЯщик.ПользовательSMTP;

            ПочтовыйПрофиль.ПарольSMTP         = ТекЯщик.ПарольSMTP;

            ПочтовыйПрофиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;

           

            Попытка

                        //ПочтовыйПрофиль.ИспользоватьSSLSMTP = Истина;

            Исключение

            КонецПопытки;

 

             // Входящая почта

            //Если ФормироватьPOP3Профиль Тогда

            //ПочтовыйПрофиль.АдресСервераPOP3 = "pop.mail.ru";

            //ПочтовыйПрофиль.Пользователь = "user";

            //ПочтовыйПрофиль.Пароль = ЭтаФорма.Пароль;         

            //ПочтовыйПрофиль.ПортPOP3 = 995;

            //ПочтовыйПрофиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;

           

            Попытка                                         

                        //ПочтовыйПрофиль.ИспользоватьSSLPOP3 = Истина;

            Исключение

            КонецПопытки;

 

    Возврат ПочтовыйПрофиль;

 

КонецФункции

 

&НаСервере

Функция ПолучитьПисьмаСПочтовогоСервера(Знач ТекЯщик)

           

            Профиль = СозданиеИнтернетПрофиля(ТекЯщик);

            Почта = Новый ИнтернетПочта;

           

            Попытка

                        Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);

            Исключение

                        Сообщить(ОписаниеОшибки());

                        Возврат Неопределено;

            КонецПопытки;

           

            мПисьма = Новый Массив;

            мПисьма = Почта.Выбрать(Ложь);

           

            Если мПисьма.Количество() > 0 Тогда

                       

                        стПисьма = Новый Структура;

                        стПисьма.Вставить("Почта", Почта);

                        стПисьма.Вставить("мПисьма", мПисьма);

                       

                        Возврат стПисьма;

            Иначе

                        Возврат Неопределено;

            КонецЕсли;

                       

КонецФункции//ПолучитьПисьмаСПочтовогоСервера

 

&НаСервере

Процедура ПрочитатьПочтуНаСервере(Знач ТекЯщик)

            стПисьма = ПолучитьПисьмаСПочтовогоСервера(ТекЯщик);

           

            Если ЗначениеЗаполнено(стПисьма) Тогда

                        мПисьма = стПисьма.мПисьма;

                        Почта = стПисьма.Почта;   

            Иначе

                        Возврат;

            КонецЕсли;   

           

            Если ЗначениеЗаполнено(мПисьма) Тогда

                        Для Каждого Эл Из мПисьма Цикл

                                   Тема = Эл.Тема;

                                   Вложения = Эл.Вложения;

                                   Если ЗначениеЗаполнено(Вложения) Тогда

                                               Для Каждого Вл Из Вложения Цикл         

                                                           ИмяФайла = Вл.ИмяФайла;

                                                           Данные = Вл.Данные; 

                                                                                                                     

                                                           //===================================

                                                           //XSLX-файл с телефонами

                                                           //===================================

                                                           Если СтрНайти(ИмяФайла, ".xlsx") > 0 Тогда

                                                                       ЗагрузитьТелефоны(Данные);    

                                                           КонецЕсли;   

                                                          

                                               КонецЦикла;//Вложения     

                                   КонецЕсли;   

                        КонецЦикла;//Письма         

            КонецЕсли;   

           

            //Массивы для удаления сообщений

            мСообщений = Новый Массив;

            мИД = Новый Массив; 

           

            Для Каждого Эл Из мПисьма Цикл      

                        мСообщений.Добавить(Эл);

                        мИД.Добавить(Эл.Идентификатор[0]);

            КонецЦикла;

           

            //Удаляем почту

            Почта.УдалитьСообщения(мПисьма);//Достаточно так

            //Почта.УдалитьСообщения(мСообщений);

            //Почта.УдалитьСообщения(мИД);

            Почта.ОчиститьУдаленныеСообщения();//Для IMAP

            Почта.Отключиться();         

           

КонецПроцедуры

 

&НаСервере

Процедура ПереборЯщиков() 

           

            Выборка = Справочники.НастройкиДляЗагрузкиТелефоновИзЕДС.Выбрать();

           

            Пока Выборка.Следующий() Цикл

                        Если НЕ Выборка.ПометкаУдаления Тогда

                                   ПрочитатьПочтуНаСервере(Выборка);

                        КонецЕсли;   

            КонецЦикла;

           

КонецПроцедуры

 

////////////////////////////////////////////

Функция ДляРегламентногоЗадания() Экспорт

            ПереборЯщиков();

КонецФункции