///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

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

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

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

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

// Выполняет чтение событий журнала регистрации в соответствии с установленным отбором.
//
// Параметры:
//
//     ПараметрыОтчета - Структура - содержит параметры для чтения событий журнала регистрации. Содержит поля:
//      *  Журнал                  - ТаблицаЗначений         - содержит записи журнала регистрации.
//      *  ОтборЖурналаРегистрации   - Структура             - настройки отбора для чтения записей журнала регистрации:
//          ** ДатаНачала - Дата - дата начала событий (опционально).
//          ** ДатаОкончания - Дата - дата окончания событий (опционально).
//      *  КоличествоСобытий       - Число                   - ограничение числа считываемых событий журнала.
//      *  УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы.
//      *  МенеджерВладельца       - Произвольный            - менеджер объекта, в форме которого отображается журнал
//                                                             регистрации, необходим для обратного вызова функций
//                                                             оформления.
//      *  ДобавлятьДополнительныеКолонки - Булево           - определяет необходимость обратного вызова для добавления
//                                                             дополнительных колонок.
//     АдресХранилища - Строка
//                    - УникальныйИдентификатор - адрес временного хранилища для результата.
//
// Результат представляет собой структуру с полями:
//     СобытияЖурнала - ТаблицаЗначений - Отобранные события.
//
Процедура ПрочитатьСобытияЖурналаРегистрации(ПараметрыОтчета, АдресХранилища) Экспорт
	
	ОтборЖурналаНаКлиенте          = ПараметрыОтчета.ОтборЖурналаРегистрации;
	КоличествоСобытий              = ПараметрыОтчета.КоличествоПоказываемыхСобытий;
	МенеджерВладельца              = ПараметрыОтчета.МенеджерВладельца;
	ДобавлятьДополнительныеКолонки = ПараметрыОтчета.ДобавлятьДополнительныеКолонки;
	
	// Проверяем параметры на корректность.
	ДатаНачала    = Неопределено;
	ДатаОкончания = Неопределено;
	ДатыОтбораУказаны = ОтборЖурналаНаКлиенте.Свойство("ДатаНачала", ДатаНачала) И ОтборЖурналаНаКлиенте.Свойство("ДатаОкончания", ДатаОкончания)
		И ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ОтборЖурналаНаКлиенте.ДатаОкончания);
		
	Если ДатыОтбораУказаны И ДатаНачала > ДатаОкончания Тогда
		ВызватьИсключение НСтр("ru = 'Некорректно заданы условия отбора журнала регистрации. Дата начала больше даты окончания.'");
	КонецЕсли;
	СмещениеВремениСервера = СмещениеВремениСервера();
	
	// Подготовка отбора
	Отбор = Новый Структура;
	Для Каждого ЭлементОтбора Из ОтборЖурналаНаКлиенте Цикл
		Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
	КонецЦикла;
	
	ПреобразованиеОтбора(Отбор, СмещениеВремениСервера);
	
	// Выгрузка отбираемых событий и формирование структуры таблицы.
	СобытияЖурнала = Новый ТаблицаЗначений;
	ВыгрузитьЖурналРегистрации(СобытияЖурнала, Отбор, , , КоличествоСобытий);
	
	СобытияЖурнала.Колонки.Дата.Имя = "ДатаНаСервере";
	СобытияЖурнала.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
	
	СобытияЖурнала.Колонки.Добавить("НомерРисунка", Новый ОписаниеТипов("Число"));
	СобытияЖурнала.Колонки.Добавить("ДанныеСтрокой", Новый ОписаниеТипов("Строка"));
	СобытияЖурнала.Колонки.Добавить("КлючСобытия", Новый ОписаниеТипов("Строка"));
	
	Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
		СобытияЖурнала.Колонки.Добавить("РазделениеДанныхСеанса", Новый ОписаниеТипов("СписокЗначений"));
		СобытияЖурнала.Колонки.Добавить("ПредставлениеРазделенияДанныхСеанса", Новый ОписаниеТипов("Строка"));
	КонецЕсли;
	СобытияЖурнала.Колонки.Добавить("ОбластьДанных", Новый ОписаниеТипов("Строка"));
	
	Если ДобавлятьДополнительныеКолонки Тогда
		МенеджерВладельца.ДобавитьДополнительныеКолонкиСобытия(СобытияЖурнала);
	КонецЕсли;
	
	СобытияЖурнала.Колонки.Добавить("СписокМетаданных", Новый ОписаниеТипов("СписокЗначений"));
	СобытияЖурнала.Колонки.Добавить("СтрокаДанныхСовпадаетСПредставлениемДанных", Новый ОписаниеТипов("Булево"));
	
	Если ОбщегоНазначения.РазделениеВключено()
	   И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()
	   И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
		
		МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
		ПсевдонимыПользователей    = Новый Соответствие();
	Иначе
		МодульРаботаВМоделиСервиса = Неопределено;
		ПсевдонимыПользователей    = Неопределено;
	КонецЕсли;
	
	СтруктураКлюча = Новый Структура;
	Для Каждого Колонка Из СобытияЖурнала.Колонки Цикл
		СтруктураКлюча.Вставить(Колонка.Имя);
	КонецЦикла;
	
	ПредставлениеКлючей = ПредставлениеКлючейСтруктур();
	
	Для Каждого СобытиеЖурнала Из СобытияЖурнала Цикл
		СобытиеЖурнала.Дата = СобытиеЖурнала.ДатаНаСервере - СмещениеВремениСервера;
		
		// Заполнение номеров картинок строк.
		МенеджерВладельца.УстановитьНомерРисунка(СобытиеЖурнала);
		
		Если ДобавлятьДополнительныеКолонки Тогда
			// Заполнение дополнительных полей, определенных только у владельца.
			МенеджерВладельца.ЗаполнитьДополнительныеКолонкиСобытия(СобытиеЖурнала);
		КонецЕсли;
		
		// Преобразование массива метаданных в список значений.
		Если ТипЗнч(СобытиеЖурнала.Метаданные) = Тип("Массив") Тогда
			ДобавитьПредставление = ТипЗнч(СобытиеЖурнала.ПредставлениеМетаданных) = Тип("Массив")
			   И СобытиеЖурнала.ПредставлениеМетаданных.Количество() = СобытиеЖурнала.Метаданные.Количество();
			Индекс = 0;
			Для Каждого ПолноеИмя Из СобытиеЖурнала.Метаданные Цикл
				СобытиеЖурнала.СписокМетаданных.Добавить(ПолноеИмя,
					?(ДобавитьПредставление, СобытиеЖурнала.ПредставлениеМетаданных[Индекс], ""));
				Индекс = Индекс + 1;
			КонецЦикла;
		Иначе
			СобытиеЖурнала.СписокМетаданных.Добавить(СобытиеЖурнала.Метаданные,
				СобытиеЖурнала.ПредставлениеМетаданных);
		КонецЕсли;
		
		// Преобразование массива представлений метаданных в строку.
		Если ТипЗнч(СобытиеЖурнала.ПредставлениеМетаданных) = Тип("Массив") Тогда
			СобытиеЖурнала.ПредставлениеМетаданных = СтрСоединить(СобытиеЖурнала.ПредставлениеМетаданных, ", ");
		Иначе
			СобытиеЖурнала.ПредставлениеМетаданных = Строка(СобытиеЖурнала.ПредставлениеМетаданных);
		КонецЕсли;
		
		// Преобразование массива "РазделениеДанныхСеанса" в список значений.
		Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
			ПолноеПредставлениеРазделенияДанныхСеанса = "";
			РазделениеДанныхСеанса = СобытиеЖурнала.РазделениеДанныхСеанса;
			СписокРеквизитовРазделенияДанных = Новый СписокЗначений;
			Для Каждого РазделительСеанса Из РазделениеДанныхСеанса Цикл
				ПредставлениеРазделителя = Метаданные.ОбщиеРеквизиты.Найти(РазделительСеанса.Ключ).Представление();
				ПредставлениеРазделителя = ПредставлениеРазделителя + " = " + РазделительСеанса.Значение;
				ЗначениеРазделителя = РазделительСеанса.Ключ + "=" + РазделительСеанса.Значение;
				СписокРеквизитовРазделенияДанных.Добавить(ЗначениеРазделителя, ПредставлениеРазделителя);
				ПолноеПредставлениеРазделенияДанныхСеанса = ?(Не ПустаяСтрока(ПолноеПредставлениеРазделенияДанныхСеанса),
				                                            ПолноеПредставлениеРазделенияДанныхСеанса + "; ", "")
				                                            + ПредставлениеРазделителя;
			КонецЦикла;
			Если Не ЗначениеЗаполнено(РазделениеДанныхСеанса) Тогда
				СобытиеЖурнала.ОбластьДанных = "-";
				Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
					Если ОбщийРеквизит.РазделениеДанных = Метаданные.СвойстваОбъектов.РазделениеДанныхОбщегоРеквизита.НеИспользовать Тогда
						Продолжить;
					КонецЕсли;
					ПредставлениеРазделителя = ОбщийРеквизит.Представление() + " = " + НСтр("ru = '<Не задано>'");
					ЗначениеРазделителя = ОбщийРеквизит.Имя + "=";
					СписокРеквизитовРазделенияДанных.Добавить(ЗначениеРазделителя, ПредставлениеРазделителя);
				КонецЦикла;
			ИначеЕсли Не РазделениеДанныхСеанса.Свойство("ОбластьДанныхОсновныеДанные") Тогда
				СобытиеЖурнала.ОбластьДанных = "?";
			Иначе
				СобытиеЖурнала.ОбластьДанных = Формат(РазделениеДанныхСеанса.ОбластьДанныхОсновныеДанные, "ЧН=0; ЧГ=");
			КонецЕсли;
			СобытиеЖурнала.РазделениеДанныхСеанса = СписокРеквизитовРазделенияДанных;
			СобытиеЖурнала.ПредставлениеРазделенияДанныхСеанса = ПолноеПредставлениеРазделенияДанныхСеанса;
		КонецЕсли;
		
		// Обработка данных специальных событий.
		Если СобытиеЖурнала.Событие = "_$Access$_.Access" Тогда
			УстановитьСтрокуДанных(СобытиеЖурнала);
			
			Если СобытиеЖурнала.Данные <> Неопределено Тогда
				СобытиеЖурнала.Данные = ПредставлениеДанныхТаблицы(СобытиеЖурнала.Данные);
			КонецЕсли;
			
		ИначеЕсли СобытиеЖурнала.Событие = "_$Access$_.AccessDenied" Тогда
			УстановитьСтрокуДанных(СобытиеЖурнала);
			
			Если СобытиеЖурнала.Данные <> Неопределено Тогда
				Если СобытиеЖурнала.Данные.Свойство("Право") Тогда
					СобытиеЖурнала.Данные = ПредставлениеДанныхСтруктуры(СобытиеЖурнала.Данные,
						ПредставлениеКлючей);
				Иначе
					СобытиеЖурнала.Данные = ПредставлениеДанныхСтруктуры(СобытиеЖурнала.Данные,
						ПредставлениеКлючей, Истина) + "
						|" + ПредставлениеДанныхТаблицы(СобытиеЖурнала.Данные);
				КонецЕсли;
			КонецЕсли;
			
		ИначеЕсли ТипЗнч(СобытиеЖурнала.Данные) = Тип("Структура")
		      Или ТипЗнч(СобытиеЖурнала.Данные) = Тип("ФиксированнаяСтруктура") Тогда
			
			УстановитьСтрокуДанных(СобытиеЖурнала);
			СобытиеЖурнала.Данные = ПредставлениеДанныхСтруктуры(СобытиеЖурнала.Данные,
				ПредставлениеКлючей);
			
		ИначеЕсли ТипЗнч(СобытиеЖурнала.Данные) = Тип("Строка") Тогда
			Данные = ДанныеИзСтрокиXML(СобытиеЖурнала.Данные);
			Если Данные <> Неопределено Тогда
				УстановитьСтрокуДанных(СобытиеЖурнала);
				СобытиеЖурнала.Данные = ПредставлениеДанныхСтруктуры(Данные, ПредставлениеКлючей);
			КонецЕсли;
		КонецЕсли;
		
		УстановитьПривилегированныйРежим(Истина);
		// Уточнение имени пользователя.
		Если СобытиеЖурнала.Пользователь = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
			СобытиеЖурнала.ИмяПользователя = НСтр("ru = '<Неопределен>'");
			
		ИначеЕсли СобытиеЖурнала.ИмяПользователя = "" Тогда
			СобытиеЖурнала.ИмяПользователя = Пользователи.ПолноеИмяНеУказанногоПользователя();
			
		ИначеЕсли ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь) = Неопределено Тогда
			СобытиеЖурнала.ИмяПользователя = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 <Удален>'"), СобытиеЖурнала.ИмяПользователя);
		КонецЕсли;
		
		Если МодульРаботаВМоделиСервиса <> Неопределено Тогда
			Если ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь) = Неопределено Тогда
				ПсевдонимПользователя = МодульРаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы(СобытиеЖурнала.Пользователь);
				ПсевдонимыПользователей.Вставить(СобытиеЖурнала.Пользователь, ПсевдонимПользователя);
			Иначе
				ПсевдонимПользователя = ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь);
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ПсевдонимПользователя) Тогда
				СобытиеЖурнала.ИмяПользователя = ПсевдонимПользователя;
			КонецЕсли;
		КонецЕсли;
		
		Если Строка(СобытиеЖурнала.ПредставлениеДанных) = Строка(СобытиеЖурнала.Данные) Тогда
			СобытиеЖурнала.СтрокаДанныхСовпадаетСПредставлениемДанных = Истина;
		КонецЕсли;
		
		СобытиеЖурнала.Комментарий = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(
			СобытиеЖурнала.Комментарий);
		
		ЗаполнитьЗначенияСвойств(СтруктураКлюча, СобытиеЖурнала);
		Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
		Хеширование.Добавить(ЗначениеВСтрокуВнутр(СтруктураКлюча));
		СобытиеЖурнала.КлючСобытия = Base64Строка(Хеширование.ХешСумма);
		
		УстановитьПривилегированныйРежим(Ложь);
	КонецЦикла;
	
	СобытияЖурнала.Колонки.Удалить("Метаданные");
	СобытияЖурнала.Колонки.СписокМетаданных.Имя = "Метаданные";
	
	// Успешное завершение
	Результат = Новый Структура;
	Результат.Вставить("СобытияЖурнала", СобытияЖурнала);
	
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры

// Создает пользовательское представление отбора журнала регистрации.
//
// Параметры:
//  ПредставлениеОтбора - Строка - строка, содержащая пользовательское представление отбора.
//  ОтборЖурналаРегистрации - Структура - значения отбора журнала регистрации.
//  ОтборЖурналаРегистрацииПоУмолчанию - Структура - значения отбора журнала регистрации по умолчанию 
//     (не включаются в пользовательское представления).
//
Процедура СформироватьПредставлениеОтбора(ПредставлениеОтбора, ОтборЖурналаРегистрации, 
		ОтборЖурналаРегистрацииПоУмолчанию = Неопределено) Экспорт
	
	ПредставлениеОтбора = "";
	// Интервал
	ДатаНачалаИнтервала    = Неопределено;
	ДатаОкончанияИнтервала = Неопределено;
	Если Не ОтборЖурналаРегистрации.Свойство("ДатаНачала", ДатаНачалаИнтервала)
		Или ДатаНачалаИнтервала = Неопределено Тогда
		ДатаНачалаИнтервала    = '00010101000000';
	КонецЕсли;
	
	Если Не ОтборЖурналаРегистрации.Свойство("ДатаОкончания", ДатаОкончанияИнтервала)
		Или ДатаОкончанияИнтервала = Неопределено Тогда
		ДатаОкончанияИнтервала = '00010101000000';
	КонецЕсли;
	
	Если Не (ДатаНачалаИнтервала = '00010101000000' И ДатаОкончанияИнтервала = '00010101000000') Тогда
		ПредставлениеОтбора = ПредставлениеПериода(ДатаНачалаИнтервала, ДатаОкончанияИнтервала);
	КонецЕсли;
	
	ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, "Пользователь");
	ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора,
		"Событие", ОтборЖурналаРегистрацииПоУмолчанию);
	ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора,
		"ИмяПриложения", ОтборЖурналаРегистрацииПоУмолчанию);
	ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, "Сеанс");
	ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, "Уровень");
	
	// Остальные ограничения указываем просто по представлением, без указания значений ограничения.
	Для Каждого ЭлементОтбора Из ОтборЖурналаРегистрации Цикл
		ИмяОграничения = ЭлементОтбора.Ключ;
		Если ВРег(ИмяОграничения) = ВРег("ДатаНачала")
			Или ВРег(ИмяОграничения) = ВРег("ДатаОкончания")
			Или ВРег(ИмяОграничения) = ВРег("Событие")
			Или ВРег(ИмяОграничения) = ВРег("ИмяПриложения")
			Или ВРег(ИмяОграничения) = ВРег("Пользователь")
			Или ВРег(ИмяОграничения) = ВРег("Сеанс")
			Или ВРег(ИмяОграничения) = ВРег("Уровень") Тогда
			Продолжить; // Интервал и особые ограничения уже выводили.
		КонецЕсли;
		
		// Для некоторых ограничений меняем представление.
		Если ВРег(ИмяОграничения) = ВРег("ИмяПриложения") Тогда
			ИмяОграничения = НСтр("ru = 'Приложение'");
		ИначеЕсли ВРег(ИмяОграничения) = ВРег("СтатусТранзакции") Тогда
			ИмяОграничения = НСтр("ru = 'Статус транзакции'");
		ИначеЕсли ВРег(ИмяОграничения) = ВРег("ПредставлениеДанных") Тогда
			ИмяОграничения = НСтр("ru = 'Представление данных'");
		ИначеЕсли ВРег(ИмяОграничения) = ВРег("РабочийСервер") Тогда
			ИмяОграничения = НСтр("ru = 'Рабочий сервер'");
		ИначеЕсли ВРег(ИмяОграничения) = ВРег("ОсновнойIPПорт") Тогда
			ИмяОграничения = НСтр("ru = 'Основной IP порт'");
		ИначеЕсли ВРег(ИмяОграничения) = ВРег("ВспомогательныйIPПорт") Тогда
			ИмяОграничения = НСтр("ru = 'Вспомогательный IP порт'");
		ИначеЕсли ВРег(ИмяОграничения) = ВРег("РазделениеДанныхСеанса") Тогда
			Если ТолькоСтандартныеРазделители() Тогда
				ИмяОграничения = НСтр("ru = 'Область данных'");
			Иначе
				ИмяОграничения = НСтр("ru = 'Разделение данных сеанса'");
			КонецЕсли;
		КонецЕсли;
		
		Если Не ПустаяСтрока(ПредставлениеОтбора) Тогда 
			ПредставлениеОтбора = ПредставлениеОтбора + "; ";
		КонецЕсли;
		ПредставлениеОтбора = ПредставлениеОтбора + ИмяОграничения;
		
	КонецЦикла;
	
	Если ПустаяСтрока(ПредставлениеОтбора) Тогда
		ПредставлениеОтбора = НСтр("ru = 'Не установлен'");
	КонецЕсли;
	
КонецПроцедуры

// Определяет смещение времени сервера относительно времени программы.
//
// Возвращаемое значение:
//   Число - смещение времени в секундах.
//       Может использоваться для приведения фильтров, применяемых к журналу, к дате сервера,
//       а также для приведения дат, полученных из журнала, к датам программы.
//
Функция СмещениеВремениСервера() Экспорт
	
	СмещениеВремениСервера = ТекущаяДата() - ТекущаяДатаСеанса(); // АПК:143 Требуется дата компьютера
	Если СмещениеВремениСервера >= -1 И СмещениеВремениСервера <= 1 Тогда
		СмещениеВремениСервера = 0;
	КонецЕсли;
	Возврат СмещениеВремениСервера;
	
КонецФункции

// Возвращает адрес файла выгрузки журнала регистрации для техподдержки в формате XML.
// Отбор записей журнала регистрации в параметре ОтборЖурналаРегистрации соответствует методу ВыгрузитьЖурналРегистрации.
// Любое свойство отбора может отсутствовать или иметь значение Неопределено, что означает, что отбор не задан.
// 
// Параметры:
//  ОтборЖурналаРегистрации - Структура:
//   * ДатаНачала - Дата
//   * ДатаОкончания - Дата
//   * Уровень - УровеньЖурналаРегистрации
//   * ИмяПриложения - Строка
//                   - Массив из Строка
//                   - СписокЗначений
//   * Пользователь - ПользовательИнформационнойБазы
//                  - Строка
//                  - Массив из ПользовательИнформационнойБазы
//                  - СписокЗначений
//   * Компьютер - Строка
//               - Массив из Строка
//                - СписокЗначений
//   * Событие - Строка
//             - СписокЗначений
//             - Массив из Строка - варианты имен системных событий смотри в синтаксис-помощнике.
//   * Метаданные - ОбъектМетаданных 
//                - Массив из ОбъектМетаданных
//                - СписокЗначений
//   * Данные - ЛюбаяСсылка
//   * ПредставлениеДанных - Строка
//   * Комментарий - Строка
//   * СтатусТранзакции - СтатусТранзакцииЗаписиЖурналаРегистрации
//   * Транзакция - Строка 
//   * Сеанс - Число
//           - Массив из Число
//           - СписокЗначений
//   * РабочийСервер - Строка
//                   - Массив из Строка
//                   - СписокЗначений
//   * ОсновнойIPПорт - Число
//                    - Массив из Число
//                    - СписокЗначений
//   * ВспомогательныйIPПорт - Число
//                    - Массив из Число
//                    - СписокЗначений
//   * РазделениеДанныхСеанса - СписокЗначений - имена свойств соответствуют именам общих реквизитов. 
//                            - Структура
//  КоличествоСобытий - Число
//  УникальныйИдентификатор - УникальныйИдентификатор - для создания временного хранилища.
// 
// Возвращаемое значение:
//  Строка 
//
Функция ЖурналДляТехподдержки(ОтборЖурналаРегистрации, КоличествоСобытий, УникальныйИдентификатор = Неопределено) Экспорт
	
	Отбор = Новый Структура;
	Для Каждого ЭлементОтбора Из ОтборЖурналаРегистрации Цикл
		Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
	КонецЦикла;
	СмещениеВремениСервера = СмещениеВремениСервера();
	ПреобразованиеОтбора(Отбор, СмещениеВремениСервера);
	
	ВременныйФайл = ПолучитьИмяВременногоФайла("xml");
	ВыгрузитьЖурналРегистрации(ВременныйФайл, Отбор, , , КоличествоСобытий);
	ДвоичныеДанные = Новый ДвоичныеДанные(ВременныйФайл);
	УдалитьФайлы(ВременныйФайл);
	
	Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
	
КонецФункции

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Параметры:
//  ДанныеСтрокой - Строка
//
// Возвращаемое значение:
//  Произвольный
//
Функция ДанныеСобытия(ДанныеСтрокой) Экспорт
	
	Если Не ЗначениеЗаполнено(ДанныеСтрокой) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Попытка
		Результат = ЗначениеИзСтрокиВнутр(ДанныеСтрокой);
	Исключение
		Результат = Неопределено;
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

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

Функция ПредставлениеДанныхТаблицы(ДанныеСобытия)
	
	Если ТипЗнч(ДанныеСобытия) <> Тип("Структура")
	   И ТипЗнч(ДанныеСобытия) <> Тип("ФиксированнаяСтруктура")
	 Или Не ДанныеСобытия.Свойство("Данные")
	 Или ТипЗнч(ДанныеСобытия.Данные) <> Тип("ТаблицаЗначений") Тогда
		Возврат "";
	КонецЕсли;
	
	Данные = ДанныеСобытия.Данные; // ТаблицаЗначений
	
	КоличествоСтрок = Данные.Количество();
	Если КоличествоСтрок = 0 Тогда
		Возврат "";
	КонецЕсли;
	
	Таблица = Новый ТаблицаЗначений;
	Для Каждого Колонка Из Данные.Колонки Цикл
		НоваяКолонка = Таблица.Колонки.Добавить(Колонка.Имя,
			Новый ОписаниеТипов("Строка"), Колонка.Заголовок);
		Если Не ЗначениеЗаполнено(НоваяКолонка.Заголовок) Тогда
			НоваяКолонка.Заголовок = НоваяКолонка.Имя;
		КонецЕсли;
	КонецЦикла;
	Для Каждого СтрокаТаблицы Из Данные Цикл
		ЗаполнитьЗначенияСвойств(Таблица.Добавить(), СтрокаТаблицы);
	КонецЦикла;
	
	Копия = Таблица.Скопировать();
	Для Каждого Колонка Из Таблица.Колонки Цикл
		Копия.Сортировать(Колонка.Имя);
		Ширина = СтрДлина(Копия.Получить(КоличествоСтрок - 1)[Колонка.Имя]);
		ШиринаЗаголовка = СтрДлина(Колонка.Заголовок);
		Колонка.Ширина = ?(Ширина > ШиринаЗаголовка, Ширина, ШиринаЗаголовка);
	КонецЦикла;
	
	СимволыОтступа = "                                                             ";
	
	Строки = Новый Массив;
	ЧастиСтроки = Новый Массив;
	Для Каждого Колонка Из Таблица.Колонки Цикл
		ЧастиСтроки.Добавить(Сред(Колонка.Заголовок + СимволыОтступа, 1, Колонка.Ширина));
	КонецЦикла;
	Строки.Добавить("| " + СтрСоединить(ЧастиСтроки, " | ") + " |");
	
	Для Каждого СтрокаТаблицы Из Таблица Цикл
		ЧастиСтроки = Новый Массив;
		Для Каждого Колонка Из Таблица.Колонки Цикл
			ЧастиСтроки.Добавить(Сред(СтрокаТаблицы[Колонка.Имя] + СимволыОтступа, 1, Колонка.Ширина));
		КонецЦикла;
		Строки.Добавить("| " + СтрСоединить(ЧастиСтроки, " | ") + " |");
	КонецЦикла;
	
	Возврат СтрСоединить(Строки, Символы.ПС);
	
КонецФункции

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

// Для функции ПредставлениеДанныхСтруктуры.
Процедура ДобавитьПредставлениеСтрокДерева(Строки, СтрокиДерева, Отступ = "")
	
	Для Каждого СтрокаДерева Из СтрокиДерева Цикл
		Если СтрокаДерева.ЕстьЗначение Тогда
			Строки.Добавить(Отступ + СтрокаДерева.Свойство + ": " + СтрокаДерева.Значение);
		Иначе
			Строки.Добавить(Отступ + СтрокаДерева.Свойство);
			ДобавитьПредставлениеСтрокДерева(Строки, СтрокаДерева.Строки, Отступ + "    ");
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

// Параметры:
//  ДанныеСобытия - Структура, ФиксированнаяСтруктура
//  ПредставлениеКлючей - см. ПредставлениеКлючейСтруктур
//                      - Неопределено - получить автоматически
//  ТолькоЗаполненные - Булево
//  ИсключаемыеСвойства - Соответствие
//                      - Неопределено
//
// Возвращаемое значение:
//  ДеревоЗначений:
//   * Свойство - Строка
//   * Значение - Строка
//   * ЕстьЗначение - Булево
//
Функция ДеревоИзДанныхСтруктуры(ДанныеСобытия, ПредставлениеКлючей = Неопределено,
			ТолькоЗаполненные = Ложь, ИсключаемыеСвойства = Неопределено) Экспорт
	
	Если ПредставлениеКлючей = Неопределено Тогда
		ПредставлениеКлючей = ПредставлениеКлючейСтруктур();
	КонецЕсли;
	
	Дерево = Новый ДеревоЗначений;
	Дерево.Колонки.Добавить("Свойство", Новый ОписаниеТипов("Строка"), НСтр("ru = 'Свойство'"));
	Дерево.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка"), НСтр("ru = 'Значение'"));
	Дерево.Колонки.Добавить("СвойствоБезПредставления", Новый ОписаниеТипов("Булево"));
	Дерево.Колонки.Добавить("ЕстьЗначение", Новый ОписаниеТипов("Булево"));
	
	ДобавитьСвойстваВДерево(Дерево.Строки, ДанныеСобытия, ПредставлениеКлючей,
		ТолькоЗаполненные, ИсключаемыеСвойства);
	
	Дерево.Колонки.Удалить("СвойствоБезПредставления");
	
	Возврат Дерево;
	
КонецФункции

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

// Параметры:
//   Ключ - Строка - имя свойства
//   Значение - Произвольный
//
// Возвращаемое значение:
//  Строка
//
Функция ПредставлениеЗначения(Ключ, Значение)
	
	ФорматнаяСтрока = НСтр("ru = 'ЧН=0; ДЛФ=DT; ДП=''01.01.0001 00:00:00'''");
	
	Если ТипЗнч(Значение) <> Тип("Массив") Тогда
		Если ВРег(Ключ) = ВРег("ИмяСобытия") И СтрНачинаетсяС(Значение, "_$") Тогда
			ПредставлениеСобытия = ПредставлениеСобытияЖурналаРегистрации(Значение);
			Если ЗначениеЗаполнено(ПредставлениеСобытия) Тогда
				Возврат ПредставлениеСобытия;
			КонецЕсли;
		КонецЕсли;
		Возврат ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(
			Формат(Значение, ФорматнаяСтрока));
	КонецЕсли;
	
	Если ВРег(Ключ) = ВРег("Роли") Тогда
		Таблица = ТаблицаРолей(Значение);
		Строки = Таблица.ВыгрузитьКолонку("Представление");
		Соединитель = Символы.ПС;
	Иначе
		Строки = Новый Массив;
		Для Каждого ТекущееЗначение Из Значение Цикл
			Строки.Добавить(ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(
				Формат(ТекущееЗначение, ФорматнаяСтрока)));
		КонецЦикла;
		Соединитель = ", ";
	КонецЕсли;
	
	Если Строки.Количество() = 1 Тогда
		Возврат Строки[0];
	КонецЕсли;
	
	Возврат СтрСоединить(Строки, Соединитель);
	
КонецФункции

// Параметры:
//  Роли - Массив из Строка
//
// Возвращаемое значение:
//  ТаблицаЗначений:
//   * Представление - Строка
//
Функция ТаблицаРолей(Роли) Экспорт
	
	РолиПользователяИБ = Новый ТаблицаЗначений;
	РолиПользователяИБ.Колонки.Добавить("Существует");
	РолиПользователяИБ.Колонки.Добавить("Представление",, НСтр("ru = 'Представление'"));
	
	Для Каждого ПолноеИмяРоли Из Роли Цикл
		ЧастиИмени = СтрРазделить(ПолноеИмяРоли, ".", Ложь);
		Если ЧастиИмени.Количество() = 2 Тогда
			ИмяРоли = ЧастиИмени[1];
			МетаданныеРоли = Метаданные.Роли.Найти(ИмяРоли);
		Иначе
			ИмяРоли = ПолноеИмяРоли;
		КонецЕсли;
		НоваяСтрока = РолиПользователяИБ.Добавить();
		НоваяСтрока.Существует = МетаданныеРоли <> Неопределено;
		НоваяСтрока.Представление = ?(МетаданныеРоли = Неопределено,
			ИмяРоли, МетаданныеРоли.Представление());
	КонецЦикла;
	
	РолиПользователяИБ.Сортировать("Существует УБЫВ, Представление");
	РолиПользователяИБ.Колонки.Удалить("Существует");
	
	Возврат РолиПользователяИБ;
	
КонецФункции

// Возвращаемое значение:
//  Соответствие из КлючИЗначение:
//   * Ключ - Строка - имя ключа структуры в нижнем регистре
//   * Значение - Строка - представление ключа.
//
Функция ПредставлениеКлючейСтруктур()
	
	Результат = Новый Соответствие;
	
	// _$Access$_.*
	Результат.Вставить(НРег("Право"),
		НСтр("ru = 'Право'"));
	
	Результат.Вставить(НРег("Действие"),
		НСтр("ru = 'Действие'"));
	
	// _$Debug$_.*
	Результат.Вставить(НРег("ПользовательСервераОтладки"),
		НСтр("ru = 'Пользователь сервера отладки'"));
	
	Результат.Вставить(НРег("ТипПредметаОтладки"),
		НСтр("ru = 'Тип предмета отладки'"));
	
	Результат.Вставить(НРег("Выражение"),
		НСтр("ru = 'Выражение'"));
	
	// _$InfoBase$_.AdditionalAuthenticationSettingsUpdate
	Результат.Вставить(НРег("СпособВосстановленияПароля"),
		НСтр("ru = 'Способ восстановления пароля'"));
	
	Результат.Вставить(НРег("НавигационнаяСсылкаВосстановленияПароля"),
		НСтр("ru = 'Навигационная ссылка восстановления пароля'"));
	
	Результат.Вставить(НРег("НавигационнаяСсылкаПомощи"),
		НСтр("ru = 'Навигационная ссылка помощи'"));
	
	Результат.Вставить(НРег("ОтображатьГиперссылкуПомощи"),
		НСтр("ru = 'Отображать гиперссылку помощи'"));
	
	Результат.Вставить(НРег("ДлинаКодаПодтверждения"),
		НСтр("ru = 'Длина кода подтверждения'"));
	
	Результат.Вставить(НРег("МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения"),
		НСтр("ru = 'Максимальное количество неуспешных попыток проверки кода подтверждения'"));
	
	Результат.Вставить(НРег("ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения"),
		НСтр("ru = 'Длительность блокировки запроса обновления кода подтверждения'"));
	
	Результат.Вставить(НРег("АдресСервераSMTP"),
		НСтр("ru = 'Адрес сервера SMTP'"));
	
	Результат.Вставить(НРег("ПользовательSMTP"),
		НСтр("ru = 'Пользователь SMTP'"));
	
	Результат.Вставить(НРег("ПарольSMTPИзменен"),
		НСтр("ru = 'Пароль SMTP изменен'"));
	
	Результат.Вставить(НРег("ПортSMTP"),
		НСтр("ru = 'Порт SMTP'"));
	
	Результат.Вставить(НРег("ИмяОтправителя"),
		НСтр("ru = 'Имя отправителя'"));
	
	Результат.Вставить(НРег("Заголовок"),
		НСтр("ru = 'Заголовок'"));
	
	Результат.Вставить(НРег("ТекстСообщенияHTML"),
		НСтр("ru = 'Текст сообщения HTML'"));
	
	Результат.Вставить(НРег("ИспользоватьSSL"),
		НСтр("ru = 'Использовать SSL'"));
	
	Результат.Вставить(НРег("РазрешитьСохранениеАутентификацииДляПовторнойАутентификации"),
		НСтр("ru = 'Разрешить сохранение аутентификации для повторной аутентификации'"));
	
	Результат.Вставить(НРег("СохранятьАутентификациюДляПовторнойАутентификацииПоУмолчанию"),
		НСтр("ru = 'Сохранять аутентификацию для повторной аутентификации по умолчанию'"));
	
	Результат.Вставить(НРег("ВремяЖизниСохраненнойАутентификации"),
		НСтр("ru = 'Время жизни сохраненной аутентификации'"));
	
	// _$InfoBase$_.AdministrationParametersChange
	Результат.Вставить(НРег("БлокировкаРегламентныхЗаданий"),
		НСтр("ru = 'Блокировка регламентных заданий'"));
	
	Результат.Вставить(НРег("ВключенаБлокировкаНачалаСеансов"),
		НСтр("ru = 'Включена блокировка начала сеансов'"));
	
	Результат.Вставить(НРег("ВремяНачалаБлокировки"),
		НСтр("ru = 'Время начала блокировки'"));
	
	Результат.Вставить(НРег("ВремяОкончанияБлокировки"),
		НСтр("ru = 'Время окончания блокировки'"));
	
	Результат.Вставить(НРег("ЗадержкаВыгрузкиКонфигурацииРабочимПроцессомБезАктивныхПользователей"),
		НСтр("ru = 'Задержка выгрузки конфигурации рабочим процессом без активных пользователей'"));
	
	Результат.Вставить(НРег("ЗапретитьЛокальноеРаспознаваниеРечи"),
		НСтр("ru = 'Запретить локальное распознавание речи'"));
	
	Результат.Вставить(НРег("ИдентификаторИнформационнойБазы"),
		НСтр("ru = 'Идентификатор информационной базы'"));
	
	Результат.Вставить(НРег("ИмяБазыДанных"),
		НСтр("ru = 'Имя базы данных'"));
	
	Результат.Вставить(НРег("КодРазрешенияНачалаСеансов"),
		НСтр("ru = 'Код разрешения начала сеансов'"));
	
	Результат.Вставить(НРег("МаксимальныйСдвигЗапускаРегламентныхЗаданийБезАктивныхПользователей"),
		НСтр("ru = 'Максимальный сдвиг запуска регламентных заданий без активных пользователей'"));
	
	Результат.Вставить(НРег("МинимальныйПериодЗапускаРегламентныхЗаданийБезАктивныхПользователей"),
		НСтр("ru = 'Минимальный период запуска регламентных заданий без активных пользователей'"));
	
	Результат.Вставить(НРег("ОбязательноеИспользованиеВнешнегоУправленияСеансами"),
		НСтр("ru = 'Обязательное использование внешнего управления сеансами'"));
	
	Результат.Вставить(НРег("Описание"),
		НСтр("ru = 'Описание'"));
	
	Результат.Вставить(НРег("ПараметрБлокировки"),
		НСтр("ru = 'Параметр блокировки'"));
	
	Результат.Вставить(НРег("ПарольПользователяБазыДанных"),
		НСтр("ru = 'Пароль пользователя базы данных'"));
	
	Результат.Вставить(НРег("ПользовательБазыДанных"),
		НСтр("ru = 'Пользователь базы данных'"));
	
	Результат.Вставить(НРег("ПрофильБезопасностиБезопасногоРежима"),
		НСтр("ru = 'Профиль безопасности безопасного режима'"));
	
	Результат.Вставить(НРег("РазрешитьВыдачуЛицензий"),
		НСтр("ru = 'Разрешить выдачу лицензий'"));
	
	Результат.Вставить(НРег("РезервированиеРабочихПроцессов"),
		НСтр("ru = 'Резервирование рабочих процессов'"));
	
	Результат.Вставить(НРег("СерверБазДанных"),
		НСтр("ru = 'Сервер баз данных'"));
	
	Результат.Вставить(НРег("СмещениеДат"),
		НСтр("ru = 'Смещение дат'"));
	
	Результат.Вставить(НРег("СоздатьБазуДанных"),
		НСтр("ru = 'Создать базу данных'"));
	
	Результат.Вставить(НРег("СообщениеБлокировки"),
		НСтр("ru = 'Сообщение блокировки'"));
	
	Результат.Вставить(НРег("СтрокаПараметровВнешнегоУправленияСеансами"),
		НСтр("ru = 'Строка параметров внешнего управления сеансами'"));
	
	Результат.Вставить(НРег("СУБД"),
		НСтр("ru = 'СУБД'"));
	
	Результат.Вставить(НРег("УровеньБезопасностиСоединений"),
		НСтр("ru = 'Уровень безопасности соединений'"));
	
	// _$InfoBase$_.ConfigUpdate*
	Результат.Вставить(НРег("Поставщик"),
		НСтр("ru = 'Поставщик'"));
	
	// _$InfoBase$_.ConfigExtensionUpdate
	Результат.Вставить(НРег("Версия"),
		НСтр("ru = 'Версия'"));
	
	// _$InfoBase$_.DBConfigUpdate
	Результат.Вставить(НРег("МонопольныйРежим"),
		НСтр("ru = 'Монопольный режим'"));
	
	// _$InfoBase$_.DBConfigExtension*
	Результат.Вставить(НРег("Активно"),
		НСтр("ru = 'Активно'"));
	
	Результат.Вставить(НРег("БезопасныйРежим"),
		НСтр("ru = 'Безопасный режим'"));
	
	Результат.Вставить(НРег("ПрофильБезопасности"),
		НСтр("ru = 'Профиль безопасности'"));
	
	Результат.Вставить(НРег("ИспользоватьОсновныеРолиДляВсехПользователей"),
		НСтр("ru = 'Использовать основные роли для всех пользователей'"));
	
	Результат.Вставить(НРег("ИспользуетсяВРаспределеннойИнформационнойБазе"),
		НСтр("ru = 'Используется в распределенной информационной базе'"));
	
	Результат.Вставить(НРег("Назначение"),
		НСтр("ru = 'Назначение'"));
	
	Результат.Вставить(НРег("ОбластьДействия"),
		НСтр("ru = 'Область действия'"));
	
	Результат.Вставить(НРег("ОсновныеРоли"),
		НСтр("ru = 'Основные роли'"));
	
	Результат.Вставить(НРег("Синоним"),
		НСтр("ru = 'Синоним'"));
	
	Результат.Вставить(НРег("УникальныйИдентификатор"),
		НСтр("ru = 'Уникальный идентификатор'"));
	
	Результат.Вставить(НРег("ХешСумма"),
		НСтр("ru = 'Хеш-сумма'"));
	
	// _$InfoBase$_.EventLogReduce
	Результат.Вставить(НРег("Дата"),
		НСтр("ru = 'Дата'"));
	
	// _$InfoBase$_.EventLogSettingsUpdateError
	Результат.Вставить(НРег("Уровни"),
		НСтр("ru = 'Уровни'"));
	
	Результат.Вставить(НРег("ПериодРазделения"),
		НСтр("ru = 'Период разделения'"));
	
	Результат.Вставить(НРег("ФорматЖурналаРегистрации"),
		НСтр("ru = 'Формат журнала регистрации'"));
	
	Результат.Вставить(НРег("ИмяСобытия"),
		НСтр("ru = 'Имя события'"));
	
	Результат.Вставить(НРег("СобытиеРегистрируется"),
		НСтр("ru = 'Событие регистрируется'"));
	
	// _$InfoBase$_.ExclusiveModeChange
	Результат.Вставить(НРег("РазрешитьЗавершатьПриНачалеСеанса"),
		НСтр("ru = 'Разрешить завершать при начале сеанса'"));
	
	// _$InfoBase$_.ParametersUpdate
	Результат.Вставить(НРег("ВремяОжиданияБлокировкиДанных"),
		НСтр("ru = 'Время ожидания блокировки данных'"));
	
	Результат.Вставить(НРег("МаксимальныйСрокДействияПаролейПользователей"),
		НСтр("ru = 'Максимальный срок действия паролей пользователей'"));
	
	Результат.Вставить(НРег("МинимальныйСрокДействияПаролейПользователей"),
		НСтр("ru = 'Минимальный срок действия паролей пользователей'"));
	
	Результат.Вставить(НРег("МинимальнаяДлинаПаролейПользователей"),
		НСтр("ru = 'Минимальная длина паролей пользователей'"));
	
	Результат.Вставить(НРег("ОграничениеПовторенияПаролейПользователейСредиПоследних"),
		НСтр("ru = 'Ограничение повторения паролей пользователей среди последних'"));
	
	Результат.Вставить(НРег("ПроверкаСложностиПаролейПользователей"),
		НСтр("ru = 'Проверка сложности паролей пользователей'"));
	
	Результат.Вставить(НРег("СрокПредупрежденияОбИстеченииСрокаДействияПаролейПользователей"),
		НСтр("ru = 'Срок предупреждения об истечении срока действия паролей пользователей'"));
	
	Результат.Вставить(НРег("ВремяЗасыпанияПассивногоСеанса"),
		НСтр("ru = 'Время засыпания пассивного сеанса'"));
	
	Результат.Вставить(НРег("ВремяЗавершенияСпящегоСеанса"),
		НСтр("ru = 'Время завершения спящего сеанса'"));
	
	Результат.Вставить(НРег("ВремяЗавершенияСеансаПриБездействии"),
		НСтр("ru = 'Время завершения сеанса при бездействии'"));
	
	Результат.Вставить(НРег("ВремяПредупрежденияОЗавершенииСеансаПриБездействии"),
		НСтр("ru = 'Время предупреждения о завершении сеанса при бездействии'"));
	
	Результат.Вставить(НРег("КоличествоЗаданийПересчетаИтогов"),
		НСтр("ru = 'Количество заданий пересчета итогов'"));
	
	Результат.Вставить(НРег("МаксимальноеКоличествоНеуспешныхПопыток"),
		НСтр("ru = 'Максимальное количество неуспешных попыток'"));
	
	Результат.Вставить(НРег("ДлительностьБлокировки"),
		НСтр("ru = 'Длительность блокировки'"));
	
	Результат.Вставить(НРег("КодыДополненияИмениПользователя"),
		НСтр("ru = 'Коды дополнения имени пользователя'"));
	
	// _$InfoBase$_.RegionalSettingsChange
	Результат.Вставить(НРег("ИспользоватьНастройкиТекущегоСеанса"),
		НСтр("ru = 'Использовать настройки текущего сеанса'"));
	
	Результат.Вставить(НРег("КодЛокализации"),
		НСтр("ru = 'Код локализации'"));
	
	Результат.Вставить(НРег("ПервыйДеньНедели"),
		НСтр("ru = 'Первый день недели'"));
	
	Результат.Вставить(НРег("ПредставлениеБулевоИстина"),
		НСтр("ru = 'Представление логического значения Истина'"));
	
	Результат.Вставить(НРег("ПредставлениеБулевоЛожь"),
		НСтр("ru = 'Представление логического значения Ложь'"));
	
	Результат.Вставить(НРег("ПредставлениеОтрицательныхЧисел"),
		НСтр("ru = 'Представление отрицательных чисел'"));
	
	Результат.Вставить(НРег("РазделительГруппЦифрЧисел"),
		НСтр("ru = 'Разделитель групп цифр чисел'"));
	
	Результат.Вставить(НРег("РазделительДробнойЧастиЧисел"),
		НСтр("ru = 'Разделитель дробной части чисел'"));
	
	Результат.Вставить(НРег("ФорматГруппировкиЦифрЧисел"),
		НСтр("ru = 'Формат группировки цифр чисел'"));
	
	Результат.Вставить(НРег("ФорматПредставленияВремени"),
		НСтр("ru = 'Формат представления времени'"));
	
	Результат.Вставить(НРег("ФорматПредставленияДаты"),
		НСтр("ru = 'Формат представления даты'"));
	
	// _$InfoBase$_.RoleUpdate
	Результат.Вставить(НРег("Права"),
		НСтр("ru = 'Права'"));
	
	Результат.Вставить(НРег("ДоступВключен"),
		НСтр("ru = 'Доступ включен'"));
	
	Результат.Вставить(НРег("ДоступВыключен"),
		НСтр("ru = 'Доступ выключен'"));
	
	Результат.Вставить(НРег("Ограничения"),
		НСтр("ru = 'Ограничения'"));
	
	Результат.Вставить(НРег("ШаблоныОграничений"),
		НСтр("ru = 'Шаблоны ограничений'"));
	
	Результат.Вставить(НРег("Добавлены"),
		НСтр("ru = 'Добавлены'"));
	
	Результат.Вставить(НРег("Изменены"),
		НСтр("ru = 'Изменены'"));
	
	Результат.Вставить(НРег("Удалены"),
		НСтр("ru = 'Удалены'"));
	
	Результат.Вставить(НРег("Наименование"),
		НСтр("ru = 'Наименование'"));
	
	Результат.Вставить(НРег("ТекстШаблона"),
		НСтр("ru = 'Текст шаблона'"));
	
	// _$InfoBase$_.SecurityProfileChange
	Результат.Вставить(НРег("АдминистраторКластера"),
		НСтр("ru = 'Администратор кластера'"));
	
	Результат.Вставить(НРег("ДоступККриптографии"),
		НСтр("ru = 'Доступ к криптографии'"));
	
	Результат.Вставить(НРег("ДоступныеДляРасширенияМодули"),
		НСтр("ru = 'Доступные для расширения модули'"));
	
	Результат.Вставить(НРег("НедоступныеДляРасширенияМодули"),
		НСтр("ru = 'Недоступные для расширения модули'"));
	
	Результат.Вставить(НРег("ПолныйДоступКCOMОбъектам"),
		НСтр("ru = 'Полный доступ к COM-объектам'"));
	
	Результат.Вставить(НРег("ПолныйДоступКВнешнимКомпонентам"),
		НСтр("ru = 'Полный доступ к внешним компонентам'"));
	
	Результат.Вставить(НРег("ПолныйДоступКВнешнимМодулям"),
		НСтр("ru = 'Полный доступ к внешним модулям'"));
	
	Результат.Вставить(НРег("ПолныйДоступКВнешнимПриложениям"),
		НСтр("ru = 'Полный доступ к внешним приложениям'"));
	
	Результат.Вставить(НРег("ПолныйДоступКИнтернетРесурсам"),
		НСтр("ru = 'Полный доступ к интернет ресурсам'"));
	
	Результат.Вставить(НРег("ПолныйДоступКФайловойСистеме"),
		НСтр("ru = 'Полный доступ к файловой системе'"));
	
	Результат.Вставить(НРег("ПолныйПривилегированныйРежим"),
		НСтр("ru = 'Полный привилегированный режим'"));
	
	Результат.Вставить(НРег("ПрофильБезопасногоРежима"),
		НСтр("ru = 'Профиль безопасного режима'"));
	
	Результат.Вставить(НРег("РазрешитьВыполнениеВнешнегоКодаВНебезопасномРежиме"),
		НСтр("ru = 'Разрешить выполнение внешнего кода в небезопасном режиме'"));
	
	Результат.Вставить(НРег("РазрешитьРасширениеПравДоступа"),
		НСтр("ru = 'Разрешить расширение прав доступа'"));
	
	Результат.Вставить(НРег("РолиОграничивающиеРасширениеПравДоступа"),
		НСтр("ru = 'Роли ограничивающие расширение прав доступа'"));
	
	Результат.Вставить(НРег("РолиПривилегированногоРежима"),
		НСтр("ru = 'Роли привилегированного режима'"));
	
	Результат.Вставить(НРег("РазрешенныеCOMКлассы"),
		НСтр("ru = 'Разрешенные COM-классы'"));
	
	Результат.Вставить(НРег("РазрешенныеВиртуальныеКаталоги"),
		НСтр("ru = 'Разрешенные виртуальные каталоги'"));
	
	Результат.Вставить(НРег("ЗаписьРазрешена"),
		НСтр("ru = 'Запись разрешена'"));
	
	Результат.Вставить(НРег("Псевдоним"),
		НСтр("ru = 'Псевдоним'"));
	
	Результат.Вставить(НРег("ЧтениеРазрешено"),
		НСтр("ru = 'Чтение разрешено'"));
	
	Результат.Вставить(НРег("РазрешенныеВнешниеКомпоненты"),
		НСтр("ru = 'Разрешенные внешние компоненты'"));
	
	Результат.Вставить(НРег("РазрешенныеВнешниеМодули"),
		НСтр("ru = 'Разрешенные внешние модули'"));
	
	Результат.Вставить(НРег("РазрешенныеВнешниеПриложения"),
		НСтр("ru = 'Разрешенные внешние приложения'"));
	
	Результат.Вставить(НРег("РазрешенныеИнтернетРесурсы"),
		НСтр("ru = 'Разрешенные интернет-ресурсы'"));
	
	Результат.Вставить(НРег("Адрес"),
		НСтр("ru = 'Адрес'"));
	
	Результат.Вставить(НРег("Порт"),
		НСтр("ru = 'Порт'"));
	
	Результат.Вставить(НРег("Протокол"),
		НСтр("ru = 'Протокол'"));
	
	Результат.Вставить(НРег("РазрешитьУстановкуПривилегированногоРежима"),
		НСтр("ru = 'Разрешить установку привилегированного режима'"));
	
	// _$InfoBase$_.SessionLockChange*
	Результат.Вставить(НРег("КодРазрешения"),
		НСтр("ru = 'Код разрешения'"));
	
	Результат.Вставить(НРег("Конец"),
		НСтр("ru = 'Конец'"));
	
	Результат.Вставить(НРег("Параметр"),
		НСтр("ru = 'Параметр'"));
	
	Результат.Вставить(НРег("Сообщение"),
		НСтр("ru = 'Сообщение'"));
	
	Результат.Вставить(НРег("Установлена"),
		НСтр("ru = 'Установлена'"));
	
	// _$InfoBase$_.UserPasswordPolicy*
	Результат.Вставить(НРег("МаксимальныйСрокДействияПаролей"),
		НСтр("ru = 'Максимальный срок действия паролей'"));
	
	Результат.Вставить(НРег("МинимальныйСрокДействияПаролей"),
		НСтр("ru = 'Минимальный срок действия паролей'"));
	
	Результат.Вставить(НРег("МинимальнаяДлинаПаролей"),
		НСтр("ru = 'Минимальная длина паролей'"));
	
	Результат.Вставить(НРег("ОграничениеПовторенияПаролейСредиПоследних"),
		НСтр("ru = 'Ограничение повторения паролей среди последних'"));
	
	Результат.Вставить(НРег("ПроверкаСложностиПаролей"),
		НСтр("ru = 'Проверка сложности паролей'"));
	
	Результат.Вставить(НРег("СрокПредупрежденияОбИстеченииСрокаДействияПаролей"),
		НСтр("ru = 'Срок предупреждения об истечении срока действия паролей'"));
	
	Результат.Вставить(НРег("ДействиеПриНесоответствииПаролейТребованиямПриАутентификации"),
		НСтр("ru = 'Действие при несоответствии паролей требованиям при аутентификации'"));
	
	Результат.Вставить(НРег("ПроверкаРаскрытияПаролей"),
		НСтр("ru = 'Проверка раскрытия паролей'"));
	
	// _$OpenIDProvider$_.*
	Результат.Вставить(НРег("URLДоверяющейСтороны"),
		НСтр("ru = 'URL доверяющей стороны'"));
	
	// _$Session$_.Authentication*
	Результат.Вставить(НРег("ТекущийПользовательОС"),
		НСтр("ru = 'Текущий пользователь ОС'"));
	
	Результат.Вставить(НРег("СпособАутентификации"),
		НСтр("ru = 'Способ аутентификации'"));
	
	Результат.Вставить(НРег("КодДополненияИмениПользователя"),
		НСтр("ru = 'Код дополнения имени пользователя'"));
	
	Результат.Вставить(НРег("ИдентификаторПользователяПровайдераOpenID"),
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Идентификатор пользователя провайдера %1'"), "OpenID"));
	
	Результат.Вставить(НРег("ЭмитентТокенаДоступа"),
		НСтр("ru = 'Эмитент токена доступа'"));
	
	Результат.Вставить(НРег("ИдентификаторТокенаДоступа"),
		НСтр("ru = 'Идентификатор токена доступа'"));
	
	Результат.Вставить(НРег("URLПровайдераOpenID"),
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'URL провайдера %1'"), "OpenID"));
	
	// _$Session$_.ExternalDataProcessorConnect*
	Результат.Вставить(НРег("Путь"),
		НСтр("ru = 'Путь'"));
	
	Результат.Вставить(НРег("КодЯзыка"),
		НСтр("ru = 'Код языка'"));
	
	// _$Session$_.AddInAttach*
	Результат.Вставить(НРег("Местоположение"),
		НСтр("ru = 'Местоположение'"));
	
	Результат.Вставить(НРег("Тип"),
		НСтр("ru = 'Тип'"));
	
	Результат.Вставить(НРег("ТипПодключения"),
		НСтр("ru = 'Тип подключения'"));
	
	// _$User$_.*
	Результат.Вставить(НРег("АдресЭлектроннойПочты"),
		НСтр("ru = 'Адрес электронной почты'"));
	
	Результат.Вставить(НРег("АутентификацияOpenID"),
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Аутентификация %1'"), "OpenID"));
	
	Результат.Вставить(НРег("АутентификацияOpenIDConnect"),
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Аутентификация %1'"), "OpenID-Connect"));
	
	Результат.Вставить(НРег("АутентификацияQRКодом"),
		НСтр("ru = 'Аутентификация QR кодом'"));
	
	Результат.Вставить(НРег("АутентификацияОС"),
		НСтр("ru = 'Аутентификация ОС'"));
	
	Результат.Вставить(НРег("АутентификацияСтандартная"),
		НСтр("ru = 'Аутентификация 1С:Предприятия'"));
	
	Результат.Вставить(НРег("АутентификацияТокеномДоступа"),
		НСтр("ru = 'Аутентификация токеном доступа'"));
	
	Результат.Вставить(НРег("ДатаУстановкиПароля"),
		НСтр("ru = 'Дата установки пароля'"));
	
	Результат.Вставить(НРег("ЗапрещеноВосстанавливатьПароль"),
		НСтр("ru = 'Запрещено восстанавливать пароль'"));
	
	Результат.Вставить(НРег("ЗапрещеноИзменятьПароль"),
		НСтр("ru = 'Запрещено изменять пароль'"));
	
	Результат.Вставить(НРег("ЗащитаОтОпасныхДействий"),
		НСтр("ru = 'Защита от опасных действий'"));
	
	Результат.Вставить(НРег("Имя"),
		НСтр("ru = 'Имя'"));
	
	Результат.Вставить(НРег("ИмяПолитикиПаролей"),
		НСтр("ru = 'Имя политики паролей'"));
	
	Результат.Вставить(НРег("КлючиСопоставленияПользователя"),
		НСтр("ru = 'Ключи сопоставления пользователя'"));
	
	Результат.Вставить(НРег("НастройкиВторогоФактораАутентификации"),
		НСтр("ru = 'Настройки второго фактора аутентификации'"));
	
	Результат.Вставить(НРег("ОбработкаНастроекВторогоФактораАутентификации"),
		НСтр("ru = 'Обработка настроек второго фактора аутентификации'"));
	
	Результат.Вставить(НРег("ПарольИзменен"),
		НСтр("ru = 'Пароль изменен'"));
	
	Результат.Вставить(НРег("ПарольНеСоответствуетТребованиям"),
		НСтр("ru = 'Пароль не соответствует требованиям'"));
	
	Результат.Вставить(НРег("ПарольУстановлен"),
		НСтр("ru = 'Пароль установлен'"));
	
	Результат.Вставить(НРег("ПоказыватьВСпискеВыбора"),
		НСтр("ru = 'Показывать в списке выбора'"));
	
	Результат.Вставить(НРег("ПолноеИмя"),
		НСтр("ru = 'Полное имя'"));
	
	Результат.Вставить(НРег("ПользовательОС"),
		НСтр("ru = 'Пользователь ОС'"));
	
	Результат.Вставить(НРег("РежимЗапуска"),
		НСтр("ru = 'Режим запуска'"));
	
	Результат.Вставить(НРег("ОсновнойИнтерфейс"),
		НСтр("ru = 'Основной интерфейс'"));
	
	Результат.Вставить(НРег("Роли"),
		НСтр("ru = 'Роли'"));
	
	Результат.Вставить(НРег("ТипАлгоритмаХешированияПароля"),
		НСтр("ru = 'Тип алгоритма хеширования пароля'"));
	
	Результат.Вставить(НРег("Язык"),
		НСтр("ru = 'Язык'"));
	
	Результат.Вставить(НРег("Пользователи"),
		НСтр("ru = 'Пользователи'"));
	
	Результат.Вставить(НРег("РазделениеДанных"),
		НСтр("ru = 'Разделение данных'"));
	
	Возврат Результат;
	
КонецФункции

// Возвращаемое значение:
//  Булево
//
Функция ТолькоСтандартныеРазделители() Экспорт
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует(
			"СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда
		Возврат Ложь;
	КонецЕсли;
	
	МодульРаботаВМоделиСервисаБСП = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаБСП");
	
	Возврат МодульРаботаВМоделиСервисаБСП.ТолькоСтандартныеРазделители();
	
КонецФункции

Функция СписокЗначенийРазделителейИзСтроки(СтрокаРазделителей) Экспорт
	
	Список = Новый СписокЗначений;
	Значения = СтрРазделить(СтрокаРазделителей, ",");
	Список.ЗагрузитьЗначения(Значения);
	
	ЭлементСписка = Список.НайтиПоЗначению("");
	Если ЭлементСписка <> Неопределено Тогда
		ЭлементСписка.Представление = НСтр("ru = '<Не задано>'");
	КонецЕсли;
	
	Возврат Список;
	
КонецФункции

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

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

// Добавить ограничение в представление отбора.
//
// Параметры:
//  ОтборЖурналаРегистрации - Отбор - отбор журнала регистрации.
//  ПредставлениеОтбора - Строка - представление отбора.
//  ИмяОграничения - Строка - имя ограничения.
//  ОтборЖурналаРегистрацииПоУмолчанию - Отбор - отбор журнала регистрации по умолчанию.
//
Процедура ДобавитьОграничениеВПредставлениеОтбора(ОтборЖурналаРегистрации, ПредставлениеОтбора, ИмяОграничения,
	ОтборЖурналаРегистрацииПоУмолчанию = Неопределено)
	
	Если Не ОтборЖурналаРегистрации.Свойство(ИмяОграничения) Тогда
		Возврат;
	КонецЕсли;
	
	СписокОграничений = ОтборЖурналаРегистрации[ИмяОграничения];
	Ограничение       = "";
	
	// Не формируем представление отбора, если его значение соответствует значению отбора по умолчанию.
	Если ОтборЖурналаРегистрацииПоУмолчанию <> Неопределено Тогда
		СписокОграниченийПоУмолчанию = "";
		Если ОтборЖурналаРегистрацииПоУмолчанию.Свойство(ИмяОграничения, СписокОграниченийПоУмолчанию) Тогда
			Если ЗначениеВСтрокуВнутр(СписокОграниченийПоУмолчанию) = ЗначениеВСтрокуВнутр(СписокОграничений) Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ИмяОграничения = "Событие" И СписокОграничений.Количество() > 5 Тогда
		
		Ограничение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'События (%1)'"), СписокОграничений.Количество());
		
	ИначеЕсли ИмяОграничения = "Сеанс" И СписокОграничений.Количество() > 3 Тогда
		
		Ограничение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сеансы (%1)'"), СписокОграничений.Количество());
		
	Иначе
		
		Для Каждого ЭлементСписка Из СписокОграничений Цикл
			Если Не ПустаяСтрока(Ограничение) Тогда
				Ограничение = Ограничение + ", ";
			КонецЕсли;
			
			Если Не ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда
				ЗначениеОграничения = ЭлементСписка.Значение;
			Иначе
				ЗначениеОграничения = ЭлементСписка.Представление;
			КонецЕсли;
			
			Если (ВРег(ИмяОграничения) = ВРег("Сеанс")
				ИЛИ ВРег(ИмяОграничения) = ВРег("Уровень"))
				И ПустаяСтрока(Ограничение) Тогда
				
				Если ИмяОграничения = "Сеанс" Тогда
					ПредставлениеОграничения = НСтр("ru = 'Сеанс'");
				Иначе
					ПредставлениеОграничения = НСтр("ru = 'Уровень'");
				КонецЕсли;
				
				Ограничение = НСтр("ru = '%1: %2'");
				Ограничение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Ограничение, ПредставлениеОграничения, ЗначениеОграничения);
			Иначе
				Ограничение = Ограничение + ЗначениеОграничения;
			КонецЕсли;
		КонецЦикла;
		
	КонецЕсли;
	
	Если Не ПустаяСтрока(ПредставлениеОтбора) Тогда 
		ПредставлениеОтбора = ПредставлениеОтбора + "; ";
	КонецЕсли;
	
	ПредставлениеОтбора = ПредставлениеОтбора + Ограничение;
	
КонецПроцедуры

#Область ВспомогательныеПроцедурыИФункции

// Только для внутреннего использования.
//
Процедура УстановитьСтрокуДанных(СобытиеЖурнала)
	
	ДанныеСтрокой = ЗначениеВСтрокуВнутр(СобытиеЖурнала.Данные);
	УточненнаяСтрока = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ДанныеСтрокой);
	
	Если ДанныеСтрокой <> УточненнаяСтрока Тогда
		Попытка
			ЗначениеИзСтрокиВнутр(УточненнаяСтрока);
			ДанныеСтрокой = УточненнаяСтрока;
		Исключение
			ДанныеСтрокой = "";
		КонецПопытки;
	КонецЕсли;
	
	СобытиеЖурнала.ДанныеСтрокой = ДанныеСтрокой;
	
КонецПроцедуры

Функция УровеньСобытияПоПредставлению(ПредставлениеУровня)
	Если ПредставлениеУровня = "Информация" Тогда
		Возврат УровеньЖурналаРегистрации.Информация;
	ИначеЕсли ПредставлениеУровня = "Ошибка" Тогда
		Возврат УровеньЖурналаРегистрации.Ошибка;
	ИначеЕсли ПредставлениеУровня = "Предупреждение" Тогда
		Возврат УровеньЖурналаРегистрации.Предупреждение; 
	ИначеЕсли ПредставлениеУровня = "Примечание" Тогда
		Возврат УровеньЖурналаРегистрации.Примечание;
	КонецЕсли;	
КонецФункции

#КонецОбласти

#КонецОбласти