В начало

Чтение прикрепленных TXT и XLSX-файлов

 

Листинг. Модуль формы

&НаСервере

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

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

           

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

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

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

            Иначе

                        Возврат;

            КонецЕсли;   

           

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

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

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

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

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

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

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

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

                                                          

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

                                                           //Соглашения (чтение с первой строки)  

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

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

                                                                       ЗагрузитьСоглашения(Данные);

                                                           КонецЕсли;                     

                                                          

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

                                                           //Госпошлина (чтение со 2-й строки)

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

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

                                                                       ЗагрузитьОплатыГоспошлины(Данные);           

                                                           КонецЕсли;   

                                                          

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

                                   КонецЕсли;   

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

            КонецЕсли;   

           

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

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

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

           

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

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

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

            КонецЦикла;

           

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

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

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

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

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

           

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

 

&НаСервере

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

           

            Выборка = Справочники.НастройкиДляЗагрузкиРеестровОплатСНедолжника.Выбрать();

           

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

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

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

                        КонецЕсли;   

            КонецЦикла;

           

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

 

&НаКлиенте

Процедура ПрочитатьПочту(Команда)

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

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

 

 

Листинг. Загрузка TXT-файлов

&НаСервере

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

                                           

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

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

           

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

                        тзСоглашения.Свернуть("ДатаОплаты, ЛС, НаименованиеСоглашения", "СуммаОплаты");

                       

                        Если ЗначениеЗаполнено(тзСоглашения) Тогда

                                   ЗагрузитьСоглашения_ИзТЗ(тзСоглашения);

                        КонецЕсли;   

                       

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

 

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

 

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

           

            Текст = Новый ЧтениеТекста;

            Текст.Открыть(ИмяВременногоФайла, КодировкаТекста.ANSI);

            ТекСтрока = Текст.ПрочитатьСтроку();

           

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

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

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

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

            МассивСтроки = СтрРазделить(ТекСтрока, ";");  

            Для Номер = 0 По МассивСтроки.Количество() - 1 Цикл

                        Заголовки = Заголовки + Номер + " " + СокрЛП(МассивСтроки[Номер]) + Символы.ПС; 

            КонецЦикла;

           

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

            //Соглашения

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

            //0 - [ДатаОплаты]

            //1 - [СуммаОплаты]

            //2 - [ЛС]

            //3 - [Наименование]

                       

            НомерСтроки = 1;

                       

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

            тзСогл.Колонки.Добавить("ДатаОплаты");//0

            тзСогл.Колонки.Добавить("СуммаОплаты");//1

            тзСогл.Колонки.Добавить("ЛС");//2

            тзСогл.Колонки.Добавить("НаименованиеСоглашения");//3

 

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

            СтрокаТЗ.ДатаОплаты = МассивСтроки[0];

           

            Если ЭтоЧисло2( МассивСтроки[1]) Тогда

                        СтрокаТЗ.СуммаОплаты = Число(МассивСтроки[1]);

            КонецЕсли;   

           

            СтрокаТЗ.ЛС = МассивСтроки[2];

            СтрокаТЗ.НаименованиеСоглашения = МассивСтроки[3];

                       

            Пока ТекСтрока <> Неопределено Цикл

                       

                        ТекСтрока = Текст.ПрочитатьСтроку();

                        НомерСтроки = НомерСтроки + 1;

                        МассивСтроки = СтрРазделить(ТекСтрока, ";");

                       

                        Если ТекСтрока = Неопределено Тогда

                                   Прервать;

                        КонецЕсли;

                       

                        Если МассивСтроки.Количество() <> 4 Тогда   

                                   Сообщить("Строка услуг: " + НомерСтроки + " - Число колонок в строке: " + МассивСтроки.Количество()); 

                                   Продолжить;               

                        КонецЕсли;

                                                          

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

                        СтрокаТЗ.ДатаОплаты = МассивСтроки[0];

                       

                        Если ЭтоЧисло2(МассивСтроки[1]) Тогда

                                   СтрокаТЗ.СуммаОплаты = Число(МассивСтроки[1]);

                        КонецЕсли;

                       

                        СтрокаТЗ.ЛС = МассивСтроки[2];

                        СтрокаТЗ.НаименованиеСоглашения = МассивСтроки[3];                  

                                              

            КонецЦикла;//ТЗ

           

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

                        Возврат тзСогл;

            Иначе

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

            КонецЕсли;   

                                                                                                         

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

 

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

           

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

            //Соглашения

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

            //0 - [Дата]

            //1 - [Сумма]

            //2 - [ЛС]

            //3 - [Наименование]

                       

            Для ТекСтрока = 0 По ТЗ.Количество() - 1 Цикл

                       

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

                        //Строковые значения колонок

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

                        стрДатаОплаты = ТЗ[ТекСтрока].ДатаОплаты;

                        чСуммаОплаты = ТЗ[ТекСтрока].СуммаОплаты;                       

                        стрЛС = ТЗ[ТекСтрока].ЛС;

                        стрНаименованиеСоглашения = ТЗ[ТекСтрока].НаименованиеСоглашения;

 

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

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

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

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

                        стНаименованиеСоглашения = ПарсингНаименованияСоглашения(стрНаименованиеСоглашения);

                       

                        //========

                        //Ссылки

                        //========

                        ссСоглашение = ПолучитьСсылкуНаСоглашение(стНаименованиеСоглашения.Номер, стНаименованиеСоглашения.Дата);

                        ссЛС = ПолучитьСсылкуНаЛС(стрЛС);

 

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

                        //Добавить сумму в Соглашение

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

                        ПроверкаЗаписи = ПроверкаЗаписиВРеестреОплатПоСоглашениям(дДатаОплаты, ссЛС, ссСоглашение);

                        Если НЕ ПроверкаЗаписи И

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

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

 

                                   Для Каждого Эл Из обСоглашение.ГрафикПлатежей Цикл

                                              

                                               Если Эл.Оплачено = 0 Тогда

                                                           Эл.Оплачено = чСуммаОплаты;

                                                           Эл.Примечание = "Загрузка из Недолжник.рф";

                                                           Прервать;

                                               КонецЕсли;   

 

                                   КонецЦикла;//График платежей

                                  

                                   Попытка 

                                               обСоглашение.ОбменДанными.Загрузка = Истина;

                                               обСоглашение.Записать();

                                   Исключение 

                                               ПроверкаЗаписи = Истина;//Сбрасываем запись в реестр оплат

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

                                  

                        КонецЕсли;                                    

                       

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

                        //Добавить запись в Реестр оплат

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

                        Если НЕ ПроверкаЗаписи И

                                    ЗначениеЗаполнено(дДатаОплаты) И

                                    ЗначениеЗаполнено(ссЛС) И

                                    ЗначениеЗаполнено(ссСоглашение) И

                                    ЗначениеЗаполнено(чСуммаОплаты) Тогда

                                               ЗаписатьВРеестрОплатПоСоглашениям(дДатаОплаты, ссЛС, ссСоглашение, чСуммаОплаты);

                        КонецЕсли;

                       

            КонецЦикла;//ТЗ

                       

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

 

 

Листинг. Загрузка XSLX-файлов

&НаСервере

Процедура ЗагрузитьОплатыГоспошлины(Знач ДвоичныеДанныеФайла)

                                          

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

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

           

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

                        тзОплатыГП.Свернуть("ЛС, Адрес, ФИО, НомерСП, ПериодПЗ, ДатаОплаты", "СуммаОплаты");

                       

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

                                   ЗагрузитьОплатыГоспошлины_ИзТЗ(тзОплатыГП);

                        КонецЕсли;   

                       

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

 

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

 

&НаСервере

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

                       

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

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

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

           

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

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

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

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

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

                        КонецЕсли;   

            КонецЦикла;

           

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

            //Колонки файла с Госпошлиной

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

            //1 Номер ЛС

            //2 Адрес

            //3 ФИО

            //4 Сумма

            //5 Номер СП

            //6 Период ПЗ

            //7 Дата

 

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

            тзГП.Колонки.Добавить("ЛС");//1

            тзГП.Колонки.Добавить("Адрес");//2

            тзГП.Колонки.Добавить("ФИО");//3

            тзГП.Колонки.Добавить("СуммаОплаты");//4

            тзГП.Колонки.Добавить("НомерСП");//5

            тзГП.Колонки.Добавить("ПериодПЗ");//6

            тзГП.Колонки.Добавить("ДатаОплаты");//7

 

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

                        //СписокОшибок.ДобавитьСтроку("В файле загрузки несколько листов: " + ТабличныйДокумент.Области.Количество());

            КонецЕсли;   

           

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

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

                                              

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

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

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

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

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

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

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

                       

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

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

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

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

                                   //СписокОшибок.ДобавитьСтроку("ЛС не найден в строке: [" + ТабличныйДокумент.Область().Текст + "]");

                                   Продолжить;

                        КонецЕсли; 

                       

                        СтрокаТЗ = тзГП.Добавить();   

                       

                        СтрокаТЗ.ЛС = иксЛС;

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

                       

                        Если ЭтоЧисло2(иксСуммаОплаты) Тогда

                                   СтрокаТЗ.СуммаОплаты = Число(иксСуммаОплаты);

                        КонецЕсли;

                       

                        СтрокаТЗ.НомерСП = иксНомерСП;

                        СтрокаТЗ.ПериодПЗ = иксПериодПЗ;

                        СтрокаТЗ.ДатаОплаты = иксДатаОплаты;

                       

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

           

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

                        Возврат тзГП;

            Иначе

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

            КонецЕсли;   

                                                                                                         

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

 

&НаСервере

Процедура ЗагрузитьОплатыГоспошлины_ИзТЗ(Знач тзОплатыГП)          

           

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

            //Колонки ТЗ Оплат Госпошлин

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

            //1 - ЛС

            //2 - Адрес

            //3 - ФИО

            //4 - Сумма

            //5 - НомерСП

            //6 - ПериодПЗ

            //7 - Дата

           

            Для Каждого ТекСтр Из тзОплатыГП Цикл

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

                        //Строковые

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

                        стрЛС = ТекСтр.ЛС;

                        стрАдрес = ТекСтр.Адрес;

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

                        чСуммаОплаты = ТекСтр.СуммаОплаты;

                        стрНомерСП = ТекСтр.НомерСП;

                        стрПериодПЗ = ТекСтр.ПериодПЗ;

                        стрДатаОплаты = ТекСтр.ДатаОплаты;

                       

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

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

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

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

                       

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

                                   Продолжить;

                        КонецЕсли;

           

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

                        //Ссылки

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

                        ссЛС = ПолучитьСсылкуНаЛС(стрЛС);        

                        ссБП = ПолучитьСсылкуНаБП(ссЛС, стрНомерСП);

                       

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

                        //Добавить новую строку в таблицу

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

                        ПроверкаЗаписи = ПроверкаЗаписиВРеестреОплатГП(дДатаОплаты, ссЛС, ссБП);

                       

                        Если НЕ ПроверкаЗаписи И

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

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

                                  

                                   НоваяСтр = ОбБп.ВзысканоПоИП.Добавить();

                                   НоваяСтр.Период = дДатаОплаты;

                                   НоваяСтр.ИсточникПоступлений = Справочники.ИсточникиПоступлений.НайтиПоНаименованию("ЛК Недолжник");

                                   НоваяСтр.НазначениеПлатежа = Справочники.НазначениеПлатежа.НайтиПоНаименованию("Госпошлина");

                                   НоваяСтр.Сумма = чСуммаОплаты;

                                  

                                   Попытка 

                                               //обБП.ОбменДанными.Загрузка = Истина;

                                               обБП.Записать();

                                   Исключение 

                                               ПроверкаЗаписи = Истина;//Сбрасываем запись в реестре оплат

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

                                  

                        КонецЕсли;                             

                       

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

                        //Добавить запись в реестр оплат ГП

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

                        Если НЕ ПроверкаЗаписи И

                                    ЗначениеЗаполнено(дДатаОплаты) И

                                     ЗначениеЗаполнено(ссЛС) И

                                    ЗначениеЗаполнено(ссБП) И

                                    ЗначениеЗаполнено(чСуммаОплаты) Тогда

                                               ЗаписатьВРеестрОплатыГП(дДатаОплаты, ссЛС, ссБП, чСуммаОплаты);

                        КонецЕсли;

 

            КонецЦикла;//тзОплатыГП   

                       

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