Перем _Тип Экспорт;

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

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

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

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

Функция КлючОбъекта()
	
	Результат = Неопределено;
	Возврат Результат;
	
КонецФункции

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

Процедура Прочитать(НаСервере = Неопределено, Блокировать = Истина) Экспорт 
	
	ОбъектБД = Метаданные.НайтиПоТипу(_Тип);
	ПолноеИмяМД = ОбъектБД.ПолноеИмя();
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ Т.* ИЗ " + ПолноеИмяМД + " КАК Т";
	Если Блокировать Тогда
		ирОбщий.ЗаблокироватьКонстантуЛкс(ЭтотОбъект, Истина, РежимБлокировкиДанных.Разделяемый);
	КонецЕсли; 
	ЗаполнитьЗначенияСвойств(Данные, Запрос.Выполнить().Выгрузить()[0]);

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

Функция Записать() Экспорт
	
	#Если Не Сервер Тогда
		Снимок = Снимок();
		ирСервер.ЗаписатьОбъектXMLЛкс(Снимок,,,,,, ТипЗнч(ЭтотОбъект));
		ЗагрузитьСнимок(Снимок);
	#Иначе
		ОбъектБД = ОбъектБД();
		ОбъектБД.Записать();
		Конструктор(ОбъектБД);
	#КонецЕсли 
	
КонецФункции

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	ОбъектБД = ОбъектБД();
	Отказ = Не ОбъектБД.ПроверитьЗаполнение();
	Конструктор(ОбъектБД);
	
КонецПроцедуры

Функция ДанныеВСтрокуXMLЧерезXDTO(Знач ИспользоватьXDTO = Истина, ВызыватьИсключение = Истина) Экспорт
	
	#Если Не Сервер Тогда
		Снимок = Снимок(Истина);
		Результат = ирСервер.ОбъектБДИзИмитатораВСтрокуXMLЛкс(Снимок, ТипЗнч(ЭтотОбъект), ИспользоватьXDTO, ВызыватьИсключение);
	#Иначе
		ОбъектБД = ОбъектБД();
		Результат = ирОбщий.СохранитьОбъектВВидеСтрокиXMLЛкс(ОбъектБД, ИспользоватьXDTO, , ВызыватьИсключение);
	#КонецЕсли 
	Возврат Результат;
	
КонецФункции

Процедура ДанныеИзСтрокиXMLЧерезXDTO(СтрокаXML, Знач ИспользоватьXDTO = Истина, СообщатьОбОшибках = Истина) Экспорт
	
	#Если Не Сервер Тогда
		Снимок = ирСервер.ОбъектБДВИмитаторИзСтрокиXML(СтрокаXML, ТипЗнч(ЭтотОбъект), ИспользоватьXDTO, СообщатьОбОшибках);
		ЗагрузитьСнимок(Снимок);
	#Иначе
		ОбъектБД = ирОбщий.ВосстановитьОбъектИзСтрокиXMLЛкс(СтрокаXML,, ИспользоватьXDTO, СообщатьОбОшибках);
		Конструктор(ОбъектБД);
	#КонецЕсли 
	
КонецПроцедуры
