//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;

Функция ПолучитьСписокЗначенийЭлементаОтбора(ПолеОтбора) Экспорт 
	
	Если ПолеОтбора = "Уровень" Тогда
		ВозможныеЗначения = Новый СписокЗначений;
		ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Ошибка);
		ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Предупреждение);
		ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Информация); 
		ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Примечание);
	ИначеЕсли ПолеОтбора = "СтатусТранзакции" Тогда
		ВозможныеЗначения = Новый СписокЗначений;
		ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.Зафиксирована);
		ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.Отменена);
		ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.НеЗавершена);
		ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.НетТранзакции);
	ИначеЕсли Ложь
		Или ПолеОтбора = "Пользователь" 
		Или ПолеОтбора = "Компьютер" 
		Или ПолеОтбора = "ИмяПриложения" 
		Или ПолеОтбора = "Событие" 
		Или ПолеОтбора = "Метаданные" 
		Или ПолеОтбора = "РабочийСервер" 
		Или ПолеОтбора = "ОсновнойIPПорт" 
		Или ПолеОтбора = "ВспомогательныйIPПорт" 
		Или ПолеОтбора = "РазделениеДанныхСеанса" 
	Тогда
		СтруктураЗначенийОтбора = ПолучитьЗначенияОтбораЖурналаРегистрации(ПолеОтбора, ИмяФайла);
		ВозможныеЗначения = СтруктураЗначенийОтбора[ПолеОтбора];
	Иначе
		ВозможныеЗначения = Неопределено;
	КонецЕсли; 
	Если ВозможныеЗначения <> Неопределено Тогда
		Если ТипЗнч(ВозможныеЗначения) = Тип("СписокЗначений") Тогда
			СписокВыбора = ВозможныеЗначения;
		ИначеЕсли ТипЗнч(ВозможныеЗначения) = Тип("Массив") Тогда
			СписокВыбора = Новый СписокЗначений;
			СписокВыбора.ЗагрузитьЗначения(ВозможныеЗначения);
			СписокВыбора.СортироватьПоЗначению();
		ИначеЕсли ТипЗнч(ВозможныеЗначения) = Тип("Соответствие") Тогда
			СписокВыбора = Новый СписокЗначений;
			Для Каждого КлючИЗначение Из ВозможныеЗначения Цикл
				СписокВыбора.Добавить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
			КонецЦикла; 
			СписокВыбора.СортироватьПоПредставлению();
		КонецЕсли; 
	КонецЕсли;
	Возврат СписокВыбора;

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

Функция УстановитьОписаниеТиповЗначенияОтбора(СтрокаОтбора) Экспорт
	
	ПолеОтбора = СтрокаОтбора.Поле;
	МетаРеквизит = Метаданные().ТабличныеЧасти.ТаблицаЖурнала.Реквизиты[ПолеОтбора];
	БазовоеОписаниеТипов = МетаРеквизит.Тип;
	Если Ложь
		Или ПолеОтбора = "Уровень"
		Или ПолеОтбора = "СтатусТранзакции"
		Или ПолеОтбора = "Пользователь" 
		Или ПолеОтбора = "Компьютер" 
		Или ПолеОтбора = "ИмяПриложения" 
		Или ПолеОтбора = "Событие" 
		Или ПолеОтбора = "Метаданные" 
		Или ПолеОтбора = "РабочийСервер" 
		Или ПолеОтбора = "ОсновнойIPПорт" 
		Или ПолеОтбора = "ВспомогательныйIPПорт" 
		Или ПолеОтбора = "РазделениеДанныхСеанса" 
	Тогда
		ОписаниеТипов = Новый ОписаниеТипов("СписокЗначений");
	ИначеЕсли ПолеОтбора = "Сеанс" Тогда
		ОписаниеТипов = Новый ОписаниеТипов(БазовоеОписаниеТипов, "СписокЗначений");
	Иначе
		ОписаниеТипов = БазовоеОписаниеТипов;
	КонецЕсли; 
	СтрокаОтбора.ОписаниеТипов = ОписаниеТипов;
	СтрокаОтбора.Значение = ОписаниеТипов.ПривестиЗначение(СтрокаОтбора.Значение);
	СтрокаОтбора.Представление = МетаРеквизит.Представление();
	
КонецФункции

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

Процедура ЗаполнитьОтбор() Экспорт 
	
	ДобавитьЭлементОтбора(Отбор, "Уровень");
	ДобавитьЭлементОтбора(Отбор, "Комментарий");
	ДобавитьЭлементОтбора(Отбор, "Пользователь");
	ДобавитьЭлементОтбора(Отбор, "Событие");
	ДобавитьЭлементОтбора(Отбор, "СтатусТранзакции");
	ДобавитьЭлементОтбора(Отбор, "ИмяПриложения");
	ДобавитьЭлементОтбора(Отбор, "Данные");
	ДобавитьЭлементОтбора(Отбор, "Метаданные");

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

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

Процедура ЗагрузитьДанныеЖурнала() Экспорт 
	
	Фильтр = Новый Структура;
	Если ЗначениеЗаполнено(НачалоПериода) Тогда
		Фильтр.Вставить("ДатаНачала", НачалоПериода);
	КонецЕсли;
	Если ЗначениеЗаполнено(КонецПериода) Тогда
		Фильтр.Вставить("ДатаОкончания", КонецПериода);
	КонецЕсли;
	Для Каждого СтрокаОтбора Из Отбор Цикл
		ЗначениеОтбора = СтрокаОтбора.Значение;
		Если Истина
			И ЗначениеОтбора = Неопределено 
			И СтрокаОтбора.Поле <> "Данные"
			Тогда
			СтрокаОтбора.Использование = Ложь;
		КонецЕсли; 
		Если Не СтрокаОтбора.Использование Тогда
			Продолжить;
		КонецЕсли; 
		Если ТипЗнч(ЗначениеОтбора) = Тип("СписокЗначений") Тогда
			Если ЗначениеОтбора.ТипЗначения.Типы().Количество() = 0 Тогда
				СписокЗначений = ЗначениеОтбора;
				ЗначениеОтбора = Новый Массив();
				Для Каждого ЭлементСписка Из СписокЗначений Цикл
					Если ЭлементСписка.Пометка Тогда
						Если СтрокаОтбора.Поле = "Пользователь" Тогда
							ЗначениеЭлемента = ЭлементСписка.Представление;
						Иначе
							ЗначениеЭлемента = ЭлементСписка.Значение;
						КонецЕсли; 
						ЗначениеОтбора.Добавить(ЗначениеЭлемента);
					КонецЕсли; 
				КонецЦикла;
			Иначе
				ЗначениеОтбора = ЗначениеОтбора.ВыгрузитьЗначения();
			КонецЕсли; 
		КонецЕсли; 
		Фильтр.Вставить(СтрокаОтбора.Поле, ЗначениеОтбора);
	КонецЦикла;
	
	НачалоИнтервала = ТекущаяДата();
	ЭтотОбъект.ТаблицаЗначенийЖурнала = Новый ТаблицаЗначений;
	Если АнализироватьТранзакцииСУчастиемОбъекта Тогда
		#Если Клиент Тогда
		Состояние("Анализ транзакций журнала...");
		#КонецЕсли
		ТаблицаТранзакций = Новый ТаблицаЗначений;
		ВыгрузитьЖурналРегистрации(ТаблицаТранзакций, Фильтр,, ИмяФайла, МаксимальныйРазмерВыгрузки);
		ТаблицаТранзакций.Свернуть("Транзакция");
		ТаблицаТранзакций.Сортировать("Транзакция");
		Транзакции = ТаблицаТранзакций.ВыгрузитьКолонку("Транзакция");
		Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Транзакции.Количество(), "Выгрузка журнала по транзакциям");
		ФильтрТранзакции = ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(Фильтр);
		Для Каждого Транзакция Из Транзакции Цикл
			ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
			//ФильтрТранзакции.Вставить("Транзакция", ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(Транзакция, "(",")"));
			ФильтрТранзакции.Вставить("Транзакция", Транзакция);
			Если Транзакция <> "" Тогда
				ФильтрТранзакции.Удалить("Данные");
			КонецЕсли; 
			ТаблицаТранзакции = Новый ТаблицаЗначений;
			ВыгрузитьЖурналРегистрации(ТаблицаТранзакции, ФильтрТранзакции,, ИмяФайла, МаксимальныйРазмерВыгрузки - ТаблицаЗначенийЖурнала.Количество());
			Если Транзакция = "" Тогда
				ТаблицаТранзакции = ТаблицаТранзакции.Скопировать(Новый Структура("Транзакция", ""));
			КонецЕсли; 
			ТаблицаТранзакции.Колонки.Добавить("ПорядокСтроки", Новый ОписаниеТипов("Число"));
			Для Счетчик = 1 По ТаблицаТранзакции.Количество() Цикл
				ТаблицаТранзакции[Счетчик - 1].ПорядокСтроки = ТаблицаЗначенийЖурнала.Количество() + Счетчик;
			КонецЦикла;
			Если ТаблицаЗначенийЖурнала.Колонки.Количество() = 0 Тогда
				ТаблицаЗначенийЖурнала = ТаблицаТранзакции;
			Иначе
				ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(ТаблицаТранзакции, ТаблицаЗначенийЖурнала);
			КонецЕсли; 
			Если ТаблицаЗначенийЖурнала.Количество() >= МаксимальныйРазмерВыгрузки Тогда
				Прервать;
			КонецЕсли; 
		КонецЦикла;
		ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
		//ТаблицаЗначенийЖурнала.Индексы.Добавить("Дата, ПорядокСтроки");
		//ТаблицаЗначенийЖурнала.Сортировать("Дата, ПорядокСтроки");
	Иначе
		#Если Клиент Тогда
		Состояние("Выборка из журнала регистрации...");
		#КонецЕсли
		ВыгрузитьЖурналРегистрации(ТаблицаЗначенийЖурнала, Фильтр,, ИмяФайла, МаксимальныйРазмерВыгрузки);
		ТаблицаЗначенийЖурнала.Колонки.Добавить("ПорядокСтроки", Новый ОписаниеТипов("Число"));
		Для Счетчик = 1 По ТаблицаЗначенийЖурнала.Количество() Цикл
			ТаблицаЗначенийЖурнала[Счетчик - 1].ПорядокСтроки = Счетчик;
		КонецЦикла;
	КонецЕсли; 
	ТаблицаЗначенийЖурнала.Индексы.Добавить("ПорядокСтроки");
	ТаблицаЗначенийЖурнала.Сортировать("ПорядокСтроки");
	ТаблицаЖурнала.Загрузить(ТаблицаЗначенийЖурнала);
	ЭтотОбъект.КоличествоСтрокЖурнала = ТаблицаЖурнала.Количество();
	КонецИнтервала = ТекущаяДата();
	#Если Клиент Тогда
	Состояние("");
	#КонецЕсли
	
	ДлительностьИнтервала = КонецИнтервала - НачалоИнтервала;
	Если ДлительностьИнтервала > 5 Тогда
		КолвоЧасов = Цел(ДлительностьИнтервала / 3600);
		ДлительностьИнтервалаДата = '00010101' + (КонецИнтервала - НачалоИнтервала) - КолвоЧасов * 3600;
		ДлительностьИнтервалаСтр = Формат(КолвоЧасов, "ЧН=; ЧГ=0") + ":" + Формат(ДлительностьИнтервалаДата, "ДФ=мм:сс; ДП=");
		Сообщить("Загрузка данных журнала выполнена за " + ДлительностьИнтервалаСтр);
	КонецЕсли;

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

#Если Клиент Тогда
	
Функция ОткрытьСПараметром(ПолеОтбора = "Данные", ЗначениеОтбора, ПредставлениеЗначения = Неопределено) Экспорт 
	
	Форма = ПолучитьФорму(,, ЗначениеОтбора);
	Форма.Открыть();
	Форма.Отбор.ЗаполнитьЗначения(Ложь, "Использование");
	Форма.НачалоПериода = НачалоДня(ТекущаяДата());
	Форма.КонецПериода = Неопределено;
	ДобавитьЭлементОтбора(Форма.Отбор, ПолеОтбора, ЗначениеОтбора, ПредставлениеЗначения);
	Ответ = Вопрос("Сразу выполнить выгрузку с текущим отбором?", РежимДиалогаВопрос.ОКОтмена);
	Если Ответ = КодВозвратаДиалога.ОК Тогда
		Форма.ОбновитьТаблицуЖурнала();
	КонецЕсли;
	Возврат Форма;
	
КонецФункции

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

#КонецЕсли

//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный 	Контейнер = Новый Структура();
//ирПортативный 	Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный 	Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный 		ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный 		ирПортативный.Открыть();
//ирПортативный 	КонецЕсли; 
//ирПортативный #Иначе
//ирПортативный 	ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");

Отбор.Колонки.Добавить("Использование", Новый ОписаниеТипов("Булево"));
Отбор.Колонки.Добавить("Поле", Новый ОписаниеТипов("Строка"));
Отбор.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Отбор.Колонки.Добавить("ОписаниеТипов", Новый ОписаниеТипов("ОписаниеТипов"));
Отбор.Колонки.Добавить("Значение");
ЭтотОбъект.МаксимальныйРазмерВыгрузки = 1000;