//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                              Абстрактный набор записей                                    |
//	+                                      ShmalevoZ                                            +
//	|                                       2009-10                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//---------------------------------------------------------------------------------------------
// Собственные атрибуты
Перем гТаблицаЗаписей;	// все записи набора
Перем гНомерЗаписи;		// номер текущей в выборке
Перем гНаборСоздан;		// флаг того, что набор уже создан
Перем гСписокАтрибутов;	// список атрибутов набора


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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

	ОчиститьАтрибутыНабора();
	
КонецПроцедуры // ВКонец()


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


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