//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                      Абстрактный набор записей журнала расчетов                           |
//	+                                      ShmalevoZ                                            +
//	|                                       2009-11                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//---------------------------------------------------------------------------------------------
// Собственные атрибуты
Перем гИдентификаторЖурналаРасчетов;

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


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


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


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


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


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


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


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