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

Перем мПлатформа Экспорт;
Перем мОписанияТиповПолей Экспорт;

Функция РеквизитыДляСервера(Параметры) Экспорт  
	
	Результат = ирОбщий.РеквизитыОбработкиЛкс(ЭтотОбъект);
	Возврат Результат;
	
КонецФункции

Функция ОбновитьИсториюДанных(Параметры) Экспорт 
	ирОбщий.СостояниеЛкс("Обновление истории данных");
	ИсторияДанныхМоя = ирОбщий.ИсторияДанныхЛкс();
	#Если Сервер И Не Сервер Тогда
		ИсторияДанныхМоя = ИсторияДанных;
	#КонецЕсли
	ИсторияДанныхМоя.ОбновитьИсторию();
	ирОбщий.СостояниеЛкс("");
КонецФункции

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

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

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

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

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

//.
// Параметры:
//    СтрокаПоля - ОбработкаТабличнаяЧастьСтрока.ирИсторияДанных.Поля - 
Процедура ОбновитьКолонкуИзмененоВСтрокеПоля(Знач СтрокаПоля) Экспорт
	СтрокаПоля.Изменено = СтрокаПоля.Использование <> СтрокаПоля.ИспользованиеВМетаданных;
КонецПроцедуры

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

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

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

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

мПлатформа = ирКэш.Получить();  
