Имя: Пароль:
1C
1С v8
Прочесть текстовый файл
,
0 lirt82
 
13.01.20
09:09
Всем привет, коллеги подскажите такая ситуация: на входе в здание офиса установлены турникеты, все сотрудники для входа и выхода используют карточки, программа которая управляет турникетами это фиксирует. Далее программа выплевывает файл *.txt, его нужно обработать в базе 1С. Вопрос каким методом 1С прочесть?
Считается первая запись на оси времени в файле по сотруднику это вход(в течении дня может выходить, напрм, в магаз, покурить), а последняя запись по этому сотруднику на оси времени это выход, в файле рядом с ФИО есть табельный номер "0000000024" - как его можно из строки поймать? да и сами строки отделить друг от друга?
пример файла ниже:

01.11.2019 7:23:10 Проход 0 Центральный вход 3 Этаж:Выход 0 10 Pertov A. 0000000024

01.11.2019 8:25:12 Доступ предоставлен 0 Центральный вход 3 Этаж:Вход 3 10 Ivanov A. 0000000165

01.11.2019 18:25:12 Проход 0 Центральный вход 3 Этаж:Вход 3 10 Ivanov A. 0000000165

01.11.2019 18:34:06 Доступ предоставлен 0 Центральный вход 3 Этаж:Выход 0 10 Pertov A. 0000000024
1 Fish
 
13.01.20
09:14
(0) "да и сами строки отделить друг от друга?" - А в файле все данные одной строкой что ли? Без символа ПС или ВК?
2 lirt82
 
13.01.20
09:15
(1) не понял, пример выше
т.е. строка запись следующая строка запись
3 HawkEye
 
13.01.20
09:17
(0) ТабНомер = Прав(строкафайла, 10);
4 Fish
 
13.01.20
09:17
(2) Если между строками есть разделитель, тогда читаешь стандартно:
ЧтениеТекста (TextReader)
ПрочитатьСтроку (ReadLine)
Синтаксис:
ПрочитатьСтроку(<Разделитель>)
Параметры:
<Разделитель> (необязательный)
Тип: Строка.
Разделитель строк. Если не указан, то совпадает с указанным при открытии файла.
Значение по умолчанию: ПС.
Возвращаемое значение:
Тип: Строка, Неопределено.
В случае, если читаемый файл завершен, то возвращается Неопределено.
Описание:
Считывает строку текста, ограниченную разделителем.
5 lirt82
 
13.01.20
09:17
(1) новая строка начинается с даты и времени, как вариант хочу предложить можно ли в начало и конец строки добавлять спец. символ
пример
{01.11.2019 7:23:10 Проход 0 Центральный вход 3 Этаж:Выход 0 10 Pertov A. 0000000024}

{01.11.2019 8:25:12 Доступ предоставлен 0 Центральный вход 3 Этаж:Вход 3 10 Ivanov A. 0000000165}
6 HawkEye
 
13.01.20
09:18
(5) кому предложить?
7 Кирпич
 
13.01.20
09:19
стаж 10 лет
8 Fish
 
13.01.20
09:19
(5) Занафига это, если у тебя и так, судя по (0), строки разделены переводом строки?
9 lirt82
 
13.01.20
09:19
(6) тому кто выгружает из программы эти текстовые файлы
10 Fish
 
13.01.20
09:20
(9) Посмотри, есть ли в конце строки символ ПС.
11 lirt82
 
13.01.20
09:20
(8) просто вариант
12 lirt82
 
13.01.20
09:22
(7) это называется лень использовать Синтаксис помощник)) когда можно сюда написать и получить ГОТОВЫЙ ответ:)
13 HawkEye
 
13.01.20
09:23
(9) т.е. ты даже не попробовал прочитать что есть?
14 HawkEye
 
13.01.20
09:24
(12) это не лень....
15 ezhikofff
 
13.01.20
09:25
да, за 10 лет можно было самому придумать и сюда выложить, а мы оценим..
16 isa2net
 
13.01.20
09:29
В БСП работу со строками можно посмотреть.
17 dezss
 
13.01.20
09:42
ОФФ. Я вот тут подумал. Надо к нику еще коэффициент цеплять. Соотношение комментов/тем юзверя. Сразу будет понятно многое)
18 DES
 
13.01.20
10:21
(0) сократить пробелы справа
найти первый пробел справа
с него+1 до конца строки идет табномер
19 edem911
 
13.01.20
10:28
(0) Уходите от текстовых файлов. Большинство баз СКУД на SQL, читайте напрямую ее. Или попросите разработчиком сделать SQL для обмена. На стороне 1С обычный регистр, который заполняется Select-ом с даты последней записи из SQL СКУД.
20 edem911
 
13.01.20
10:35
(19) а по поиску табномера в тексте:

Текст="01.11.2019 8:25:12 Доступ предоставлен 0 Центральный вход 3 Этаж:Вход 3 10 Ivanov A. 0000000165";
    Табномер=Прав(СокрЛП(Текст),СтрДлина(СокрЛП(Текст))-(СтрНайти(СокрЛП(Текст)," ",НаправлениеПоиска.СКонца)));

21 DES
 
13.01.20
10:39
(20) нэт
22 edem911
 
13.01.20
10:43
(21) чего это?
23 DES
 
13.01.20
10:45
сред(Текст,СтрНайти(СокрП(Текст)," ",НаправлениеПоиска.СКонца)+1)
24 DES
 
13.01.20
10:48
если знаешь что формат табномера фиксированный то в сред() указывай длину
25 1Сергей
 
13.01.20
10:59
(17) Миллениалы придумали полоску под ником?
26 dezss
 
13.01.20
12:16
(25) Полоска не говорит о количестве тем-сообщений.
27 Garykom
 
гуру
13.01.20
12:25
(0) Если нет разделителей отличных от " " между полями то никак.
Потому что слетит все к чертям если изменится "Центральный вход" на "Парадная" или "2-й боковой вход"
28 Garykom
 
гуру
13.01.20
12:26
Заводить шаблоны с параметрами и ключевыми словами между ними и искать на соответствие шаблону.
Нечто вроде RegExp только самопальное.
29 1Сергей
 
13.01.20
12:32
(26) вроде, она зависит от этого
30 ДенисЧ
 
13.01.20
12:36
(29) Нет
31 Garykom
 
гуру
13.01.20
12:39
(30) Предлагаешь добавить толщину полоски в зависимости от числа тем и флуда?
Хм можно не сплошь утолщать а по кусочкам-периодам активности, будет прикольно и наглядно у кого больше.
32 1Сергей
 
13.01.20
12:52
(30) там же вроде сложная формула была. не?
33 Lama12
 
13.01.20
13:29
(0) Даже если ты разберешь строки, то до идентификации "входов" и "выходов", очень далеко, т.к. по одному пропуску может пройти несколько человек, или зайти без пропуска могут.
Например, при переноске тяжестей, или по принципу "забыл пропуск, пропусти".
Еще вариант, человек работал в ночную смену. Его выход, по твоим правилам будет считаться входом.
Так что, в (0) не полноценные данные. Если можешь попросить тех кто это делает что-то добавить, то попроси добавить идентификатор входа и выхода.
34 DES
 
13.01.20
15:11
(33)  а чет и нечет не поможет?
35 dezss
 
13.01.20
15:20
(34) нет. (33) прав. Входы и выходы должны считаться отдельно. Как раз чтобы можно было бы определять несостыковки.
36 Garykom
 
гуру
13.01.20
15:27
(35) Вход и Выход там уже отдельно, кто обратил внимание.
Только хрен выпарсите легко и просто.
37 lirt82
 
02.03.20
13:54
апну свою тему
как после чтения сделать запись в файл?
Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда
        Предупреждение("Выберите файл для загрузки!");
        Возврат
    Иначе
        мСтрокФайла = Новый Массив();
        Файл = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
                
        ТекСтрока = Файл.ПрочитатьСтроку();
        Если ТекСтрока <> Неопределено Тогда
            мСтрокФайла.Добавить(ТекСтрока);
        КонецЕсли;
        
        Пока ТекСтрока <> Неопределено Цикл
            ТекСтрока = Файл.ПрочитатьСтроку();
            Если ТекСтрока <> Неопределено Тогда
                мСтрокФайла.Добавить(ТекСтрока);
            КонецЕсли;
        КонецЦикла;
        
        Файл.Закрыть();
        
        Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
            ТекстовыйДокИзФайла = Новый ТекстовыйДокумент;
            ТекстовыйДокИзФайла.ДобавитьСтроку("@@");
            ТекстовыйДокИзФайла.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
        КонецЕсли;
                    
    КонецЕсли;

При таком коде запись в файл идет, но предварительно весь текст очищается:)
а если сделать так:

Пока ТекСтрока <> Неопределено Цикл
            ТекСтрока = Файл.ПрочитатьСтроку();
            Если ТекСтрока <> Неопределено Тогда
                мСтрокФайла.Добавить(ТекСтрока);
            КонецЕсли;
        КонецЦикла;
            
        Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
            ТекстовыйДокИзФайла = Новый ТекстовыйДокумент;
            ТекстовыйДокИзФайла.ДобавитьСтроку("@@");
            ТекстовыйДокИзФайла.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
        КонецЕсли;
    
                Файл.Закрыть();
                    
    КонецЕсли;

тогда появляется ошибка совместного доступа к файлу.
38 lirt82
 
02.03.20
13:57
т.е. мне нужно открыть файл, проверить содержимое, и затем сделать в нем запись отметку, что файл прочтен и закрыть.
39 ZDenis
 
02.03.20
16:38
(38) У тебя файл открывается для чтения. Тебе его потом надо для записи открывать. А ты же не открываешь существующий, а записываешь вместо него пустой.
P.С. За 1.5 месяца что-то не далеко продвинулся.
40 Garykom
 
гуру
02.03.20
16:46
(39) Да он и задачу не ту решает.
Читать файл нет никакой проблемы, вот как понять когда пришел а когда ушел это гм.
Если пришел когда аппарата не работала а потом при уходе система посчитала как пришел или наоборот.
41 Злопчинский
 
02.03.20
16:53
(35) как ты их посчитаешь отдельно? только если к турникету датчики стоят которые анализируют влево или вправо крутится/открывается.
42 Fish
 
02.03.20
16:59
(41) Вроде в самых простых СКУД, и у ТС, судя по (0), отдельно фиксируется событие "Доступ" - это когда приложили карточку, и собственно "Проход" - это когда крутанули турникет. Соответственно и на вход/выход через один турникет должны быть два разных события прохода.
2 + 2 = 3.9999999999999999999999999999999...