gifts2017

Чтение журнала регистрации с конца

Опубликовал Михаил Семенов (Shaman100M) в раздел Программирование - Практика программирования

Команды для "обратного" чтения не нашел. Взял хитростью.
Итак, нам необходимо узнать результаты произошедшего в 1С события. Для этого
обрабатываем лог событий в журнале регистрации (далее ЖР) программно, перебирая
строки файла 1CV7.MLG и проверяя наличие в них поисковых слов.
Решение в лоб стандартным перебором строк с начала файла вследствие его большого
объема не пойдет, да и объект "Текст" работает медленно, нужны альтернативы.

Попробуем решить указанные проблемы, опираясь на быстрый WSH и исходя из предпосылки:
в большинстве случаев известно время, раньше которого изучаемое событие просто не могло
произойти. Это может быть также время запуска известного запланированного процесса
(обмена УРБД, например), прописавшего лог в ЖР.

Вот это и используем, узнав размер ЖР перед событием:
ОбратныйСлэш =Симв(92); // это обратный слэш, для корректности отображения ФС.

АтрибутыФайла(КаталогИБ()+"SYSLOG"+ ОбратныйСлэш +"1CV7.MLG", РазмерЖРПередСобытием); 

Событие произошло. Что дальше?
Возможности объекта Scripting.FileSystemObject совершать прыжки и быстро перебирать
строки больших файлов:

objFSO	= CreateObject("Scripting.FileSystemObject");

objTextFile = objFSO.OpenTextFile(КаталогИБ()+"SYSLOG"+ ОбратныйСлэш +"1CV7.MLG", 1,0,0);
objTextFile.Skip(РазмерЖРПередСобытием);
// вот здесь прыгаем, ждем...
Пока  objTextFile.AtEndOfStream <> -1 Цикл

Сообщить(objTextFile.Readline()); 

// перебор ЖР до конца // или прервать после получения всей информации по событию.
КонецЦикла;
objTextFile.Close();

Как вариант для незапланированных событий: можно 1 раз в день пополнять список значений "РазмерЖР_НаДату"

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Мартыненков (JohnyDeath) 20.11.07 10:19
Есть ещё один хороший и красивый вариант чтения журнала регистрации: использовать Поставщика данных для Табличного поля - журнал регистрации (документация тут: http://www.1cpp.ru/docum/html/LogDataProvider.html ). Пример есть в Репозитарий классов 1С++ от Артура Аюханова (aka artbear) http://www.1cpp.ru/forum/YaBB.pl?num=1169222935
2. Михаил Семенов (Shaman100M) 20.11.07 11:52
3. Аркадий Кучер (Abadonna) 20.11.07 12:21
>Взял хитростью
Похвальная хитрость +1
4. Евгений Мартыненков (JohnyDeath) 20.11.07 12:37
+(1) там кстати можно и журналы регистрации "чужих" баз читать
5. Михаил Семенов (Shaman100M) 20.11.07 13:08
(4) Ну да, логично было сделать для любых ЖР, они же, в отличие от объектов конфигурации, имеют одинаковую структуру.
Идею в статье сам использовал для чтения чужих ЖР в собственной программе для автообмена, скорострельность приемлимая, потом решил, что если есть возможность, то лучше все же задать имя лог-файла с чисто "своими" событиями, чем пахать чужие необъятные просторы ЖР. :) С другой стороны ЖР хранит не только последний сеанс.
6. Kiselev (kiselev) 26.11.07 09:01
Спасибо!
Воспользуюсь.
У меня много операций с большими текстами.
+1
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа