//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                                   Работа с INI файлами                                    |
//	+                                         ShmalevoZ                                         +
//	|                                          2007-11                                          |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

Перем гСекции;


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


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


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


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


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


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


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

