//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                           Абстрактная запись справочника                                  |
//	+                                      ShmalevoZ                                            +
//	|                                       2009-10                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//---------------------------------------------------------------------------------------------
// Собственные атрибуты
Перем гИдентификатор;
Перем гДатаАктуальности;
Перем гТаблицаАтрибутов;

//******************************************************************************
// _НормализоватьКонтекст(СсылкаКонтекст)
//
// Параметры: 
//  СсылкаКонтекст			: контекст класса
//
// Возвращаемое значение:
//  Ссылка					: возвращает ссылку на контекст класса
//
// Описание:
//  Возвращает ссылку на контекст класса
//
Функция _НормализоватьКонтекст(СсылкаКонтекст)
	
	Возврат СсылкаКонтекст;
	
КонецФункции // _НормализоватьКонтекст()


//******************************************************************************
// _this()
//
// Параметры: 
// 	Нет
//
// Возвращаемое значение:
//  Ссылка					: возвращает ссылку на контекст класса
//
// Описание:
//  Возвращает ссылку на контекст класса
//
Функция _this()
	
	Возврат _НормализоватьКонтекст(Контекст);
	
КонецФункции // _this()


//******************************************************************************
// ВыброситьОшибку(Текст)
//
// Параметры: 
//  Текст					- текст сообщения
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Выбрасывает ошибку времени выполнения
//
Процедура ВыброситьОшибку(Текст)
	
	_this()._ВыброситьИскл(Текст);
	
КонецПроцедуры // ВыброситьОшибку()


//******************************************************************************
// Конструктор()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Предопределенный метод
//
Процедура Конструктор()
	
	гИдентификатор		= "";
	гДатаАктуальности	= РабочаяДата();
	гТаблицаАтрибутов	= СоздатьОбъект("ТаблицаЗначений");
	гТаблицаАтрибутов.НоваяКолонка("Идентификатор");
	гТаблицаАтрибутов.НоваяКолонка("Периодический");
	
КонецПроцедуры // Конструктор()


//******************************************************************************
// ИспользоватьСправочник(Вид = "")
//
// Параметры: 
//  Вид = ""
//
// Возвращаемое значение:
//  Идентификатор используемого справочника
//
// Описание:
//  Возвращает идентификатор используемого справочника на момент до выполнения метода. Устанавливиает новый.
//
Функция ИспользоватьСправочник(Вид = "") Экспорт
	
	Результат	= гИдентификатор;
	
	Если ПустаяСтрока(Вид) = 0 Тогда
		Если Метаданные.Справочник(Вид).Выбран() = 0 Тогда
			ВыброситьОшибку("В конфигурации не определен справочника вида " + Вид);
		КонецЕсли;
		гИдентификатор		= Вид;
		гТаблицаАтрибутов.УдалитьСтроки();
		МетаСправочник		= Метаданные.Справочник(Вид);
		Количество			= МетаСправочник.Реквизит();
		
		гТаблицаАтрибутов.НоваяСтрока("Код");
		гТаблицаАтрибутов.НоваяСтрока("Наименование");
		
		Для Номер = 1 По Количество Цикл
			МетаРеквизит	= МетаСправочник.Реквизит(Номер);
			гТаблицаАтрибутов.НоваяСтрока();
			гТаблицаАтрибутов.Идентификатор	= МетаРеквизит.Идентификатор;
			гТаблицаАтрибутов.Периодический	= МетаРеквизит.Периодический;
		КонецЦикла;
		
		гТаблицаАтрибутов.ВыбратьСтроки();
		Пока гТаблицаАтрибутов.ПолучитьСтроку() = 1 Цикл
			_this().ДобавитьАтрибут(гТаблицаАтрибутов.Идентификатор);
		КонецЦикла;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции // ИспользоватьСправочник()


//******************************************************************************
// Прочитать(Ссылка)
//
// Параметры: 
//  Ссылка
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Считывает атрибуты ссылки в атрибуты записи
//
Процедура Прочитать(Ссылка) Экспорт
	
	Если ПустаяСтрока(гИдентификатор) = 1 Тогда
		ИспользоватьСправочник(Ссылка.Вид());
	КонецЕсли;
	
	ДатаАктуальностиСсылки	= Ссылка.ИспользоватьДату();
	Ссылка.ИспользоватьДату(гДатаАктуальности);
	
	гТаблицаАтрибутов.ВыбратьСтроки();
	Пока гТаблицаАтрибутов.ПолучитьСтроку() = 1 Цикл
		
		Значение	= "";
		Если гТаблицаАтрибутов.Идентификатор = "Код" Тогда
			Значение	= Ссылка.Код;
		ИначеЕсли гТаблицаАтрибутов.Идентификатор = "Наименование" Тогда
			Значение	= Ссылка.Наименование;
		Иначе
			Значение	= Ссылка.ПолучитьАтрибут(гТаблицаАтрибутов.Идентификатор);
		КонецЕсли;
		
		_this().УстановитьАтрибут(гТаблицаАтрибутов.Идентификатор, Значение);;
	КонецЦикла;
	
	Ссылка.ИспользоватьДату(ДатаАктуальностиСсылки);
	
КонецПроцедуры // Прочитать()


//******************************************************************************
// Записать(Ссылка)
//
// Параметры: 
//  Ссылка
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  
//
Процедура Записать(Ссылка) Экспорт
	
	Если ПустаяСтрока(гИдентификатор) = 1 Тогда
		ВыброситьОшибку("Не определен вид используемого справочника !");
	КонецЕсли;
	
	ДатаАктуальностиСсылки	= Ссылка.ИспользоватьДату();
	Ссылка.ИспользоватьДату(гДатаАктуальности);
	
	гТаблицаАтрибутов.ВыбратьСтроки();
	Пока гТаблицаАтрибутов.ПолучитьСтроку() = 1 Цикл
		Значение	= _this().ПолучитьАтрибут(гТаблицаАтрибутов.Идентификатор);
		Если гТаблицаАтрибутов.Идентификатор = "Код" Тогда
			Ссылка.Код	= Значение;
		ИначеЕсли гТаблицаАтрибутов.Идентификатор = "Наименование" Тогда
			Ссылка.Наименование	= Значение;
		Иначе
			Ссылка.УстановитьАтрибут(гТаблицаАтрибутов.Идентификатор, Значение);
		КонецЕсли;
	КонецЦикла;
	
	Ссылка.ИспользоватьДату(ДатаАктуальностиСсылки);
	
КонецПроцедуры // Записать()


//******************************************************************************
// ИспользоватьДату(ДатаАктуальности)
//
// Параметры: 
//  ДатаАктуальности
//
// Возвращаемое значение:
//  Дата
//
// Описание:
//  Возвращает/устанавливает значение даты актуальности
//
Функция ИспользоватьДату(ДатаАктуальности = "") Экспорт
	
	Результат	= гДатаАктуальности;
	Если ПустоеЗначение(ДатаАктуальности) = 0 Тогда
		гДатаАктуальности	= Дата(ДатаАктуальности);
	КонецЕсли;
	
	Возврат Результат;
КонецФункции // ИспользоватьДату()
