//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                          Набор записей по движениям регистра                              |
//	+                                      ShmalevoZ                                            +
//	|                                       2009-10                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

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

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


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


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


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


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


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


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