From 225d2bf3af12af22c788bdebf96ede9ec990dfb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D0=B5=D0=B4=D1=8F=D0=BA=D0=BE=D0=B2=20=D0=A1=D0=B5?= =?UTF-8?q?=D1=80=D0=B3=D0=B5=D0=B9?= Date: Thu, 1 Nov 2018 23:53:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= =?UTF-8?q?=20-=20=D0=BD=D0=B5=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20=D0=B2=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=BE=D0=BC=20=D1=80=D0=B5=D0=B6?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5.=20=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.settings/ManagedEnvironments.prefs | 10 + .../.settings/RuntimePropertyLaunch.prefs | 2 + .../CommonModules/ОбновлениеДанных/Module.bsl | 389 +++++++++--------- .../ОбновлениеДанныхРегламентное/Module.bsl | 15 +- .../ОбщегоНазначенияКлиентСервер/Module.bsl | 272 ++++++------ .../ManagedApplicationModule.bsl | 4 - .../ГраницыЧтенияДанных/ManagerModule.bsl | 8 +- .../ГраницыЧтенияДанных.mdo | 15 + .../УправлениеФоновымиЗаданиямиЗагрузки.mdo | 5 +- 9 files changed, 383 insertions(+), 337 deletions(-) create mode 100644 parsing-tech-log/.settings/ManagedEnvironments.prefs create mode 100644 parsing-tech-log/.settings/RuntimePropertyLaunch.prefs diff --git a/parsing-tech-log/.settings/ManagedEnvironments.prefs b/parsing-tech-log/.settings/ManagedEnvironments.prefs new file mode 100644 index 0000000..7f3994c --- /dev/null +++ b/parsing-tech-log/.settings/ManagedEnvironments.prefs @@ -0,0 +1,10 @@ +CLIENT=false +EXTERNAL_CONN=false +MNG_CLIENT=false +MOBILE_CLIENT=false +MOBILE_SERVER=false +MOBILE_THIN_CLIENT=false +SERVER=true +THIN_CLIENT=true +WEB_CLIENT=false +eclipse.preferences.version=1 diff --git a/parsing-tech-log/.settings/RuntimePropertyLaunch.prefs b/parsing-tech-log/.settings/RuntimePropertyLaunch.prefs new file mode 100644 index 0000000..41c3528 --- /dev/null +++ b/parsing-tech-log/.settings/RuntimePropertyLaunch.prefs @@ -0,0 +1,2 @@ +ClientServer=true +eclipse.preferences.version=1 diff --git a/parsing-tech-log/src/CommonModules/ОбновлениеДанных/Module.bsl b/parsing-tech-log/src/CommonModules/ОбновлениеДанных/Module.bsl index d4b9667..f5f061f 100644 --- a/parsing-tech-log/src/CommonModules/ОбновлениеДанных/Module.bsl +++ b/parsing-tech-log/src/CommonModules/ОбновлениеДанных/Module.bsl @@ -29,7 +29,8 @@ //пропуск пустых файлов ФайлТЖ = Новый Файл(ИмяФайлаДляРазбора); - Если ФайлТЖ.Размер()<=3 Тогда + РазмерФайла = ФайлТЖ.Размер(); + Если РазмерФайла <=3 Тогда Возврат 0; КонецЕсли; @@ -45,7 +46,14 @@ Если СтрокаТекста = Неопределено Тогда //может быть прочитано строк не поменялось а полностью поменялось - РегистрыСведений.ГраницыЧтенияДанных.УстановитьСостояние(Замер, Процесс, ПроцессID, Период, ПрочитаноСтрок, ДатаНачалаЧтения); + РегистрыСведений.ГраницыЧтенияДанных.УстановитьСостояние( + Замер, + Процесс, + ПроцессID, + Период, + ПрочитаноСтрок, + ДатаНачалаЧтения, + РазмерФайла); Возврат 0; КонецЕсли; @@ -149,7 +157,14 @@ Текст.Закрыть(); // Обвновление инфорации о количестве прочитанных строк - РегистрыСведений.ГраницыЧтенияДанных.УстановитьСостояние(Замер, Процесс, ПроцессID, Период, ПрочитаноСтрок, ДатаНачалаЧтения); + РегистрыСведений.ГраницыЧтенияДанных.УстановитьСостояние( + Замер, + Процесс, + ПроцессID, + Период, + ПрочитаноСтрок, + ДатаНачалаЧтения, + РазмерФайла); Возврат РазобраноСтрок; КонецФункции @@ -173,6 +188,62 @@ Возврат СокрЛП(Результат); КонецФункции +Функция ПолучитьВременныеПараметрыПоСвойствамФайла(Знач ФайлТЖ) Экспорт + + СвойстваФайла = новый Структура("Год,День,Месяц,Час,ДатаФайла"); + + СвойстваФайла.Год = Число(Лев(ФайлТЖ.Имя, 2)); + СвойстваФайла.Месяц = Число(Сред(ФайлТЖ.Имя, 3, 2)); + СвойстваФайла.День = Число(Сред(ФайлТЖ.Имя, 5, 2)); + СвойстваФайла.Час = Число(Прав(ФайлТЖ.ИмяБезРасширения, 2)); + СвойстваФайла.ДатаФайла = Дата(СвойстваФайла.Год + 2000, СвойстваФайла.Месяц, СвойстваФайла.День, СвойстваФайла.Час, 0, 0); + + Возврат СвойстваФайла; + +КонецФункции // ПрочитатьЖурналПоРегистру + +#КонецОбласти + +#Область ЧтениеИзОбработки + +Процедура ЗагрузкаЖурнала(Замер=Неопределено,КаталогТЖ="",КлючФоновогоЗадания="") Экспорт + //TODO: объединить с ЗагрузкаЖурналаПредварительноОчистить + Если Замер=Неопределено Тогда + ЗамерОбъект = Справочники.Замеры.СоздатьЭлемент(); + ЗамерОбъект.Наименование = "Новый Замер"; + ЗамерОбъект.ПолныйПуть = КаталогТЖ; + ЗамерОбъект.Записать(); + Замер = ЗамерОбъект.Ссылка; + КонецЕсли; + + ПрочитатьЖурнал(Замер,КаталогТЖ,КлючФоновогоЗадания); +КонецПроцедуры + +Процедура ЗагрузкаЖурналаПредварительноОчистить(Замер=Неопределено,КаталогТЖ="", ЗагрузитьФоново=Ложь) Экспорт + + Если Замер=Неопределено Тогда + ЗамерОбъект = Справочники.Замеры.СоздатьЭлемент(); + ЗамерОбъект.Наименование = "Новый Замер"; + ЗамерОбъект.ПолныйПуть = КаталогТЖ; + ЗамерОбъект.Записать(); + Замер = ЗамерОбъект.Ссылка; + Иначе + ОчиститьЖурналы(Замер); + КонецЕсли; + + //TODO: переренести проверку состояния загрузки из ПрочитатьЖурнал + Если ЗагрузитьФоново Тогда + Если Константы.МаксимальноеКолВоПотоковДляОднойЗагрузки.Получить()>1 Тогда + ОбновлениеДанных.ЗагрузкаТЖПотоками(Замер,КаталогТЖ); + Иначе + ОбновлениеДанных.ПрочитатьЖурнал(Замер,КаталогТЖ); + КонецЕсли; + Иначе + ПрочитатьЖурнал(Замер,КаталогТЖ); + КонецЕсли; + +КонецПроцедуры + Процедура ПрочитатьЖурнал(Замер=Неопределено,КаталогТЖ="",КлючФоновогоЗадания="") Экспорт ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеНачато",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания); @@ -283,188 +354,6 @@ ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеЗавершено",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания); КонецПроцедуры // ПрочитатьЖурнал -Процедура ПрочитатьЖурналПоРегистру(Замер=Неопределено,КлючФоновогоЗадания="") Экспорт - - ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеНачато",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания); - - Если НЕ ЗначениеЗаполнено(КлючФоновогоЗадания) Тогда - ВызватьИсключение "Ключ фонового задания быть заполнен!"; - КонецЕсли; - - ФайлыТЖ = ПолучитьНеОбработаннеФайлыПоРегистру(Замер,КлючФоновогоЗадания); - - Индекс = 0; -// МоментНачалаЧтения = ТекущаяУниверсальнаяДатаВМиллисекундах(); - НужноКопировать = ?(ЗначениеЗаполнено(Замер),НЕ Замер.НеРабочийКаталог,Истина); - - Попытка - ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеНачато"); - - // временный файл нужен для копирования в него файлов логов, т.к. те которые в текущий момент пишуться не могут быть помещены во временное хранилище (1с ругается на невозможность получить доступ) - ИмяВрФайла = ПолучитьИмяВременногоФайла("log"); - - Индекс = Индекс + 1; - - Для Каждого ФайлТЖ Из ФайлыТЖ Цикл - - ИмяПапки = ФайлТЖ.ИмяПапки; - - МассивПапок = новый Массив; - - Если Найти(ИмяПапки,"\") Тогда - МассивПапок = СтрРазделить(ИмяПапки,"\",Ложь); - Иначе - МассивПапок = СтрРазделить(ИмяПапки,"/",Ложь); - КонецЕсли; - - ИмяПапки = МассивПапок[МассивПапок.ВГраница()]; - - ИмяПапки = СтрЗаменить(ИмяПапки, "_", Символы.ПС); - Процесс = СтрПолучитьСтроку(ИмяПапки, 1); - ПроцессID = СтрПолучитьСтроку(ИмяПапки, 2); -// КоличествоФайловТЖ = ФайлыТЖ.Количество(); - ИндексФайла = 0; - - СвойстваФайла = ПолучитьВременныеПараметрыПоСвойствамФайла(ФайлТЖ); - - ДатаФайла = СвойстваФайла.ДатаФайла; -// Год = СвойстваФайла.Год; -// День = СвойстваФайла.День; -// Месяц = СвойстваФайла.Месяц; -// Час = СвойстваФайла.Час; - ДатаНачалаОбработки = ТекущаяДата(); - - УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"ДатаНачала",ДатаНачалаОбработки); - - - ИндексФайла = ИндексФайла + 1; - - СостояниеЧтения = РегистрыСведений.ГраницыЧтенияДанных.ПолучитьСостояние(Замер, Процесс, ПроцессID, ДатаФайла); - Если СостояниеЧтения.ПрочитанПолностью Тогда - Продолжить; - КонецЕсли; - - //Определение не получались ли уже по этому процессу данные за более поздний час -// Если Не ПроверитьНаличиеДанныхПоПроцессуЗаПериод(Замер,Процесс, ПроцессID, Дата(Год + 2000, Месяц, День, 0, 0, 0), Час) Тогда - - //... Если данные за более поздний час не получались - чтение файла, разбор и помещение в регистр -// АдресФайла = ""; - Если НужноКопировать=Истина Тогда - КопироватьФайл(ФайлТЖ.ПолноеИмя, ИмяВрФайла); - Иначе - ИмяВрФайла = ФайлТЖ.ПолноеИмя; - КонецЕсли; - РазобраноСтрок = РазобратьФайл(Процесс, ПроцессID, ДатаФайла, ИмяВрФайла, Замер); - УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Разобрано",РазобраноСтрок); - ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.РазобранФайл",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания+" строк:"+РазобраноСтрок); - Если НужноКопировать=Истина Тогда - УдалитьФайлы(ИмяВрФайла); - КонецЕсли; - -// КонецЕсли; - - УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Обработан",Истина); - УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Длительность",ТекущаяДата()-ДатаНачалаОбработки); - - КонецЦикла; - - Исключение - ТекстОшибки = ОписаниеОшибки(); - ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеПрервано",УровеньЖурналаРегистрации.Ошибка,Неопределено,Замер,ТекстОшибки,); - ВызватьИсключение ТекстОшибки; - КонецПопытки; - - ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеЗавершено",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания); - -КонецПроцедуры - -Функция ПолучитьВременныеПараметрыПоСвойствамФайла(Знач ФайлТЖ) Экспорт - - СвойстваФайла = новый Структура("Год,День,Месяц,Час,ДатаФайла"); - - СвойстваФайла.Год = Число(Лев(ФайлТЖ.Имя, 2)); - СвойстваФайла.Месяц = Число(Сред(ФайлТЖ.Имя, 3, 2)); - СвойстваФайла.День = Число(Сред(ФайлТЖ.Имя, 5, 2)); - СвойстваФайла.Час = Число(Прав(ФайлТЖ.ИмяБезРасширения, 2)); - СвойстваФайла.ДатаФайла = Дата(СвойстваФайла.Год + 2000, СвойстваФайла.Месяц, СвойстваФайла.День, СвойстваФайла.Час, 0, 0); - - Возврат СвойстваФайла; - -КонецФункции // ПрочитатьЖурналПоРегистру - -Функция ПолучитьНеОбработаннеФайлыПоРегистру(Замер,КлючФоновогоЗадания) - - Запрос = новый Запрос; - Запрос.Текст = "ВЫБРАТЬ - | Т.Замер КАК Замер, - | Т.ПутьКФайлу КАК ПутьКФайлу, - | Т.Обработан КАК Обработан, - | Т.КлючФоновогоЗадания КАК КлючФоновогоЗадания, - | Т.ДатаФайла КАК ДатаФайла, - | Т.Длительность КАК Длительность, - | Т.ДатаНачала КАК ДатаНачала, - | Т.РазмерФайла КАК РазмерФайла, - | Т.Имя КАК Имя, - | Т.ИмяБезРасширения КАК ИмяБезРасширения, - | Т.ПолноеИмя КАК ПолноеИмя, - | Т.КоличествоФайловВсего КАК КоличествоФайловВсего, - | Т.ИмяПапки КАК ИмяПапки, - | ВЫРАЗИТЬ(Т.ИмяПапки КАК СТРОКА(250)) КАК ИмяПапкиДляУпорядочивания - |ИЗ - | РегистрСведений.УправлениеФоновымиЗаданиямиЗагрузки КАК Т - |ГДЕ - | Т.Замер = &Замер - | И Т.КлючФоновогоЗадания = &КлючФоновогоЗадания - | И Т.Обработан = ЛОЖЬ - | - |УПОРЯДОЧИТЬ ПО - | ИмяПапкиДляУпорядочивания, - | ДатаФайла"; - Запрос.УстановитьПараметр("Замер",Замер); - Запрос.УстановитьПараметр("КлючФоновогоЗадания",КлючФоновогоЗадания); - - Возврат Запрос.Выполнить().Выгрузить(); - -КонецФункции - -Процедура ЗагрузкаЖурнала(Замер=Неопределено,КаталогТЖ="",КлючФоновогоЗадания="") Экспорт - //TODO: объединить с ЗагрузкаЖурналаПредварительноОчистить - Если Замер=Неопределено Тогда - ЗамерОбъект = Справочники.Замеры.СоздатьЭлемент(); - ЗамерОбъект.Наименование = "Новый Замер"; - ЗамерОбъект.ПолныйПуть = КаталогТЖ; - ЗамерОбъект.Записать(); - Замер = ЗамерОбъект.Ссылка; - КонецЕсли; - - ПрочитатьЖурнал(Замер,КаталогТЖ,КлючФоновогоЗадания); -КонецПроцедуры - -Процедура ЗагрузкаЖурналаПредварительноОчистить(Замер=Неопределено,КаталогТЖ="", ЗагрузитьФоново=Ложь) Экспорт - - Если Замер=Неопределено Тогда - ЗамерОбъект = Справочники.Замеры.СоздатьЭлемент(); - ЗамерОбъект.Наименование = "Новый Замер"; - ЗамерОбъект.ПолныйПуть = КаталогТЖ; - ЗамерОбъект.Записать(); - Замер = ЗамерОбъект.Ссылка; - Иначе - ОчиститьЖурналы(Замер); - КонецЕсли; - - //TODO: переренести проверку состояния загрузки из ПрочитатьЖурнал - Если ЗагрузитьФоново Тогда - Если Константы.МаксимальноеКолВоПотоковДляОднойЗагрузки.Получить()>1 Тогда - ОбновлениеДанных.ЗагрузкаТЖПотоками(Замер,КаталогТЖ); - Иначе - ОбновлениеДанных.ПрочитатьЖурнал(Замер,КаталогТЖ); - КонецЕсли; - Иначе - ПрочитатьЖурнал(Замер,КаталогТЖ); - КонецЕсли; - -КонецПроцедуры - #КонецОбласти #Область ЧтениеЖурналаПотоками @@ -670,6 +559,136 @@ КонецПроцедуры +Функция ПолучитьНеОбработаннеФайлыПоРегистру(Замер,КлючФоновогоЗадания) + + Запрос = новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | Т.Замер КАК Замер, + | Т.ПутьКФайлу КАК ПутьКФайлу, + | Т.Обработан КАК Обработан, + | Т.КлючФоновогоЗадания КАК КлючФоновогоЗадания, + | Т.ДатаФайла КАК ДатаФайла, + | Т.Длительность КАК Длительность, + | Т.ДатаНачала КАК ДатаНачала, + | Т.РазмерФайла КАК РазмерФайла, + | Т.Имя КАК Имя, + | Т.ИмяБезРасширения КАК ИмяБезРасширения, + | Т.ПолноеИмя КАК ПолноеИмя, + | Т.КоличествоФайловВсего КАК КоличествоФайловВсего, + | Т.ИмяПапки КАК ИмяПапки, + | ВЫРАЗИТЬ(Т.ИмяПапки КАК СТРОКА(250)) КАК ИмяПапкиДляУпорядочивания + |ИЗ + | РегистрСведений.УправлениеФоновымиЗаданиямиЗагрузки КАК Т + |ГДЕ + | Т.Замер = &Замер + | И Т.КлючФоновогоЗадания = &КлючФоновогоЗадания + | И Т.Обработан = ЛОЖЬ + | + |УПОРЯДОЧИТЬ ПО + | ИмяПапкиДляУпорядочивания, + | ДатаФайла"; + Запрос.УстановитьПараметр("Замер",Замер); + Запрос.УстановитьПараметр("КлючФоновогоЗадания",КлючФоновогоЗадания); + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +Процедура ПрочитатьЖурналПоРегистру(Замер=Неопределено,КлючФоновогоЗадания="") Экспорт + + ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеНачато",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания); + + Если НЕ ЗначениеЗаполнено(КлючФоновогоЗадания) Тогда + ВызватьИсключение "Ключ фонового задания быть заполнен!"; + КонецЕсли; + + ФайлыТЖ = ПолучитьНеОбработаннеФайлыПоРегистру(Замер,КлючФоновогоЗадания); + + Индекс = 0; +// МоментНачалаЧтения = ТекущаяУниверсальнаяДатаВМиллисекундах(); + НужноКопировать = ?(ЗначениеЗаполнено(Замер),НЕ Замер.НеРабочийКаталог,Истина); + + Попытка + ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеНачато"); + + // временный файл нужен для копирования в него файлов логов, т.к. те которые в текущий момент пишуться не могут быть помещены во временное хранилище (1с ругается на невозможность получить доступ) + ИмяВрФайла = ПолучитьИмяВременногоФайла("log"); + + Индекс = Индекс + 1; + + Для Каждого ФайлТЖ Из ФайлыТЖ Цикл + + ИмяПапки = ФайлТЖ.ИмяПапки; + + МассивПапок = новый Массив; + + Если Найти(ИмяПапки,"\") Тогда + МассивПапок = СтрРазделить(ИмяПапки,"\",Ложь); + Иначе + МассивПапок = СтрРазделить(ИмяПапки,"/",Ложь); + КонецЕсли; + + ИмяПапки = МассивПапок[МассивПапок.ВГраница()]; + + ИмяПапки = СтрЗаменить(ИмяПапки, "_", Символы.ПС); + Процесс = СтрПолучитьСтроку(ИмяПапки, 1); + ПроцессID = СтрПолучитьСтроку(ИмяПапки, 2); +// КоличествоФайловТЖ = ФайлыТЖ.Количество(); + ИндексФайла = 0; + + СвойстваФайла = ПолучитьВременныеПараметрыПоСвойствамФайла(ФайлТЖ); + + ДатаФайла = СвойстваФайла.ДатаФайла; +// Год = СвойстваФайла.Год; +// День = СвойстваФайла.День; +// Месяц = СвойстваФайла.Месяц; +// Час = СвойстваФайла.Час; + ДатаНачалаОбработки = ТекущаяДата(); + + УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"ДатаНачала",ДатаНачалаОбработки); + + + ИндексФайла = ИндексФайла + 1; + + СостояниеЧтения = РегистрыСведений.ГраницыЧтенияДанных.ПолучитьСостояние(Замер, Процесс, ПроцессID, ДатаФайла); + Если СостояниеЧтения.ПрочитанПолностью Тогда + Продолжить; + КонецЕсли; + + //Определение не получались ли уже по этому процессу данные за более поздний час +// Если Не ПроверитьНаличиеДанныхПоПроцессуЗаПериод(Замер,Процесс, ПроцессID, Дата(Год + 2000, Месяц, День, 0, 0, 0), Час) Тогда + + //... Если данные за более поздний час не получались - чтение файла, разбор и помещение в регистр +// АдресФайла = ""; + Если НужноКопировать=Истина Тогда + КопироватьФайл(ФайлТЖ.ПолноеИмя, ИмяВрФайла); + Иначе + ИмяВрФайла = ФайлТЖ.ПолноеИмя; + КонецЕсли; + РазобраноСтрок = РазобратьФайл(Процесс, ПроцессID, ДатаФайла, ИмяВрФайла, Замер); + УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Разобрано",РазобраноСтрок); + ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.РазобранФайл",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания+" строк:"+РазобраноСтрок); + Если НужноКопировать=Истина Тогда + УдалитьФайлы(ИмяВрФайла); + КонецЕсли; + +// КонецЕсли; + + УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Обработан",Истина); + УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Длительность",ТекущаяДата()-ДатаНачалаОбработки); + + КонецЦикла; + + Исключение + ТекстОшибки = ОписаниеОшибки(); + ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеПрервано",УровеньЖурналаРегистрации.Ошибка,Неопределено,Замер,ТекстОшибки,); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеЗавершено",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания); + +КонецПроцедуры + #КонецОбласти #Область Служебные diff --git a/parsing-tech-log/src/CommonModules/ОбновлениеДанныхРегламентное/Module.bsl b/parsing-tech-log/src/CommonModules/ОбновлениеДанныхРегламентное/Module.bsl index 3625038..333b6f5 100644 --- a/parsing-tech-log/src/CommonModules/ОбновлениеДанныхРегламентное/Module.bsl +++ b/parsing-tech-log/src/CommonModules/ОбновлениеДанныхРегламентное/Module.bsl @@ -27,14 +27,15 @@ СписокФайлов = НайтиФайлы(РеквизитыЗадания.ПолныйПуть, "*.log", Истина); Для Каждого Файл из СписокФайлов Цикл + //пропускать каталоги Если Файл.ЭтоКаталог() Тогда Продолжить; КонецЕсли; - + //пропускать пустые файлы Если Файл.Размер()<=3 Тогда Продолжить; КонецЕсли; - + //пропускать если не в периоде загрузки ПериодФайла = ПолучитьПериодПоИмениФайла(Файл.ИмяБезРасширения); Если ИспользуетсяОграничениеПериода Тогда Если ЗначениеЗаполнено(РеквизитыЗадания.НачалоПериода) И ПериодФайла < НачалоЧаса(РеквизитыЗадания.НачалоПериода) @@ -42,12 +43,11 @@ Продолжить; КонецЕсли; КонецЕсли; - + //пропускать файл текущего периода если не загрузка в реальном времени Если НЕ РеквизитыЗадания.ЗагрузкаВРеальномВремени И Файл.ИмяБезРасширения = ИмяТекущегоФайла Тогда Продолжить; - КонецЕсли; - + КонецЕсли; //получение параметров процесса по каталогу //c:\v8\log\rphost_1234\ // ^^^^^^^^^^^ @@ -55,9 +55,14 @@ ИмяИД = СтрРазделить(КаталогПроцесса, "_"); СостояниеЧтения = РегистрыСведений.ГраницыЧтенияДанных.ПолучитьСостояние(РеквизитыЗадания.Замер, ИмяИД[0], ИмяИД[1], ПериодФайла); + //пропускать прочитанные Если СостояниеЧтения.ПрочитанПолностью Тогда Продолжить; КонецЕсли; + //пропускать если размер с прошного сеанса не изменился + Если Файл.Размер() = СостояниеЧтения.РазмерФайла Тогда + Продолжить; + КонецЕсли; строкарезультата = Результат.Добавить(); строкарезультата.ПолноеИмя = Файл.ПолноеИмя; diff --git a/parsing-tech-log/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/parsing-tech-log/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl index 9a24462..d85d39a 100644 --- a/parsing-tech-log/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl +++ b/parsing-tech-log/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -585,30 +585,30 @@ // // Примечание: // Функцию нельзя использовать для объектных типов (СправочникОбъект, ДокументОбъект и т.п.). -Функция СкопироватьРекурсивно(Источник) Экспорт - - Перем Приемник; - - ТипИсточника = ТипЗнч(Источник); - Если ТипИсточника = Тип("Структура") Тогда - Приемник = СкопироватьСтруктуру(Источник); - ИначеЕсли ТипИсточника = Тип("Соответствие") Тогда - Приемник = СкопироватьСоответствие(Источник); - ИначеЕсли ТипИсточника = Тип("Массив") Тогда - Приемник = СкопироватьМассив(Источник); - ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда - Приемник = СкопироватьСписокЗначений(Источник); -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - ИначеЕсли ТипИсточника = Тип("ТаблицаЗначений") Тогда - Приемник = Источник.Скопировать(); -#КонецЕсли - Иначе - Приемник = Источник; - КонецЕсли; - - Возврат Приемник; - -КонецФункции +//Функция СкопироватьРекурсивно(Источник) Экспорт +// +// Перем Приемник; +// +// ТипИсточника = ТипЗнч(Источник); +// Если ТипИсточника = Тип("Структура") Тогда +// Приемник = СкопироватьСтруктуру(Источник); +// ИначеЕсли ТипИсточника = Тип("Соответствие") Тогда +// Приемник = СкопироватьСоответствие(Источник); +// ИначеЕсли ТипИсточника = Тип("Массив") Тогда +// Приемник = СкопироватьМассив(Источник); +// ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда +// Приемник = СкопироватьСписокЗначений(Источник); +//#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +// ИначеЕсли ТипИсточника = Тип("ТаблицаЗначений") Тогда +// Приемник = Источник.Скопировать(); +//#КонецЕсли +// Иначе +// Приемник = Источник; +// КонецЕсли; +// +// Возврат Приемник; +// +//КонецФункции // Создает копию значения типа Структура. // @@ -618,17 +618,17 @@ // Возвращаемое значение: // Структура - копия исходной структуры. // -Функция СкопироватьСтруктуру(СтруктураИсточник) Экспорт - - СтруктураРезультат = Новый Структура; - - Для Каждого КлючИЗначение Из СтруктураИсточник Цикл - СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение)); - КонецЦикла; - - Возврат СтруктураРезультат; - -КонецФункции +//Функция СкопироватьСтруктуру(СтруктураИсточник) Экспорт +// +// СтруктураРезультат = Новый Структура; +// +// Для Каждого КлючИЗначение Из СтруктураИсточник Цикл +// СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение)); +// КонецЦикла; +// +// Возврат СтруктураРезультат; +// +//КонецФункции // Создает копию значения типа Соответствие. // @@ -638,61 +638,61 @@ // Возвращаемое значение: // Соответствие - копия исходного соответствия. // -Функция СкопироватьСоответствие(СоответствиеИсточник) Экспорт - - СоответствиеРезультат = Новый Соответствие; - - Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл - СоответствиеРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение)); - КонецЦикла; - - Возврат СоответствиеРезультат; - -КонецФункции - -// Создает копию значения типа Массив. +//Функция СкопироватьСоответствие(СоответствиеИсточник) Экспорт +// +// СоответствиеРезультат = Новый Соответствие; +// +// Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл +// СоответствиеРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение)); +// КонецЦикла; +// +// Возврат СоответствиеРезультат; // -// Параметры: -// МассивИсточник - Массив - массив, копию которого необходимо получить. -// -// Возвращаемое значение: -// Массив - копия исходного массива. +//КонецФункции // -Функция СкопироватьМассив(МассивИсточник) Экспорт - - МассивРезультат = Новый Массив; - - Для Каждого Элемент Из МассивИсточник Цикл - МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент)); - КонецЦикла; - - Возврат МассивРезультат; - -КонецФункции - -// Создает копию значения типа СписокЗначений. +//// Создает копию значения типа Массив. +//// +//// Параметры: +//// МассивИсточник - Массив - массив, копию которого необходимо получить. +//// +//// Возвращаемое значение: +//// Массив - копия исходного массива. +//// +//Функция СкопироватьМассив(МассивИсточник) Экспорт +// +// МассивРезультат = Новый Массив; +// +// Для Каждого Элемент Из МассивИсточник Цикл +// МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент)); +// КонецЦикла; +// +// Возврат МассивРезультат; +// +//КонецФункции // -// Параметры: -// СписокИсточник - СписокЗначений - список значений, копию которого необходимо получить. -// -// Возвращаемое значение: -// СписокЗначений - копия исходного списка значений. -// -Функция СкопироватьСписокЗначений(СписокИсточник) Экспорт - - СписокРезультат = Новый СписокЗначений; - - Для Каждого ЭлементСписка Из СписокИсточник Цикл - СписокРезультат.Добавить( - СкопироватьРекурсивно(ЭлементСписка.Значение), - ЭлементСписка.Представление, - ЭлементСписка.Пометка, - ЭлементСписка.Картинка); - КонецЦикла; - - Возврат СписокРезультат; - -КонецФункции +//// Создает копию значения типа СписокЗначений. +//// +//// Параметры: +//// СписокИсточник - СписокЗначений - список значений, копию которого необходимо получить. +//// +//// Возвращаемое значение: +//// СписокЗначений - копия исходного списка значений. +//// +//Функция СкопироватьСписокЗначений(СписокИсточник) Экспорт +// +// СписокРезультат = Новый СписокЗначений; +// +// Для Каждого ЭлементСписка Из СписокИсточник Цикл +// СписокРезультат.Добавить( +// СкопироватьРекурсивно(ЭлементСписка.Значение), +// ЭлементСписка.Представление, +// ЭлементСписка.Пометка, +// ЭлементСписка.Картинка); +// КонецЦикла; +// +// Возврат СписокРезультат; +// +//КонецФункции // Сравнивает элементы списков значений или массивов по значениям. Функция СпискиЗначенийИдентичны(Список1, Список2) Экспорт @@ -1441,30 +1441,30 @@ // - ТипПлатформы - разделитель пути файловой системы для // указанного типа платформы. // -Функция РазделительПути(Платформа = Неопределено) Экспорт - - Если Платформа = Неопределено Тогда - - #Если ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - СистемнаяИнфо = Новый СистемнаяИнформация; - Платформа = СистемнаяИнфо.ТипПлатформы; - #ИначеЕсли Клиент Тогда - Платформа = ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента(); - #Иначе - Платформа = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера(); - #КонецЕсли - - КонецЕсли; - - Если Платформа = ТипПлатформы.Windows_x86 - ИЛИ Платформа = ТипПлатформы.Windows_x86_64 Тогда - - Возврат "\"; - Иначе - Возврат "/"; - КонецЕсли; - -КонецФункции +//Функция РазделительПути(Платформа = Неопределено) Экспорт +// +// Если Платформа = Неопределено Тогда +// +// #Если ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +// СистемнаяИнфо = Новый СистемнаяИнформация; +// Платформа = СистемнаяИнфо.ТипПлатформы; +// #ИначеЕсли Клиент Тогда +// Платформа = ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента(); +// #Иначе +// Платформа = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера(); +// #КонецЕсли +// +// КонецЕсли; +// +// Если Платформа = ТипПлатформы.Windows_x86 +// ИЛИ Платформа = ТипПлатформы.Windows_x86_64 Тогда +// +// Возврат "\"; +// Иначе +// Возврат "/"; +// КонецЕсли; +// +//КонецФункции // Возвращает имя файла с расширением. // Если расширение пустое, тогда точка не добавляется. @@ -2357,19 +2357,19 @@ // ЛюбаяСсылка - Ссылка предопределенного элемента. // Неопределено - Если элемент не найден. // -Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт - Если ВРег(Прав(ПолноеИмяПредопределенного, 13)) = ".ПУСТАЯССЫЛКА" Тогда - // Для получения пустых ссылок используется стандартная функция платформы. - Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного); - КонецЕсли; - -#Если НЕ ТонкийКлиент И НЕ ВебКлиент И НЕ ТолстыйКлиентУправляемоеПриложение Тогда - Возврат СтандартныеПодсистемыПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); -#Иначе - Возврат СтандартныеПодсистемыКлиентПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); -#КонецЕсли - -КонецФункции +//Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт +// Если ВРег(Прав(ПолноеИмяПредопределенного, 13)) = ".ПУСТАЯССЫЛКА" Тогда +// // Для получения пустых ссылок используется стандартная функция платформы. +// Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного); +// КонецЕсли; +// +//#Если НЕ ТонкийКлиент И НЕ ВебКлиент И НЕ ТолстыйКлиентУправляемоеПриложение Тогда +// Возврат СтандартныеПодсистемыПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); +//#Иначе +// Возврат СтандартныеПодсистемыКлиентПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); +//#КонецЕсли +// +//КонецФункции //////////////////////////////////////////////////////////////////////////////// // Прочие функции @@ -2520,13 +2520,13 @@ КонецФункции // Возвращает код основного языка конфигурации, например "ru". -Функция КодОсновногоЯзыка() Экспорт - #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда - Возврат Метаданные.ОсновнойЯзык.КодЯзыка; - #Иначе - Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().КодОсновногоЯзыка; - #КонецЕсли -КонецФункции +//Функция КодОсновногоЯзыка() Экспорт +// #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда +// Возврат Метаданные.ОсновнойЯзык.КодЯзыка; +// #Иначе +// Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().КодОсновногоЯзыка; +// #КонецЕсли +//КонецФункции // Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер. // Если нет клиентского приложения, возвращается Ложь. @@ -2797,11 +2797,11 @@ // Устаревшие процедуры и функции. // Устарела. Следует использовать РазделительПути. -Функция ПолучитьСлеш(Платформа = Неопределено) Экспорт - - Возврат РазделительПути(Платформа); - -КонецФункции +//Функция ПолучитьСлеш(Платформа = Неопределено) Экспорт +// +// Возврат РазделительПути(Платформа); +// +//КонецФункции // Устарела. Следует удалить все использования этой функции и ветки кода при значении Ложь. // diff --git a/parsing-tech-log/src/Configuration/ManagedApplicationModule.bsl b/parsing-tech-log/src/Configuration/ManagedApplicationModule.bsl index 621095e..e69de29 100644 --- a/parsing-tech-log/src/Configuration/ManagedApplicationModule.bsl +++ b/parsing-tech-log/src/Configuration/ManagedApplicationModule.bsl @@ -1,4 +0,0 @@ -&НаКлиенте -Процедура ОбновитьСтатус() Экспорт - СтруктураСостояния = ПолучитьИзВременногоХранилища("asdf"); -КонецПроцедуры // ОбновитьСтатус \ No newline at end of file diff --git a/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ManagerModule.bsl b/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ManagerModule.bsl index 5f26447..c6a6ff4 100644 --- a/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ManagerModule.bsl +++ b/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ManagerModule.bsl @@ -1,13 +1,14 @@ #Если Сервер ИЛИ ВнешнееСоединение Тогда Функция ПолучитьСостояние(Замер, Процесс, ПроцессИД, ПериодФайла) Экспорт - Результат = Новый Структура("ПрочитаноСтрок,ПрочитанПолностью", 0, Ложь); + Результат = Новый Структура("ПрочитаноСтрок,ПрочитанПолностью,РазмерФайла", 0, Ложь, 0); ПроцессСсылка = СправочникиСерверПовтИсп.ПолучитьПроцесс(Процесс); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ГраницыЧтенияДанных.ПрочитаноСтрок, - | ГраницыЧтенияДанных.ПрочитанПолностью + | ГраницыЧтенияДанных.ПрочитанПолностью, + | ГраницыЧтенияДанных.РазмерФайла |ИЗ | РегистрСведений.ГраницыЧтенияДанных КАК ГраницыЧтенияДанных |ГДЕ @@ -27,7 +28,7 @@ Возврат Результат; КонецФункции -Процедура УстановитьСостояние(Замер, Процесс, ПроцессID, Период, ПрочитаноСтрок, ДатаНачалаЧтения) Экспорт +Процедура УстановитьСостояние(Замер, Процесс, ПроцессID, Период, ПрочитаноСтрок, ДатаНачалаЧтения, ПрочитаноРазмер) Экспорт //если дата начала чтения больше чем конец часа (запас в 5 минут) //считаем что файл больше дополняться не будет @@ -46,6 +47,7 @@ МенеджерЗаписи.ДатаФайла = Период; МенеджерЗаписи.ПрочитаноСтрок = ПрочитаноСтрок; МенеджерЗаписи.ПрочитанПолностью = ПрочитанПолностью; + МенеджерЗаписи.РазмерФайла = ПрочитаноРазмер; МенеджерЗаписи.Записать(); КонецПроцедуры diff --git a/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ГраницыЧтенияДанных.mdo b/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ГраницыЧтенияДанных.mdo index 8b23ff5..e43ea5c 100644 --- a/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ГраницыЧтенияДанных.mdo +++ b/parsing-tech-log/src/InformationRegisters/ГраницыЧтенияДанных/ГраницыЧтенияДанных.mdo @@ -50,6 +50,21 @@ Use Use + + РазмерФайла + + ru + Размер файла + + + Number + + 15 + + + Use + Use + Замер diff --git a/parsing-tech-log/src/InformationRegisters/УправлениеФоновымиЗаданиямиЗагрузки/УправлениеФоновымиЗаданиямиЗагрузки.mdo b/parsing-tech-log/src/InformationRegisters/УправлениеФоновымиЗаданиямиЗагрузки/УправлениеФоновымиЗаданиямиЗагрузки.mdo index dc1441d..eb9b389 100644 --- a/parsing-tech-log/src/InformationRegisters/УправлениеФоновымиЗаданиямиЗагрузки/УправлениеФоновымиЗаданиямиЗагрузки.mdo +++ b/parsing-tech-log/src/InformationRegisters/УправлениеФоновымиЗаданиямиЗагрузки/УправлениеФоновымиЗаданиямиЗагрузки.mdo @@ -285,7 +285,7 @@ String - 1000 + 256 @@ -293,9 +293,6 @@ Use Use - - - true