Парсинг файла MLG (журнал регистрации 1С:Предприятие 7.7)В статье приведен образец чтения журнала регистрации. Обработка не "зависает" на больших файлах регистрации (т.к. читает текст построчно), а также умеет восстанавливать ссылки на объекты по их внутреннему представлению, например, O/7549/2093806. | | Автор статьи: romix Последняя редакция №1 от 26.07.06 URL: http://kb.mista.ru/article.php?id=311 | |
Ключевые слова: журнал регистрации, mlg, парсер, прочитать
Скопируйте приведенный ниже код во внешний отчет. На форму поместите таблицу значений с именем ф_тз, выбор периода (НачДата, КонДата) и кнопку Сформировать.
///////////////////////////////////////////////////////////////////////
Функция вед0(ч)
Если ч<10 Тогда
Возврат "0"+ч;
Иначе
Возврат ""+ч;
КонецЕсли;
КонецФункции
///////////////////////////////////////////////////////////////////////
Функция ДатаВСтроку(прм_Дата)
Возврат ""+ДатаГод(прм_Дата)+вед0(ДатаМесяц(прм_Дата))+ вед0(ДатаЧисло(прм_Дата));
КонецФункции
///////////////////////////////////////////////////////////////////////
Функция СтрокаВДату(прм_стр)
гг=0+Лев(прм_стр,4);
мм=0+Сред(прм_стр,5,2);
дд=0+Сред(прм_стр,7,2);
Возврат Дата(гг,мм,дд);
КонецФункции
///////////////////////////////////////////////////////////////////////
Функция ОбъектПоСтроке(прм_стр)
//Возвращает ссылку на объект (например, документ или справочник)
//по строке вида O/7549/2093806
стр=""""+СтрЗаменить(прм_стр,"/", """,""")+"""";
сп=СоздатьОбъект("СписокЗначений");
сп.ИзСтрокиСРазделителями(стр);
Вид=сп.ПолучитьЗначение(1);
Тип=сп.ПолучитьЗначение(2);
Код=сп.ПолучитьЗначение(3);
стр="{"""+Вид+""",""0"",""0"","""+тип+""",""0"",""0"","""+Код+"""}";
Возврат ЗначениеИзСтрокиВнутр(стр);
КонецФункции
//*******************************************
Процедура Сформировать()
ф_тз.Очистить();
ф_тз.НоваяКолонка("Дата","Дата");
ф_тз.НоваяКолонка("Время","Строка",8);
ф_тз.НоваяКолонка("Пользователь","Строка");
ф_тз.НоваяКолонка("Где","Строка",1);
ф_тз.НоваяКолонка("Действие","Строка",8);
ф_тз.НоваяКолонка("Событие","Строка",20);
ф_тз.НоваяКолонка("ДопКод","Число",5);
ф_тз.НоваяКолонка("Описание","Строка");
ф_тз.НоваяКолонка("ИД","Строка");
ф_тз.НоваяКолонка("Представление","Строка");
ф_тз.НоваяКолонка("Объект");
Если ПустоеЗначение(НачДата)=1 Тогда
Предупреждение("Укажите начальную дату.");
Возврат;
КонецЕсли;
Если ПустоеЗначение(КонДата)=1 Тогда
Предупреждение("Укажите конечную дату.");
Возврат;
КонецЕсли;
сч=0;
fso=СоздатьОбъект("Scripting.FileSystemObject");
ИмяФайла=КаталогИБ()+"SYSLOG\1cv7.mlg";
file=fso.OpenTextFile(ИмяФайла, 1, 0, 0); //Открываем файл в режиме "только чтение"
стрНачДата=ДатаВСтроку(НачДата);
стрКонДата=ДатаВСтроку(КонДата);
Пока file.AtEndOfStream=0 Цикл //Читаем следующую строку файла
сч=сч+1;
стр=file.ReadLine();
стрДата1=Лев(стр,17);
стрДата=Лев(стр,8);
Если сч%10=0 Тогда
Состояние(стрДата1);
КонецЕсли;
//Пропускаем события вне указанного диапазона
Если стрДата<стрНачДата Тогда
Продолжить;
КонецЕсли;
Если стрДата>стрКонДата Тогда
Продолжить;
КонецЕсли;
стр=СтрЗаменить(стр,";",""",""");
стр=""""+стр+"""";
сп=СоздатьОбъект("СписокЗначений");
сп.ИзСтрокиСРазделителями(стр);
пДата=СтрокаВДату(сп.ПолучитьЗначение(1));
пВремя=сп.ПолучитьЗначение(2);
пПользователь=сп.ПолучитьЗначение(3);
пГде=сп.ПолучитьЗначение(4);
пДействие=сп.ПолучитьЗначение(5);
пСобытие=СокрЛП(сп.ПолучитьЗначение(6));
пДопКод=сп.ПолучитьЗначение(7);
пОписание=сп.ПолучитьЗначение(8);
Если сп.РазмерСписка()>=9 Тогда
пИД=сп.ПолучитьЗначение(9);
КонецЕсли;
Если сп.РазмерСписка()>=10 Тогда
пПредставление=сп.ПолучитьЗначение(10);
КонецЕсли;
ф_тз.НоваяСтрока();
ф_тз.Дата=пДата;
ф_тз.Время=пВремя;
ф_тз.Пользователь=пПользователь;
ф_тз.Где=пГде;
ф_тз.Действие=пДействие;
ф_тз.Событие=пСобытие;
ф_тз.ДопКод=пДопКод;
ф_тз.Описание=пОписание;
ф_тз.ИД=пИД;
ф_тз.Представление=пПредставление;
ф_тз.Объект=ОбъектПоСтроке(пИД);
КонецЦикла;
КонецПроцедуры
|