Код 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, ТаблицаЖурналаРегистрации);
КонецЕсли;
КонецЦикла;
// Переименовываем колонки журнала регистрации к типу "Имя"
ПереименоватьКолонкиТаблицыЖурналаРегистрации(ТаблицаЖурналаРегистрации, "Имя", , ТаблицаКолонок);
КонецПроцедуры