Имя: Пароль:
1C
 
Как читать постоянно дописываемый файл?
0 RomaH
 
naïve
05.05.17
10:40
Есть текстовый файлик куда постоянно пишутся данные сторонней программой
как его в 1С постоянно мониторить?
1 Dmitry1c
 
05.05.17
10:48
(0) как ты думаешь, почему придумали СУБД?
2 Fedor-1971
 
05.05.17
10:49
(0) как данные пишутся внешней программой?
1. Открыла-записала-Закрыла - как удобнее, открыл для чтения, прочитал, закрыл. Можешь через параметры файла (время последнего обращения) отмониторить было что-то дописано или нет
2. Открыла-пишем, пишем, пишем. По сути ни как, т.к. нет уверенности что там что-то вообще есть и попало ли это "что-то" на диск
3 polosov
 
05.05.17
10:49
(0) Если сторонний соф нельзя научить писать в БД, то наверно можно делать типа снапшот файла, предварительно скопировав его во временный файл и обрабатывать. И так перед каждым чтением.
4 Fedor-1971
 
05.05.17
10:51
(1) для структурованного хранения информации, совместный доступ к файлам БД появился позже, когда попытались одновременно записать данные несколько человек
5 Fedor-1971
 
05.05.17
10:52
(3) если в него пишут в этот момент что получится во временном файле?
6 бомболюк
 
05.05.17
10:53
(5) в файловых операциях тоже есть блокировки ;-)
7 mehfk
 
05.05.17
10:54
(5) Пусть программа лочит файл.
8 Fedor-1971
 
05.05.17
11:00
(6)(7) мы не знаем что за ПО пишет в файл и может ли оно его лочить.
Скопировать открытый для записи файл можно (только много ли в этом смысла), переместить нет.
Т.е. в (2) ситуация п.1, в период "файл закрыт", его можно переместить, для ситуации п.2 переместить нельзя, но можно скопировать, только нет уверенности, что буфер записи сброшен на диск
9 Fedor-1971
 
05.05.17
11:03
8+ Если допустимо, то самый правильный вариант перемещать файл во временный каталог, обрабатывать его и опять по кругу.
Есть гарантия, что мы получили новую порцию полностью дописанных данных
10 бомболюк
 
05.05.17
11:14
вариант для продвинутых: подсунуть сторонней программе вместо имени файла имя именованного канала, пусть бомбит в него, а канал слушать через ВК. В качестве средства межпроцессного взаимодействия named pipes идеально подходят.
11 mehfk
 
05.05.17
11:34
(8) Если сторонняя программа так небрежно относится к своим файлам, то ее нужно заменить :)))
12 RomaH
 
naïve
05.05.17
12:18
нормально все работает:

&НаКлиенте
Перем Текст;
&НаКлиенте
Перем Стр;

&НаКлиенте
Процедура ПрочитатьФайл(Команда)

    Текст = Новый ЧтениеТекста("\\tda600x\PBX.log\05.05.2017.log",,,,Ложь);
    
    Стр = Текст.ПрочитатьСтроку();
        
    ТекстАТС.ДобавитьСтроку(Стр);
    
    Пока Стр <> Неопределено Цикл
        
        Пока СтрДлина(Стр) < 80 Цикл
            
            ПодключитьОбработчикОжидания("ПродолжитьЧтениеФайла",0.5,Истина);
            Возврат;
        КонецЦикла;
        
        ТекстАТС.ВставитьСтроку(1,Стр);
        
        Стр = Текст.ПрочитатьСтроку();
        
        ОбработкаПрерыванияПользователя();
        
    КонецЦикла;
    
    ПодключитьОбработчикОжидания("ПродолжитьЧтениеФайла",1,Истина);
    
    
КонецПроцедуры

&НаКлиенте
Процедура ДописатьСтроку()
    
    Пока СтрДлина(Стр) < 80 Цикл
        Стр = Стр + Текст.ПрочитатьСтроку();    
        ОбработкаПрерыванияПользователя();
    КонецЦикла;
    
    ТекстАТС.ВставитьСтроку(1,Стр);
    
    ПодключитьОбработчикОжидания("ПродолжитьЧтениеФайла",1,Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьЧтениеФайла()
    
    Стр = Текст.ПрочитатьСтроку();
        
    ТекстАТС.ДобавитьСтроку(Стр);
    
    Пока Стр <> Неопределено Цикл
        
        Пока СтрДлина(Стр) < 80 Цикл
            ПодключитьОбработчикОжидания("ПродолжитьЧтениеФайла",0.5,Истина);
            Возврат;
        КонецЦикла;
        
        ТекстАТС.ВставитьСтроку(1,Стр);
        
        Стр = Текст.ПрочитатьСтроку();
        
        ОбработкаПрерыванияПользователя();
        
    КонецЦикла;
    
    ПодключитьОбработчикОжидания("ПродолжитьЧтениеФайла",1,Истина);
    
КонецПроцедуры
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан