helpf.pro
Регистрация

v8: Как расшифровать *.log информационной базы?

theelectric
14.06.2011 13:52Прочитано: 4848
Необходим отчет о работе моих сотрудников - т.е. когда сеанс начат, когда закончен и когда пользователем выполнялись хоть какие-нить действия. Все это необходимо представить в виде диаграммы Ганта. Но вот вопрос - как расшифровать *.log ?
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
14.06.2011 16:15Ответ № 1
(0) theelectric, посмотри на ИТС обработку КонсольАнализаЖурналаРегистрации
а примерно так:
Код 1C v 8.х
 ВыгрузитьЖурналРегистрации("D:\db\EventLog.xml",,, "D:\db\EventLog.elf");
Процедура ПрочитатьЖР(ПотокXML)
Пока ПотокXML.Прочитать() Цикл
Если ВозможностьЧтенияXML(ПотокXML) Тогда
Данные = ПрочитатьXML(ПотокXML);
КонецЕсли;
КонеццИкла;
КонецПроцедуры

Процедура ДействияФормыПрочитатьЖР(Кнопка)
ИмяФайла="D:\db\EventLog.xml";
ПотокXML = Новый ЧтениеXML();
ПотокXML.ОткрытьФайл(ИмяФайла);
ПрочитатьЖР(ПотокXML);
ПотокXML.Закрыть();
КонецПроцедуры
theelectric
14.06.2011 17:01Ответ № 2
А как понять - что означает какое поле? Ведь ВыгрузитьЖурналРегистрации() системеая процедура - что она делает не понятно...
E_Migachev
15.06.2011 10:00Ответ № 3
ВыгрузитьЖурналРегистрации() - Позволяет выгрузить журнал регистрации в XML формате. Существует возможность установить фильтр, задаваемый структурой специального формата, указывающий, какие записи журнала регистрации выгружать, а также указать колонки, которые необходимо выгружать. Если указано имя входного файла, то происходит выгрузка из указанного файла.
т.е. выгружаешь и читаешь что нужно
E_Migachev
15.06.2011 10:05Ответ № 4
+(3) из 8.2 можно выгружать в Таблицу значений
E_Migachev
15.06.2011 10:21Ответ № 5
Код 1C v 8.х
 //////////////////////////////////////////////////////////////////////////
// РАБОТА С ЖУРНАЛОМ РЕГИСТРАЦИИ
// Пример взят с http://infostart.ru/public/82987/
Функция СтрокуВМассив(Знач Стр, Разделитель = ";")

Массив = Новый Массив;

Поз = Найти(Стр, Разделитель);
Пока Поз > 0 Цикл
Массив.Добавить(Лев(Стр, Поз - 1));
Стр = Сред(Стр, Поз + 1);
Поз = Найти(Стр, Разделитель);
КонецЦикла;

Массив.Добавить(Стр);

Возврат Массив;

КонецФункции

Процедура ПрочитатьЭлементСобытияЖурналаРегистрации(ЧтениеXML, ТаблицаЖурналаРегистрации)

Колонки = ТаблицаЖурналаРегистрации.Колонки;
ЗаписьЖурналаРегистрации = ТаблицаЖурналаРегистрации.Добавить();

Пока ЧтениеXML.Прочитать() Цикл

Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "v8e:Event" Тогда
Возврат;
КонецЕсли;

// Читаем колонки события
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

Колонка = Колонки.Найти(ЧтениеXML.ЛокальноеИмя);
Если Колонка <> Неопределено Тогда

ИмяКолонки = ЧтениеXML.ЛокальноеИмя;
ТипХМЛ = ПолучитьXMLТип(ЧтениеXML);
ТипИзХМЛ = ?(ТипХМЛ = Неопределено, Неопределено, ИзXMLТипа(ТипХМЛ));

Если ЧтениеXML.Прочитать() И ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Если ИмяКолонки = "Data" И ТипИзХМЛ <> Неопределено Тогда
ЗаписьЖурналаРегистрации.Data = XMLЗначение(ТипИзХМЛ, ЧтениеXML.Значение);
ИначеЕсли ИмяКолонки = "UserID" Тогда
ЗаписьЖурналаРегистрации.UserID =
ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
Новый УникальныйИдентификатор(ЧтениеXML.Значение))
Иначе
Если Колонка.ТипЗначения <> Неопределено Тогда
ЗаписьЖурналаРегистрации[ИмяКолонки] = XMLЗначение(Колонка.ТипЗначения.Типы()[0], ЧтениеXML.Значение);
Иначе
ЗаписьЖурналаРегистрации[ИмяКолонки] = ЧтениеXML.Значение;
КонецЕсли;
КонецЕсли;
КонецЕсли;

КонецЕсли;
КонецЕсли;

КонецЦикла;

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

Процедура ПрочитатьСобытияЖурналаРегистрации(ЧтениеXML, ТаблицаЖурналаРегистрации)

Пока ЧтениеXML.Прочитать() Цикл
// Находим элемент начала события
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "v8e:Event" Тогда
ПрочитатьЭлементСобытияЖурналаРегистрации(ЧтениеXML, ТаблицаЖурналаРегистрации);
КонецЕсли;
КонецЦикла;

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

// ОСНОВЫЕ

// Возвращает таблицу значений с описанием колонок журнала регистрации.
// Структура колонок таблицы:
// Имя - имя колоноки журнала регистрации, которое указывается в функции
// "ВыгрузитьЖурналРегистрации" в параметре "Колонки" на русском языке
// Представление - представление колоноки журнала регистрации
// Name - имя колоноки журнала регистрации, которое указывается в функции
// "ВыгрузитьЖурналРегистрации" в параметре "Колонки" на Английском языке
// NameXML - имя колоноки журнала регистрации, которое используется для колонки
// в выгруженном файле журнала регистрации в формате *.xml
// Тип - тип колонки журнала регистрации (ОписаниеТипов)
Функция ТаблицаКолонокЖурналаРегистрации() Экспорт

ОписаниеКолонок =
"Уровень;;Level;;Строка
|Дата;;Date;;Дата
|ИмяПриложения;Имя приложения;ApplicationName;;Строка
|ПредставлениеПриложения;Представление приложения;ApplicationPresentation;;Строка
|Событие;;Event;EventName;Строка
|ПредставлениеСобытия;Представление события;EventPresentation;;Строка
|Пользователь;;User;UserID;ПользовательИнформационнойБазы
|ИмяПользователя;Имя пользователя;UserName;;Строка
|Компьютер;;Computer;;Строка
|Метаданные;;Metadata;MetadataName;Строка
|ПредставлениеМетаданных;Представление метаданных;MetadataPresentation;;Строка
|Комментарий;;Comment;;Строка
|Данные;;Data;;
|ПредставлениеДанных;Представление данных;DataPresentation;;Строка
|СтатусТранзакции;Статус транзакции;TransactionStatus;;Строка
|Транзакция;;TransactionID;;Строка
|Соединение;;Connection;;Строка
|РабочийСервер;Рабочий сервер;ServerName;;Строка
|ОсновнойIPПорт;Основной IP-порт;Port;;Строка
|ВспомогательныйIPПорт;Вспомогательный IP-порт;SyncPort;;Строка";

ТаблицаКолонок = Новый ТаблицаЗначений;
Колонки = ТаблицаКолонок.Колонки;
Колонки.Добавить("Имя");
Колонки.Добавить("Представление");
Колонки.Добавить("Name");
Колонки.Добавить("NameXML");
Колонки.Добавить("Тип");

ЧислоСтрок = СтрЧислоСтрок(ОписаниеКолонок);
Для НомерСтроки = 1 ПО ЧислоСтрок Цикл

МассивКолонок = СтрокуВМассив(СтрПолучитьСтроку(ОписаниеКолонок, НомерСтроки));

НоваяСтрока = ТаблицаКолонок.Добавить();
НоваяСтрока.Имя = МассивКолонок[0];
НоваяСтрока.Представление = МассивКолонок[1];
НоваяСтрока.Name = МассивКолонок[2];
НоваяСтрока.NameXML = МассивКолонок[3];
НоваяСтрока.Тип = ?(ПустаяСтрока(МассивКолонок[4]), Неопределено, Новый ОписаниеТипов(МассивКолонок[4]));

Если ПустаяСтрока(НоваяСтрока.Представление) Тогда
НоваяСтрока.Представление = НоваяСтрока.Имя;
КонецЕсли;

Если ПустаяСтрока(НоваяСтрока.NameXML) Тогда
НоваяСтрока.NameXML = НоваяСтрока.Name;
КонецЕсли;

КонецЦикла;

Возврат ТаблицаКолонок;

КонецФункции

// Переименовывает колонки таблицы значений "ТаблицаЖурналаРегистрации" к определенному типу
// "Тип" указывается как строка: "Имя", "Name", "NameXML".
Процедура ПереименоватьКолонкиТаблицыЖурналаРегистрации(ТаблицаЖурналаРегистарции, ТипИмениКолонки = "Имя", ОбновитьПредставление = Ложь, КолонокиЖурналаРегистрации = Неопределено) Экспорт

Если КолонокиЖурналаРегистрации = Неопределено Тогда
КолонокиЖурналаРегистрации = ТаблицаКолонокЖурналаРегистрации();
КонецЕсли;

Колонки = ТаблицаЖурналаРегистарции.Колонки;
Для Каждого Колонка Из Колонки Цикл
ОписаниеКолонки = КолонокиЖурналаРегистрации.Найти(Колонка.Имя, "Имя, Name, NameXML");
Если ОписаниеКолонки <> Неопределено Тогда
Колонка.Имя = ОписаниеКолонки[ТипИмениКолонки];
Если ОбновитьПредставление Тогда
Колонка.Заголовок = ОписаниеКолонки.Представление;
КонецЕсли;
КонецЕсли;
КонецЦикла;

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

// Заполняет таблицу значений "ТаблицаЖурналаРегистрации" данными журнала регистрации
// из файла *.xml "ИмяФайлаЖурналаРегистрации", который заранее должен быть выгружен с помощью
// функции глобального контекста "ВыгрузитьЖурналРегистрации".
// При загрузки формируется структура колонок таблицы "ТаблицаЖурналаРегистрации"
// (дополняется необходимыми колонками).
Процедура ЗагрузитьЖурналРегистрацииВТаблицу(ИмяФайлаЖурналаРегистрации, ТаблицаЖурналаРегистрации, СтрокаКолонок = Неопределено) Экспорт

// Проверяем тип "ТаблицаЖурналаРегистрации"
Если ТипЗнч(ТаблицаЖурналаРегистрации) <> Тип("ТаблицаЗначений") Тогда
ТаблицаЖурналаРегистрации = Новый ТаблицаЗначений;
Иначе
ТаблицаЖурналаРегистрации.Очистить();
КонецЕсли;

// Получаем таблицу всех возможных колонок
ТаблицаКолонок = ТаблицаКолонокЖурналаРегистрации();

// Переименовываем колонки журнала регистрации к типу "NameXML"
ПереименоватьКолонкиТаблицыЖурналаРегистрации(ТаблицаЖурналаРегистрации, "NameXML", , ТаблицаКолонок);

// Дополняем колонки
Колонки = ТаблицаЖурналаРегистрации.Колонки;
Если СтрокаКолонок = Неопределено Тогда
Для Каждого ОписаниеКолонки Из ТаблицаКолонок Цикл
Если Колонки.Найти(ОписаниеКолонки.NameXML) = Неопределено Тогда
Колонки.Добавить(ОписаниеКолонки.NameXML, ОписаниеКолонки.Тип , ОписаниеКолонки.Представление)
КонецЕсли
КонецЦикла;
Иначе
СтруктураКолонок = Новый Структура(СтрокаКолонок);
Для Каждого ЭлементКолонки Из СтруктураКолонок Цикл
ОписаниеКолонки = ТаблицаКолонок.Найти(ЭлементКолонки.Ключ, "Имя, Name, NameXML");
Если ОписаниеКолонки <> Неопределено Тогда
Если Колонки.Найти(ОписаниеКолонки.NameXML) = Неопределено Тогда
Колонки.Добавить(ОписаниеКолонки.NameXML, ОписаниеКолонки.Тип , ОписаниеКолонки.Представление)
КонецЕсли
КонецЕсли;
КонецЦикла;
КонецЕсли;

// Читаем файл журнала регистрации
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаЖурналаРегистрации);
Пока ЧтениеXML.Прочитать() Цикл

// Находим начало корневого элемента Журнала событий
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "v8e:EventLog" Тогда
// Читаем события
ПрочитатьСобытияЖурналаРегистрации(ЧтениеXML, ТаблицаЖурналаРегистрации);
КонецЕсли;

КонецЦикла;

// Переименовываем колонки журнала регистрации к типу "Имя"
ПереименоватьКолонкиТаблицыЖурналаРегистрации(ТаблицаЖурналаРегистрации, "Имя", , ТаблицаКолонок);

КонецПроцедуры
E_Migachev
15.06.2011 10:23Ответ № 6
+(5) вызывается и выводится так:
Код 1C v 8.х
 ИмяВыходногоФайла = ПолучитьИмяВременногоФайла(".xml");
Фильтр = Новый Структура;

Фильтр.Вставить("ДатаНачала", НачалоДня(НачПериода));
Фильтр.Вставить("ДатаОкончания", КонецДня(КонПериода));

МассивСобытий = Новый Массив;
МассивСобытий.Добавить("_$Data$_.New");
Фильтр.Вставить("Событие", МассивСобытий);

МассивМетаданных = Новый Массив;
МассивМетаданных.Добавить(Метаданные.Справочники.Контрагенты);
Фильтр.Вставить("Метаданные", МассивМетаданных);

СтрокаКолонокЖурналаРегистрации = "Дата, ИмяПользователя, Компьютер, Данные";
ВыгрузитьЖурналРегистрации(ИмяВыходногоФайла, Фильтр, СтрокаКолонокЖурналаРегистрации);

МассивТиповДанных = Новый Массив;
Для Каждого МетаданныеДанных Из МассивМетаданных Цикл
МассивТиповДанных.Добавить(Тип("СправочникСсылка." + МетаданныеДанных.Имя));
КонецЦикла;

ТаблицаСобытий = Новый ТаблицаЗначений;
ТаблицаСобытий.Колонки.Добавить("Data", Новый ОписаниеТипов(МассивТиповДанных));

ЗагрузитьЖурналРегистрацииВТаблицу(ИмяВыходногоФайла, ТаблицаСобытий, СтрокаКолонокЖурналаРегистрации);
УдалитьФайлы(ИмяВыходногоФайла);

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТаблицаСобытий", ТаблицаСобытий);
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(т.Данные КАК Справочник.Контрагенты) КАК Контрагент,
| т.Дата,
| т.ИмяПользователя КАК Пользователь,
| т.Компьютер
|ПОМЕСТИТЬ втТаблицаСобытий
|ИЗ
| &ТаблицаСобытий КАК т
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| т.Контрагент,
| т.Контрагент.Представление,
| т.Дата,
| т.Пользователь,
| т.Компьютер
|ИЗ
| втТаблицаСобытий КАК т";
Результат = Запрос.Выполнить();

ТабДок = ЭлементыФормы.ТабДок;
ТабДок.Очистить();

Макет = ПолучитьМакет("Макет");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьКонтрагент = Макет.ПолучитьОбласть("Контрагент");

Заголовок = "Добавленные контрагенты с " + Формат(НачПериода, "ДЛФ=DD") + " по " + Формат(КонПериода, "ДЛФ=DD");
ЗаголовокДляКолонтитула = "Добавленные контрагенты с " + Формат(НачПериода, "ДФ=dd.MM.yyyy") + " по " + Формат(КонПериода, "ДФ=dd.MM.yyyy");
ОбластьЗаголовок.Параметры.Заголовок = Заголовок;
ТабДок.Вывести(ОбластьЗаголовок);

ТабДок.Вывести(ОбластьШапка);

Нпп = 0;
ВыборкаПоКонтрагентам = Результат.Выбрать();
Пока ВыборкаПоКонтрагентам.Следующий() Цикл

Нпп = Нпп + 1;

ОбластьКонтрагент.Параметры.Заполнить(ВыборкаПоКонтрагентам);
ОбластьКонтрагент.Параметры.Нпп = Нпп;
ТабДок.Вывести(ОбластьКонтрагент);

КонецЦикла;

СформироватьНижнийКолонтитул(ТабДок, ЗаголовокДляКолонтитула);
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать();
theelectric
15.06.2011 16:14Ответ № 7
Спасибо, E_Migachev, разберу код! ;)
Подсказка: Для редактирования своего ответа щелкните по значку (справа)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.