Имя: Пароль:
1C
1С v8
разбор текстового файла в табличный документ
0 Wefast
 
10.01.17
09:25
Есть текстовый файл вида

завершение 01.01.2016 17:50:50
запуск 02.01.2016 09:00:00
завершение 02.01.2016 10:00:00
запуск 02.01.2016 10:00:50
завершение 02.01.2016 17:30:00
запуск 03.01.2016 09:00:00
завершение 03.01.2016 18:00:00

Нужен табличный документ вида
          | 01.01.2016  | 02.01.2016 | 03.01.2016
ЗАПУСК    |             | 09:00:00   | 09:00:00
ЗАВЕРШЕНИЕ| 17:50:50    | 10:00:00   | 18:00:00
ЗАПУСК    |             | 10:00:50
ЗАВЕРШЕНИЕ|             | 17:30:00


У меня получается вот так: http://i.imgur.com/ANAv9Kq.png
макет выглядит так: http://i.imgur.com/HgMsVVp.png

Делаю я вот так:

Табдок = новый ТабличныйДокумент;
    ТекОбъект = РеквизитФормыВЗначение("Объект");  
    Макет = ТекОбъект.ПолучитьМакет("Макет");
    ОбластьОрг = Макет.ПолучитьОбласть("ШапкаОрг|Шапка");  
    ОбластьПК = Макет.ПолучитьОбласть("ШапкаПК");
    
    
    ОбластьОрг.Параметры.Организация = "Организация";
    ТабДок.Вывести(ОбластьОрг);     
    
    ОбластьПК.Параметры.Номер = "1";
    КолВоДней = 7;
    ДатаНачала = Дата("20161101");
    Для н =1 по КолВоДней Цикл
        Обл = Макет.ПолучитьОбласть("ШапкаОрг|ОблЧисло");
        Обл.Параметры.Число = Формат(ДатаНачала+(86400*н),"ДЛФ=DD");
        ТабДок.Присоединить(Обл);         
    КонецЦикла;
    
        
    
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("C:\Users\V\Desktop\m.svyatoslavka.ZAKAZ.html",КодировкаТекста.UTF8);
    ОблЗавШ = Макет.ПолучитьОбласть("СтрЗавершение|Шапка");
    ОблЗавЧ = Макет.ПолучитьОбласть("СтрЗавершение|ОблЧисло");
    ОблЗапШ = Макет.ПолучитьОбласть("СтрЗапуск|Шапка");
    ОблЗапЧ = Макет.ПолучитьОбласть("СтрЗапуск|ОблЧисло");
    Для НомерСтроки = -Текст.КоличествоСтрок() По -1 Цикл
        

        Стр = Текст.ПолучитьСтроку(-НомерСтроки);
        а= СтрНайти(Стр,"Системное время запуска операционной системы:");
        б= СтрНайти(Стр,"Системное время завершения работы операционной системы: ");
        Если а >1 Тогда
            ТабДок.Вывести(ОблЗапШ);
            Вр = Сред(Стр,а+46,24);
            Рез = "";
            Для н=1 По СтрДлина(вр) Цикл
                Если СтрНайти("0123456789",Сред(Вр,н,1)) >0 Тогда
                    Рез = Рез + Сред(Вр,н,1);
                КонецЕсли;
            КонецЦикла;
            Для н= 1 по КолВоДней Цикл
                Если НачалоДня(Дата(Рез)) = НачалоДня(ДатаНачала+(86400*н)) Тогда
                    ОблЗапЧ.Параметры.Запуск = Формат(Дата(Рез),"ДФ=HH:mm:ss");
                КонецЕсли;
                ТабДок.Присоединить(ОблЗапЧ);
                ОблЗапЧ.Параметры.Запуск="";                     
                
            КонецЦикла;
            
        КонецЕсли;
        Если б > 1 Тогда
            ТабДок.Вывести(ОблЗавШ);
            ВР = "";
            ВР = СтрЗаменить(СтрЗаменить(СтрЗаменить(Сред(Стр,б+56,24),"-",""),"T",""),":","");
            Рез = "";
            Для н=1 По СтрДлина(вр) Цикл
                Если СтрНайти("0123456789",Сред(Вр,н,1)) >0 Тогда
                    Рез = Рез + Сред(Вр,н,1);
                КонецЕсли;
            КонецЦикла;
            Для н= 1 по КолВоДней Цикл
                Если НачалоДня(Дата(Рез)) = НачалоДня(ДатаНачала+(86400*н)) Тогда
                    ОблЗавЧ.Параметры.Завершение = Формат(Дата(Рез),"ДФ=HH:mm:ss");
                КонецЕсли;
                ТабДок.Присоединить(ОблЗавЧ);
                ОблЗавЧ.Параметры.Завершение="";                                 
                
            КонецЦикла;
            Сообщить("Завершение:"+МестноеВремя(Рез));
            
        КонецЕсли;
    КонецЦикла;
    
    Объект.ТабДок.Вывести(ТабДок);
1 Wefast
 
10.01.17
09:51
Я подумывал что то вроде:

Обрабатываю первую строку. И записываю ее в ТЗ.

Потом иду до след строки след дня. с тем же видом(завершение или запуск). Если нашел присоединил. И записал в ТЗ.

И опять перебираю строки. Первая строка которой нет в ТЗ вывожу.

Но вот как определить кол-во необходимых итераций пока не ясно.

Может есть цикл перебора текстового файла который полняется пока есть еще строки? Что то вроде Пока Файл.ПрочитатьСледСтроку() Цикл


И я бы просто удалял строки из файла если вывел ее. НЕ уверен конечно сохранится ли структура данных и не расползутся ли они
2 VladZ
 
10.01.17
10:12
Я бы делал так:
1. Из файла загрузил в ТЗ.
2. ТЗ вывел в нужном виде.
3 VladZ
 
10.01.17
11:17
+2 Пытаетесь сотрудников табелировать по времени включения/выключения компа?
4 Рэйв
 
10.01.17
11:45
(0)
1. Загрузи в тз с 3 колонками "Действие", "Дата","ДатаВремя"
2.Отсортируй по дате-времени
3. Посчитай сколько у тебя дат, выеди шапку
4. Выводи строки попорядку, сверяя с датой предыдущей строки.
   Как только дата изменилась присоединяй и выводи в      следующей колонке.

как то так...
5 DrZombi
 
гуру
10.01.17
12:40
(0) Помести все в СКД, через ТЗ
6 Wefast
 
10.01.17
14:07
(3) заказчик хочет следить за удаленными точками. Кто во сколько приходит\уходит.

Сделал так

Процедура Проверить()
Табдок = новый ТабличныйДокумент;
    ТекОбъект = РеквизитФормыВЗначение("Объект");  
    Макет = ТекОбъект.ПолучитьМакет("Макет");
    ОбластьОрг = Макет.ПолучитьОбласть("ШапкаОрг|Шапка");  
    ОбластьПК = Макет.ПолучитьОбласть("ШапкаПК");
    
    
    ОбластьОрг.Параметры.Организация = "Сириус";
    ТабДок.Вывести(ОбластьОрг);     
    
    ОбластьПК.Параметры.Номер = "1";
    КолВоДней = 7;
    ДатаНачала = Дата("20161101");
    Для н =1 по КолВоДней Цикл
        Обл = Макет.ПолучитьОбласть("ШапкаОрг|ОблЧисло");
        Обл.Параметры.Число = Формат(ДатаНачала+(86400*н),"ДЛФ=DD");
        ТабДок.Присоединить(Обл);         
    КонецЦикла;
    
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("C:\Users\V\Desktop\m.svyatoslavka.ZAKAZ.html",КодировкаТекста.UTF8);
    ОблЗавШ = Макет.ПолучитьОбласть("СтрЗавершение|Шапка");
    ОблЗавЧ = Макет.ПолучитьОбласть("СтрЗавершение|ОблЧисло");
    ОблЗапШ = Макет.ПолучитьОбласть("СтрЗапуск|Шапка");
    ОблЗапЧ = Макет.ПолучитьОбласть("СтрЗапуск|ОблЧисло");
    Перебор = 1;
    Вид = "А";
    ДанныеД = "";
    
    Пока Перебор = 1 Цикл
        т=1;
        Если Вид = "А" Тогда
            ТабДок.Вывести(ОблЗапШ);
        Иначе
            ТабДок.Вывести(ОблЗавШ);
        КонецЕсли;
        Для НомерСтроки = -Текст.КоличествоСтрок() По -1 Цикл         
            
            Стр = Текст.ПолучитьСтроку(-НомерСтроки);
            а= СтрНайти(Стр,"Системное время запуска операционной системы:");
            б= СтрНайти(Стр,"Системное время завершения работы операционной системы: ");
            Если а=0 и б=0 ТОгда
                Текст.УдалитьСтроку(-НомерСтроки);
            КонецЕсли;            
            Если а > 1 и вид="А" Тогда
                Если ДанныеД = Сред(Стр,а+46,15) Тогда
                    Продолжить;
                КонецЕсли;

                Вр = Сред(Стр,а+46,24);
                Рез = "";
                Для н=1 По СтрДлина(вр) Цикл
                    Если СтрНайти("0123456789",Сред(Вр,н,1)) >0 Тогда
                        Рез = Рез + Сред(Вр,н,1);
                    КонецЕсли;
                КонецЦикла;
                Для н= т по КолВоДней Цикл
                    ОблЗапЧ.Параметры.Запуск="";
                    Если НачалоДня(Дата(Рез)) = НачалоДня(ДатаНачала+(86400*н)) Тогда
                        ОблЗапЧ.Параметры.Запуск = Формат(Дата(Рез),"ДФ=HH:mm:ss");
                        ТабДок.Присоединить(ОблЗапЧ);
                        т = н+1;
                        Прервать;
                    Иначе
                    ТабДок.Присоединить(ОблЗапЧ);
                    
                    КонецЕсли;
                КонецЦикла;
                ДанныеТ = "а";
                ДанныеД = Сред(Стр,а+46,15);
                Текст.УдалитьСтроку(-НомерСтроки);
                ВИД = "А";
            ИначеЕсли А>1 И ВИД = "Б" Тогда
                
                ДанныеД = Сред(Стр,а+46,15);
            КонецЕсли;
            
            
            Если б > 1 и ВИД = "Б" Тогда
                Если ДанныеД = Сред(Стр,б+56,15) Тогда
                    Продолжить;
                КонецЕсли;
                
                ВР = "";
                ВР = Сред(Стр,б+56,24);
                Рез = "";
                Для н=1 По СтрДлина(вр) Цикл
                    Если СтрНайти("0123456789",Сред(Вр,н,1)) >0 Тогда
                        Рез = Рез + Сред(Вр,н,1);
                    КонецЕсли;
                КонецЦикла;
                Для н= т по КолВоДней Цикл
                    ОблЗавЧ.Параметры.Завершение="";     
                    Если НачалоДня(Дата(Рез)) = НачалоДня(ДатаНачала+(86400*н)) Тогда
                        ОблЗавЧ.Параметры.Завершение = Формат(Дата(Рез),"ДФ=HH:mm:ss");
                        ТабДок.Присоединить(ОблЗавЧ);
                        т = н+1;
                        Прервать;    
                    Иначе
                    ТабДок.Присоединить(ОблЗавЧ);
                                                
                    КонецЕсли;
                КонецЦикла;
                                
                ДанныеТ = "б";
                ДанныеД = Сред(Стр,б+56,15);
                Текст.УдалитьСтроку(-НомерСтроки);
                вид = "Б";
            ИначеЕсли б>1 И ВИД = "А" Тогда
                ДанныеД = Сред(Стр,б+56,15);
            КонецЕсли;
            
            
        КонецЦикла;
        ДанныеД = "";
        Если Вид = "А" Тогда
            Вид = "Б";
        Иначе
            ВИД = "А";
        КонецЕсли;
        Если Текст.КоличествоСтрок() = 0 Тогда
            Перебор = 0;
        КонецЕсли;
    КонецЦикла;    
    
    
    Объект.ТабДок.Вывести(ТабДок);


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

Вроде выводит как надо.