// для ображения к элементам коллекции по имени
Перем гИдентификаторАтрибутаИндекс;
Перем гКоллекция;


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


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


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


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


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


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


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


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


//******************************************************************************
// Удалить(НомерИндекс)
//
// Параметры: 
//  НомерИндекс
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  ТекстОписания
//
Процедура Удалить(НомерИндекс) Экспорт
	
	НомерСтроки	= ПолучитьНомерЭлемента(НомерИндекс);
	гКоллекция.УдалитьСтроку(НомерСтроки);
	
КонецПроцедуры // Удалить()


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


//******************************************************************************
// ИспользоватьИндекс(Идентификатор)
//
// Параметры: 
//  Идентификатор
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  ТекстОписания
//
Процедура ИспользоватьИндекс(Идентификатор) Экспорт

	гИдентификаторАтрибутаИндекс	= СокрЛП(Идентификатор);

	Если ПустаяСтрока(Идентификатор) = 0 Тогда
		гКоллекция.ВыбратьСтроки();
		Пока гКоллекция.ПолучитьСтроку() = 1 Цикл
			ИндексироватьСтрокуКоллекции();
		КонецЦикла;
	Иначе
		гКоллекция.Заполнить("", , , "Индекс");
	КонецЕсли;
	
КонецПроцедуры // ИспользоватьИндекс()


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


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


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


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