//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                      Статический объект параметров объектов                               |
//	+                                      ShmalevoZ                                            +
//	|                                       2008-11                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//---------------------------------------------------------------------------------------------
// Собственные атрибуты
Перем гПараметрыГлобальные, гПараметрыКонфигурации, гПараметрыПользователя;


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


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


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


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


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


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


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


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


//******************************************************************************
// ПолучитьСписокАтрибутов(Секция)
//
// Параметры: 
//  Секция					- строка, искомая секция
//
// Возвращаемое значение:
//  СписокЗначений			- список атрибутов, принадлежащих секции
//
// Описание:
//  Возвращает список атрибутов, принадлежащих секции
//
Функция ПолучитьСписокАтрибутов(Секция) Экспорт
	
	Результат	= СоздатьОбъект("СписокЗначений");
	ЗаполнитьСписокАтрибутов(Результат, гПараметрыГлобальные, Секция);
	ЗаполнитьСписокАтрибутов(Результат, гПараметрыКонфигурации, Секция);
	ЗаполнитьСписокАтрибутов(Результат, гПараметрыПользователя, Секция);
	
	Возврат Результат;
КонецФункции // ПолучитьСписокАтрибутов()


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


//******************************************************************************
// Сохранить()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Сохраняет параметры на диск
//
Процедура Сохранить() Экспорт
	
	СохранитьЗначенияВФайл(КаталогИБ() + "global.ini",			гПараметрыГлобальные);
	СохранитьЗначенияВФайл(КаталогИБ() + "ib.ini",				гПараметрыКонфигурации);
	СохранитьЗначенияВФайл(КаталогПользователя() + "user.ini",	гПараметрыПользователя);
	
КонецПроцедуры // Сохранить()


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


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


//******************************************************************************
// Восстановить()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Число					- успех выполнения
//
// Описание:
//  Восстанавливает ранее сохраненные значения
//
Функция Восстановить() Экспорт
	
	Результат	= 1;
	
	гПараметрыГлобальные	= ПолучитьСтруктуруТаблицыПараметров();
	гПараметрыКонфигурации	= ПолучитьСтруктуруТаблицыПараметров();
	гПараметрыПользователя	= ПолучитьСтруктуруТаблицыПараметров();
	
	ЗагрузитьЗначенияФайла(КаталогИБ() + "global.ini",			гПараметрыГлобальные);
	ЗагрузитьЗначенияФайла(КаталогИБ() + "ib.ini", 				гПараметрыКонфигурации);
	ЗагрузитьЗначенияФайла(КаталогПользователя() + "user.ini",	гПараметрыПользователя);
	
	Возврат Результат;
КонецФункции // Восстановить()


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


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