1
0
mirror of https://github.com/Polyplastic/1c-parsing-tech-log.git synced 2025-11-23 22:04:45 +02:00

Исправление ошибки - невозможен запуск в файловом режиме. Оптимизация

This commit is contained in:
Федяков Сергей
2018-11-01 23:53:02 +03:00
parent c23a5d3427
commit 225d2bf3af
9 changed files with 383 additions and 337 deletions

View File

@@ -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

View File

@@ -0,0 +1,2 @@
ClientServer=true
eclipse.preferences.version=1

View File

@@ -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, ДатаФайла, ИмяВрФайла, Замер);
УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Разобрано",РазобраноСтрок);
ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.РазобранФайл",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания+" строк:"+РазобраноСтрок);
Если НужноКопировать=Истина Тогда
УдалитьФайлы(ИмяВрФайла);
КонецЕсли;
// КонецЕсли;
УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Обработан",Истина);
УстановитьСвойствоУправленияФоновымиЗаданиями(Замер,ФайлТЖ.ПолноеИмя,КлючФоновогоЗадания,"Длительность",ТекущаяДата()-ДатаНачалаОбработки);
КонецЦикла;
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеПрервано",УровеньЖурналаРегистрации.Ошибка,Неопределено,Замер,ТекстОшибки,);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
ЗаписьЖурналаРегистрации("ЧтениеЖурналаРегистрации.ЧтениеЗавершено",УровеньЖурналаРегистрации.Предупреждение,,,КлючФоновогоЗадания);
КонецПроцедуры
#КонецОбласти
#Область Служебные

View File

@@ -27,14 +27,15 @@
СписокФайлов = НайтиФайлы(РеквизитыЗадания.ПолныйПуть, "*.log", Истина);
Для Каждого Файл из СписокФайлов Цикл
//пропускать каталоги
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
//пропускать пустые файлы
Если Файл.Размер()<=3 Тогда
Продолжить;
КонецЕсли;
//пропускать если не в периоде загрузки
ПериодФайла = ПолучитьПериодПоИмениФайла(Файл.ИмяБезРасширения);
Если ИспользуетсяОграничениеПериода Тогда
Если ЗначениеЗаполнено(РеквизитыЗадания.НачалоПериода) И ПериодФайла < НачалоЧаса(РеквизитыЗадания.НачалоПериода)
@@ -42,12 +43,11 @@
Продолжить;
КонецЕсли;
КонецЕсли;
//пропускать файл текущего периода если не загрузка в реальном времени
Если НЕ РеквизитыЗадания.ЗагрузкаВРеальномВремени
И Файл.ИмяБезРасширения = ИмяТекущегоФайла Тогда
Продолжить;
КонецЕсли;
//получение параметров процесса по каталогу
//c:\v8\log\rphost_1234\
// ^^^^^^^^^^^
@@ -55,9 +55,14 @@
ИмяИД = СтрРазделить(КаталогПроцесса, "_");
СостояниеЧтения = РегистрыСведений.ГраницыЧтенияДанных.ПолучитьСостояние(РеквизитыЗадания.Замер, ИмяИД[0], ИмяИД[1], ПериодФайла);
//пропускать прочитанные
Если СостояниеЧтения.ПрочитанПолностью Тогда
Продолжить;
КонецЕсли;
//пропускать если размер с прошного сеанса не изменился
Если Файл.Размер() = СостояниеЧтения.РазмерФайла Тогда
Продолжить;
КонецЕсли;
строкарезультата = Результат.Добавить();
строкарезультата.ПолноеИмя = Файл.ПолноеИмя;

View File

@@ -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 @@
// Устаревшие процедуры и функции.
// Устарела. Следует использовать РазделительПути.
Функция ПолучитьСлеш(Платформа = Неопределено) Экспорт
Возврат РазделительПути(Платформа);
КонецФункции
//Функция ПолучитьСлеш(Платформа = Неопределено) Экспорт
//
// Возврат РазделительПути(Платформа);
//
//КонецФункции
// Устарела. Следует удалить все использования этой функции и ветки кода при значении Ложь.
//

View File

@@ -1,4 +0,0 @@
&НаКлиенте
Процедура ОбновитьСтатус() Экспорт
СтруктураСостояния = ПолучитьИзВременногоХранилища("asdf");
КонецПроцедуры // ОбновитьСтатус

View File

@@ -1,13 +1,14 @@
#Если Сервер ИЛИ ВнешнееСоединение Тогда
Функция ПолучитьСостояние(Замер, Процесс, ПроцессИД, ПериодФайла) Экспорт
Результат = Новый Структура("ПрочитаноСтрок,ПрочитанПолностью", 0, Ложь);
Результат = Новый Структура("ПрочитаноСтрок,ПрочитанПолностью,РазмерФайла", 0, Ложь, 0);
ПроцессСсылка = СправочникиСерверПовтИсп.ПолучитьПроцесс(Процесс);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ГраницыЧтенияДанных.ПрочитаноСтрок,
| ГраницыЧтенияДанных.ПрочитанПолностью
| ГраницыЧтенияДанных.ПрочитанПолностью,
| ГраницыЧтенияДанных.РазмерФайла
|ИЗ
| РегистрСведений.ГраницыЧтенияДанных КАК ГраницыЧтенияДанных
|ГДЕ
@@ -27,7 +28,7 @@
Возврат Результат;
КонецФункции
Процедура УстановитьСостояние(Замер, Процесс, ПроцессID, Период, ПрочитаноСтрок, ДатаНачалаЧтения) Экспорт
Процедура УстановитьСостояние(Замер, Процесс, ПроцессID, Период, ПрочитаноСтрок, ДатаНачалаЧтения, ПрочитаноРазмер) Экспорт
//если дата начала чтения больше чем конец часа (запас в 5 минут)
//считаем что файл больше дополняться не будет
@@ -46,6 +47,7 @@
МенеджерЗаписи.ДатаФайла = Период;
МенеджерЗаписи.ПрочитаноСтрок = ПрочитаноСтрок;
МенеджерЗаписи.ПрочитанПолностью = ПрочитанПолностью;
МенеджерЗаписи.РазмерФайла = ПрочитаноРазмер;
МенеджерЗаписи.Записать();
КонецПроцедуры

View File

@@ -50,6 +50,21 @@
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
</resources>
<resources uuid="0d55bb78-9ecd-4d50-9b3b-7de2b5787c2b">
<name>РазмерФайла</name>
<synonym>
<key>ru</key>
<value>Размер файла</value>
</synonym>
<type>
<types>Number</types>
<numberQualifiers>
<precision>15</precision>
</numberQualifiers>
</type>
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
</resources>
<dimensions uuid="53e0adc4-e366-4641-b13f-1e525e90405d">
<name>Замер</name>
<synonym>

View File

@@ -285,7 +285,7 @@
<type>
<types>String</types>
<stringQualifiers>
<length>1000</length>
<length>256</length>
</stringQualifiers>
</type>
<mask></mask>
@@ -293,9 +293,6 @@
<maxValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
<fillValue xsi:type="core:StringValue">
<value> </value>
</fillValue>
<mainFilter>true</mainFilter>
</dimensions>
<forms uuid="9581eebd-2370-4e1b-b075-52bd5f3a0423">