//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                             Описание абстрактной записи                                   |
//	+                                      ShmalevoZ                                            +
//	|                                       2008-11                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//---------------------------------------------------------------------------------------------
// Собственные атрибуты
Перем гДанные;
Перем гСписокДобавленныхАтрибутов;


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


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


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

КонецПроцедуры // Конструктор()


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


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

	я().ДобавитьДинамическоеСвойство(Идентификатор);
	гСписокДобавленныхАтрибутов.ДобавитьЗначение(Индекс);
	
	гДанные.НоваяСтрока();
	гДанные.Индекс			= Индекс;
	гДанные.Идентификатор	= Идентификатор;
	гДанные.Значение		= Значение;
	
КонецПроцедуры // ДобавитьАтрибут()


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


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


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


//******************************************************************************
// КоличествоАтрибутов()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Число
//
// Описание:
//  Возвращает количество атрибутов
//
Функция КоличествоАтрибутов() Экспорт
	
	Возврат гДанные.КоличествоСтрок();
	
КонецФункции // КоличествоАтрибутов()


//******************************************************************************
// СуществуетАтрибут(НомерИдентификатор)
//
// Параметры: 
//  НомерИдентификатор		- искомое
//
// Возвращаемое значение:
//  Число					- статус существования
//
// Описание:
//  Проверяет существования атрибута
//
Функция СуществуетАтрибут(НомерИдентификатор) Экспорт
	
	Результат	= Мин(1, ПолучитьНомерАтрибута(НомерИдентификатор));
	
	Возврат Результат;
КонецФункции // СуществуетАтрибут()


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


//******************************************************************************
// _ПриЗаписиСвойства(Идентификатор, Значение)
//
// Параметры: 
//  Идентификатор
//  Значение
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Устанавливает значение атрибута
//
Процедура _ПриЗаписиСвойства(Идентификатор, Значение) Экспорт
	
	_this().УстановитьАтрибут(Идентификатор, Значение);
	
КонецПроцедуры // _ПриЗаписиСвойства()


//******************************************************************************
// _ПриЧтенииСвойства(Идентификатор)
//
// Параметры: 
//  Идентификатор
//
// Возвращаемое значение:
//  Значение атрибута
//
// Описание:
//  ТекстОписания
//
Функция _ПриЧтенииСвойства(Идентификатор) Экспорт
	
	Возврат _this().ПолучитьАтрибут(Идентификатор);
	
КонецФункции // _ПриЧтенииСвойства()
