В начало

Загрузка тарифов из CSV-файла 830104с

 

            Нужно загрузить тарифы из CSV-файла «83.01.04с ***.csv».

 

Листинг. Модуль формы внешней обработки (Основные функции и процедуры)

&НаСервере

Процедура ДобавитьТарифыИзТЗ(Знач ТЗ)     

           

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

            //Структура колонок файла [83.01.04с]

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

            //0 № ЛС

            //1 Код услуги

            //2 Код поставщика

            //3 Период перерасчета

            //4 Период начисления

            //5 Код УК

            //6 Тариф

            //7 Расход

            //8 Сумма перераcчета текущее

            //9 Сумма перераcчета предыдущее

            //10 Примечание

            //11 Причина перераcчета

           

            ЗаписаноСтрок = 0;

           

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

                       

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

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

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

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

                        стрКодУслуги = ТЗ[ТекСтрока].КодУслуги;

                        стрКодПоставщика = ТЗ[ТекСтрока].КодПоставщика;

                        стрПериодНачисления = ТЗ[ТекСтрока].ПериодНачисления;

                        стрКодУК = ТЗ[ТекСтрока].КодУК;

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

                       

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

                        //Преобразуем данные

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

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

                        ссПоставщикУслугРЦ = ПолучитьСсылкуНаПоставщикаУслугРЦ(стрКодПоставщика);

                        ссУслугаРЦ = ПолучитьСсылкуНаУслугуРЦ(стрКодУслуги);

                        дПериодНачисления = НачалоМесяца(ПолучитьДатуИзСтроки(стрПериодНачисления));

                        чТариф = Число(стрТариф);

                       

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

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

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

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

                                    НЕ ЗначениеЗаполнено(дПериодНачисления) ИЛИ

                                    НЕ ЗначениеЗаполнено(ссПоставщикУслугРЦ) ИЛИ

                                    НЕ ЗначениеЗаполнено(ссУслугаРЦ) Тогда

                                               ПРОДОЛЖИТЬ;

                        КонецЕсли;

                                  

                        НЗ = РегистрыСведений.УК_СостояниеРасчетов.СоздатьНаборЗаписей();

                       

                        НЗ.Отбор.ЛС.Установить(ссЛС);

                        НЗ.Отбор.МесяцНачисления.Установить(дПериодНачисления);

                        НЗ.Отбор.ПоставщикРЦ.Установить(ссПоставщикУслугРЦ);

                        НЗ.Отбор.УслугаРЦ.Установить(ссУслугаРЦ);

                         

                        НЗ.Прочитать();  

                       

                        Если НЗ.Количество() = 0 Тогда

                                   ПРОДОЛЖИТЬ; 

                        ИначеЕсли  НЗ.Количество() > 1 Тогда

                                   СписокОшибок.ДобавитьСтроку("Проверить на дубли: " + стрЛС + ", " + стрПериодНачисления + ", " + стрКодПоставщика + ", " + стрКодУслуги);

                        КонецЕсли;

                       

                        Для Каждого Запись Из НЗ Цикл

                                   Если Запись.Тариф = чТариф Тогда

                                               ПРОДОЛЖИТЬ;

                                   Иначе

                                               Запись.Тариф = чТариф;

                                   КонецЕсли;                                      

                        КонецЦикла;

                       

                        Попытка

                                   ЗаписаноСтрок = ЗаписаноСтрок + 1;

                                   НЗ.Записать();

                        Исключение

                                   СписокОшибок.ДобавитьСтроку("Ошибка записи строки: " + ТекСтрока + " ЛС: " + стрЛС);

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

                       

                       

            КонецЦикла;//Цикл по строкам Икселя

 

            Сообщить("Обработано строк: " + Строка(ТекСтрока - 2 + 1));

            Сообщить("Записано строк: " + ЗаписаноСтрок);

           

КонецПроцедуры//ДобавитьТарифыИзТЗ

 

&НаСервере

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

           

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

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

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

           

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

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

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

 

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

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

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

                        Сообщить("Проверьте загрузочный файл, должно быть 9 колонок, в этом - " + МассивСтроки.Количество());

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

            КонецЕсли;  

            КонецЦикла;

           

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

            //Структура колонок файла [83.01.04с]

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

            //0 № ЛС

            //1 Код услуги

            //2 Код поставщика

            //3 Период перерасчета

            //4 Период начисления

            //5 Код УК

            //6 Тариф

            //7 Расход

            //8 Сумма перераcчета текущее

            //9 Сумма перераcчета предыдущее

            //10 Примечание

            //11 Причина перераcчета

 

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

           

            тзТарифы = Новый ТаблицаЗначений;//Коды поставщиков услуг

            тзТарифы.Колонки.Добавить("ЛС");//0

            тзТарифы.Колонки.Добавить("КодУслуги");//1

            тзТарифы.Колонки.Добавить("КодПоставщика");//2

            тзТарифы.Колонки.Добавить("ПериодНачисления");//4

            тзТарифы.Колонки.Добавить("КодУК");//5

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

           

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

                       

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

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

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

                       

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

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

                                   ПРОДОЛЖИТЬ;                     

                        КонецЕсли;

                       

                        Если НЕ ЗначениеЗаполнено(МассивСтроки[0]) ИЛИ

                                    НЕ ЗначениеЗаполнено(МассивСтроки[6]) Тогда

                                   ПРОДОЛЖИТЬ;//Нет смысла

                        КонецЕсли;  

                                  

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

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

                        СтрокаТЗ.КодУслуги = МассивСтроки[1];

                        СтрокаТЗ.КодПоставщика = МассивСтроки[2];

                        СтрокаТЗ.ПериодНачисления = МассивСтроки[4];

                        СтрокаТЗ.КодУК = МассивСтроки[5];

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

                       

            КонецЦикла;

                                  

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

                        Возврат тзТарифы;

            Иначе

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

            КонецЕсли;  

                                                                                                         

КонецФункции//Загрузить830104с_ИзВремФайлаВтз

 

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

           

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

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

           

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

                       

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

                                   ДобавитьТарифыИзТЗ(тзТарифы);

                        КонецЕсли;  

                       

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

 

КонецПроцедуры//Загрузить830104с_НаСервере

 

&НаКлиенте

Процедура Чтение_830104с(Команда)

 

            Если НЕ ЗначениеЗаполнено(ЭтотОбъект.Файл830104с) Тогда

                        Возврат;

            КонецЕсли;

           

            //При переходе с клиента на сервер

            //или имя файла Иксель не видно

            //или имя временного файла другое

 

            ВремяНачала = ТекущаяДата();

            СписокОшибок.Очистить();

 

                        дд = Новый ДвоичныеДанные(ЭтотОбъект.Файл830104с);                    

                        Загрузить830104с_НаСервере(дд);

                       

            ВремяОкончания = ТекущаяДата(); 

            ЦелЧасов = Цел((ВремяОкончания - ВремяНачала)/3600);       

            ЦелМинут  = Цел((ВремяОкончания - ВремяНачала)/60);

            ДробМинут = (ВремяОкончания - ВремяНачала)/60 - Цел((ВремяОкончания - ВремяНачала)/60);

            ЦелСекунд = Цел(ДробМинут *60);

 

            Сообщить("Время загрузки: " + ЦелЧасов + " ч. " + ЦелМинут + " мин. " + ЦелСекунд + " сек.");

           

КонецПроцедуры//Чтение_830104с

 

Листинг. Модуль формы внешней обработки (Вспомогательные функции)

Функция ПолучитьДатуИзСтроки(Знач ДатаСтрока)   

           

            Если ДатаСтрока = "" Тогда

                        Возврат Дата(1,1,1);

            КонецЕсли;

 

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

            ДатаПреобразованная = Дата(1,1,1);

            Результат = Дата(1,1,1);

           

            Если МассивДат.Количество() = 3 Тогда

                        Попытка

                                   Год      = Число(МассивДат[2]);

                                   Месяц             = Число(МассивДат[1]);

                                   День   = Число(МассивДат[0]);

                                  

                                   Если Год < 3999 Тогда                                           

                                               //   для записей вида 01.02.21

                                               Если Год < 100 Тогда

                                                           Год  = Год + 2000;   

                                               КонецЕсли;

                                               ДатаПреобразованная = Дата(Год,  Месяц, День);

                                   КонецЕсли;

                                  

                        Исключение

                                   Возврат Результат;

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

                        Результат = ДатаПреобразованная;                      

            КонецЕсли;

           

            Возврат Результат;   

 

КонецФункции//ПолучитьДатуИзСтроки

 

&НаСервере

Функция ПолучитьСсылкуНаУслугуРЦ(Знач стрКодУслугиРЦ)

 

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

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

                        "ВЫБРАТЬ

                        |           УК_УслугиРЦ.Ссылка КАК Ссылка

                        |ИЗ

                        |           Справочник.УК_УслугиРЦ КАК УК_УслугиРЦ

                        |ГДЕ

                        |           УК_УслугиРЦ.КодУслугиРЦ = &чКодУслугиРЦ";

           

            Запрос.УстановитьПараметр("чКодУслугиРЦ", Число(стрКодУслугиРЦ));

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

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

           

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

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

            Иначе

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

            КонецЕсли;  

           

КонецФункции//ПолучитьСсылкуУслугуРЦ

 

&НаСервере

Функция ПолучитьСсылкуНаПоставщикаУслугРЦ(Знач стрКодПоставщикаРЦ)

 

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

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

                        "ВЫБРАТЬ

                        |           УК_ПоставщикиУслугРЦ.Ссылка КАК Ссылка

                        |ИЗ

                        |           Справочник.УК_ПоставщикиУслугРЦ КАК УК_ПоставщикиУслугРЦ

                        |ГДЕ

                        |           УК_ПоставщикиУслугРЦ.КодПоставщикаРЦ = &чКодПоставщикаРЦ";

           

            Запрос.УстановитьПараметр("чКодПоставщикаРЦ", Число(стрКодПоставщикаРЦ));          

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

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

           

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

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

            Иначе

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

            КонецЕсли;  

           

КонецФункции//ПолучитьСсылкуНаПоставщикаУслугРЦ

 

&НаСервере

Функция ПолучитьСсылкуНаЛС(Знач стрЛС)

 

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

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

                        "ВЫБРАТЬ

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

                        |ИЗ

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

                        |ГДЕ

                        |           Партнеры.УК_ЛицевойСчетЕИРЦ = &ЛС";

           

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

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

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

           

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

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

            Иначе

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

            КонецЕсли;  

           

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