﻿#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий
	
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Ссылка) И Ссылка.ПометкаУдаления <> ПометкаУдаления Тогда
		УстановитьАктивностьДвижений(Не ПометкаУдаления);
	ИначеЕсли ПометкаУдаления Тогда
		//запись помеченного на удаление документа с активными записями
		УстановитьАктивностьДвижений(Ложь);
	КонецЕсли;
	
	//Автозаполнение реквизитов Период и Организация
	Для каждого НаборЗаписей Из Движения Цикл
		
		Если НаборЗаписей.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли;
		
		ПустаяТаблица   = НаборЗаписей.ВыгрузитьКолонки();
		ЕстьОрганизация = ПустаяТаблица.Колонки.Найти("Организация") <> Неопределено;
		ЕстьПериод      = ПустаяТаблица.Колонки.Найти("Период") <> Неопределено;
		
		Если Не (ЕстьОрганизация Или ЕстьПериод) Тогда
			Продолжить;
		КонецЕсли;
		
		ТаблицаДвижений = НаборЗаписей.Выгрузить();
		Если ЕстьОрганизация Тогда
			ТаблицаДвижений.ЗаполнитьЗначения(Организация, "Организация");
		КонецЕсли;
		Если ЕстьПериод Тогда
			ТаблицаДвижений.ЗаполнитьЗначения(Дата, "Период");
		КонецЕсли;
		НаборЗаписей.Загрузить(ТаблицаДвижений);
		
		// Актуализируем списки регистров
		ИмяРегистра = НаборЗаписей.Метаданные().Имя;
		Если Метаданные.РегистрыНакопления.Содержит(НаборЗаписей.Метаданные()) Тогда
			ДобавитьРегистрНакопления(ИмяРегистра);
		ИначеЕсли Метаданные.РегистрыСведений.Содержит(НаборЗаписей.Метаданные()) Тогда
			ДобавитьРегистрСведений(ИмяРегистра);
		КонецЕсли;
		
	КонецЦикла;
	
	СинхронизироватьАктивностьДвиженийСПометкойУдаления();
КонецПроцедуры // ПередЗаписью()

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура УстановитьАктивностьДвижений(ФлагАктивности)
	
	Для Каждого Движение Из Движения Цикл   
		Движение.Прочитать();
		Для Каждого Строка Из Движение Цикл
			Строка.Активность = ФлагАктивности;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры // УстановитьАктивностьДвижений()

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

Процедура ДобавитьРегистрНакопления(ИмяРегистра)
	
	Если ТаблицаРегистровНакопления.Найти(ИмяРегистра, "Имя") = Неопределено Тогда
		ТаблицаРегистровНакопления.Добавить().Имя = ИмяРегистра;
	КонецЕсли;
	
КонецПроцедуры
		
Процедура ДобавитьРегистрСведений(ИмяРегистра)
	
	Если ТаблицаРегистровСведений.Найти(ИмяРегистра, "Имя") = Неопределено Тогда
		ТаблицаРегистровСведений.Добавить().Имя = ИмяРегистра;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#КонецЕсли
